Olá pessoal, voltamos a falar sobre o Cubo de LED's, mas hoje não vamos abordar aquilo que se chuta (Hardware) , mas sim aquilo que se ofende com palavras de baixo calão (Software), segue trecho de código para PIC18F242 que contaremos a seguir:
#include <18f242.h>
#include <stdio.h>
#use delay (clock=400000)
int a, b, c, d;
void linha( ){
b=0b00001;
for(a=0; a<5; a++){
d=c & b;
if(d>0){
output_high(pin_b7); //dado
delay_ms(1);
output_high(pin_b6); //clock
delay_ms(1);
output_low(pin_b6); //clock
delay_ms(1);
}else{
output_low(pin_b7); //dado
delay_ms(1);
output_high(pin_b6); //clock
delay_ms(1);
output_low(pin_b6); //clock
delay_ms(1);
}
if(a==0){b=0b00010;}
if(a==1){b=0b00100;}
if(a==2){b=0b01000;}
if(a==3){b=0b10000;}
}
}
void coluna( ){
output_c(0b11111110);
delay_ms(1000);
output_c(0b11111101);
delay_ms(1000);
output_c(0b11111011);
delay_ms(1000);
output_c(0b11110111);
delay_ms(1000);
output_c(0b11101111);
delay_ms(1000);
output_a(0xff); // desliga todo PORTA
}
void t( ){
c=0b11111;
linha( );
c=0b00100;
linha( );
c=0b00100;
linha( );
c=0b00100;
linha( );
c=0b00100;
linha( );
coluna( );
}
void e( ){
c=0b11111;
linha( );
c=0b00001;
linha( );
c=0b11111;
linha( );
c=0b00001;
linha( );
c=0b11111;
linha( );
coluna( );
}
void s( ){
c=0b11111;
linha( );
c=0b00001;
linha( );
c=0b11111;
linha( );
c=0b10000;
linha( );
c=0b11111;
linha( );
coluna( );
}
void main( ){
output_a(0x00); // desliga todo PORTB
output_b(0x00); // desliga todo PORTB
output_c(0xff); // desliga todo PORTA
output_high(pin_b7); //bit erro
delay_ms(1);
output_high(pin_b6); //clock
delay_ms(1);
output_low(pin_b6); //clock
delay_ms(1);
while(true){
t( );
e( );
s( );
t( );
e( );
}
}
Lembro que este programa acima é apenas para teste, existem métodos para tornar o código mais "simples", mas para a nossa finalidade este serve. Vamos em partes agora, primeiramente declaramos as variáveis globais que serão usadas (Repito que este código é didático, de preferência sempre se se exclui a opção de variável global) , em seguida temos as "void's" (trechos de sub-rotina do programa principal) que executarão as seguintes funções:
void linha( ): Pega a informação contida em cada linha declarada para formar a imagem (No nosso caso letra) e transforma em uma informação serial que será jogado para nosso barramento serial/paralelo (Comentado na postagem anterior sobre o assunto).
void coluna( ): Desloca a imagem formada na primeira "face" (Também comentado na postagem anterior sobre o assunto) para as "faces" posteriores, deslocando a imagem (Área) dentro do cubo.
void "t,e,s"( ): Como o próprio nome sugere, estas "void's" geram as faces correspondentes aos caracteres T,E,S para formar a palavra "TESTE", vale ressaltar que este software não gera uma imagem tridimensional, apenas gera letra por letra e as deslocam da parte frontal para a posterior do cubo, para podermos ver o cubo trabalhando. Optei por destrinchar a "face" em linhas pare ser mais visível o conceito de construção da mesma e por ocupar menor espaço de memória, notem que apesar de estar dividido em cinco linhas cada letra na verdade a informação de saída será um único trecho de código serial. A imagem a seguir talvez ajude a visualizar:
Notem que a sequencia de linhas forma a letra "T" que queremos gerar e em seguida chama a função "coluna" para deslocar esta letra por dentro do cubo.
void main( ): Inicializa o barramento e implementa o "loop" que escreverá a palavra "TESTE" no nosso cubo de LED's.
Voltando ao hardware, não entrei em detalhes mais relevantes porque o circuito é genérico, depende da aplicação e das dimensões que queira produzir o cubo, porem não foge do material básico, um controlador (um "PIC", por exemplo, com uma ROM de no mínimo 7KB), um conversor serial/paralelo (Aconselho que possua "Buffer") como o "STP16CP05", uma fonte 12Vdc, muitos LED's e uma estrutura mecânica.
Espero que tenham gostado, uma grande abraço.

Nenhum comentário:
Postar um comentário