PIC: Texto Rolante com Matriz de Leds
Como muitos pediram, vou mostrar como se consegue fazer um texto se mover usando uma matriz de LEDs 8x8.
O circuito é simples, apenas uma matriz 8x8 e resistores. Para essa matriz da biblioteca do Proteus, você deve setar um pino da coluna(entradas inferior) e as saídas da PORTB corresponde a um led da coluna.
Vou disponibilizar a fonte de texto para essa matriz.
Cada letra da fonte é formado por 8 bytes, cada um corresponde a um segmento vertical.
Para poder rolar um texto, observe que necessita de 2 caracteres. Então precisamos armazenar esse dois caracteres em uma variável(ou buffer).
Ficaria assim para entender melhor:
texto a escrever: "0123456789"
armazenar no buffer "01", depois "12", depois "23", depois "34", e assim por diante.
depois de armazenado, temos que exibi-lo na matriz.
Esse código escreve na matriz:
for(k=0;k<8;k++){ //primeiro loop
for(cnt=60;cnt>0;cnt--){ //mantem o caracter sendo exibido por um determinado tempo
for(i=0;i<8;i++){ //escreve os 8 bytes do buffer para formar o caracter
rowPort=255;
colPort = 1<<(i);
rowPort = ~buff[i + k];
delay_us(125);
}
}
}
Imagine que no buffer[] tenha seguinte valores 120, 45, 67, 78, 79, 5, 13, 15, 14, 48, 56, 67, 54, 134, 14, 9.
então dentro do primeiro loop, o buffer "deslocará", de acordo com a variavel "k". Então a cada loop(3º loop) exibirá buff[0] ao buff[8], depois buff[1] ao buff[9], e assim por diante.
Não sei se expliquei o funcionamento da maneira correta, mas espero que tenham gostado.
O codigo possui duas funções: scroll_text() e print_chr().
Caso queira editar o código, crie um novo projeto no MikroC e adicione o arquivo FONT.h ao projeto.
DOWNLOAD:
projeto: Matriz.zip;
CÓDIGO-FONTE:
#include "FONT.c" char colPort at PORTD; char rowPort at PORTB; char buff[24];//local para armazenar dois caracteres void print_chr(char c, char time) { char i; while(time--) { for(i=0;i<8;i++) { rowPort = 255; colPort = 1<<(i); rowPort = ~Font8x8[c - 32][i]; delay_us(90); } } } void scroll_text(char *str) { char i; char k;//deslocamento no buffer char cnt; while(*(str+1) != 0) { for(i=0;i<16;i++) { if(i<8) *(buff+i) = Font8x8[*(str) - 32][i]; else *(buff+i) = Font8x8[*(str+1) - 32][i-8]; } for(k = 0;k < 8;k++) { for(cnt = 60; cnt > 0; cnt--) { for(i=0;i<8;i++) { rowPort=255; colPort = 1<<(i); rowPort = ~buff[i+k]; delay_us(125); } } } str++; } rowPort = 255; colPort = 0; } void main() { TRISD = 0; TRISB = 0; colPort = 0; rowPort = 0; while(1) { scroll_text(" 1234 "); delay_ms(500); scroll_text(" 0000 "); delay_ms(500); } }
Boa tarde Tiago, PARABÉNS!!!!!!
ResponderExcluirSimplismente D+.
Caraca, que rapidez !!! Parabéns!!! eu que comentei na matriz com arduino, pedindo isso, e ta ai, muito bom cara, parabéns mesmo, isso vai me ajudar demais...Obrigado!!!
ResponderExcluirmuito bom msm valeu
ExcluirDe modo sem querer abusar, mas quanto a uma matriz usando registradores de deslocamentos(74hc164,74hc595) e driver ULN2003, com o painel montado com leds mesmo de 5mm, coisa tipo 8 linhas por 30 colunas, e muito complicado fazer?? sera que você não pode me passar umas dicas por email, e que preciso usar esses componentes no projeto. Valeu, obrigado.
ResponderExcluirBom dia Tiago!
ResponderExcluirCom base na questão levantada sobre registradores de deslocamento, você poderia preparar um tutorial sobre o assunto para não ficar muito cansativo, também tenho interesse em saber trabalhar com estes componentes, mas acho que o primordial é saber como funciona e como configurar. O projeto do CIS é o mesmo que eu gostaria de montar.
Vamos nós de novo!!! Eu tentei implementar no circuito do proteus mais uma matriz, e fazer a varredura da colunas usando dois CI74164,mas me perdi na logica e não soube onde mudar no codigo para obter o resultado dos numeros rodando em duas matrizes. Se não for pedir muito, você dar "mais" umas dicas Tiago???
ResponderExcluirValeu!!!
Veja que agora voce tera q armazenar no buffer 3 caracteres. E tbm q o numero de colunas agora é 16. entao em vez de escrever 8 bytes voce tera q escrever 16 bytes. tera q aumentar o valor da variavel do loop e o tamanho do buffer
ResponderExcluirJa fez algum projeto usando sensores de temperatura, distancia e umidade ??? e apresentando a leitura desses sensores numa matriz de leds ??? Fica essa ideia para futuros posts...
ResponderExcluirFaz alguma coisa referente a cubo de leds. Você explica bem, parabéns
ResponderExcluirCara seu site é muito bom. Eu gostaria de pedir caso a você tenha um projeto de um relógio digital usando 4 display de 7 segmetos e com ajuste para hora e minuto em linguagem C.
ResponderExcluirAgradeço muito se você poder me ajudar, pois só sei o básico sobre microcontroladores pic.
http://microcontrolandos.blogspot.com.br/2012/12/relogio-e-calendario-digital-com-rtc.html
Excluiralguem tem ideia de como fazer isto só que em assembly??????
ResponderExcluirola!! como vai?? gostei dessa ideia! mas nao to conseguindo fazer esse codigo funcionar
ResponderExcluirtentei compilar no CCS mas nao ta dando certo!! eu so fiz uma alteraçao minima no trecho onde vc colocou " #include "FONT.c" " para "#include " presumindo que houve erro na sintaxe o que levou a compilaçao falhar, mas o CCS me mostra uma serie de erros no codigo FONT.c.
eu sou iniciante com a linguagem C e tenho muitas duvidas e pra mim é desafiador entender um codigo como esse que vc escreveu!! entendi algumas coisas mas ainda ta muito vago!!! tem como me ajudar?? desde ja grato!!!!!
O código foi compilado no MikroC PRO PIC.
Excluirentao se eu compilar esse mesmo codigo no CCS nao vai dar??
ResponderExcluirentao meu caro!!! eu fiz o download do microc mas o resultado foi o mesmo que o CCS apresentou!!
ResponderExcluiro codigo que ce falou pra adcionar e "font.c" ou "font.h"? pois o que veio na pasta zipada que vc disponibilizou ta ".c"
e mais uma coisa, a sintaxe do codigo começa assim?
const code char Font8x8[][8]= {
{ 0, 0, 0, 0, 0, 0, 0, 0}, //' '
{0, 0, 6, 95, 95, 6, 0, 0}, //'!'
{ 0, 7, 7, 0, 7, 7, 0, 0}, //'"'
{20, 127, 127, 20, 127, 127, 20, 0}, //'#'
{0, 36, 46, 107, 107, 58, 18, 0}, //'$'
{70, 102, 48, 24, 12, 102, 98, 0}, //'%'
{48, 122, 79, 93, 55, 122, 72, 0}, //'&'
{0, 0, 4, 7, 3, 0, 0, 0}, //'''
{ 0, 28, 62, 99, 65, 0, 0, 0}, //'('
{ 0, 65, 99, 62, 28, 0, 0, 0}, //')'
{ 8, 42, 62, 28, 28, 6...................................
pq se for o caso de ser assim mesmo era pra ter dado certo no CCS tbm!!
se tiver como me dar essa moral ai ficaria muito agradecido!! valew!!!
Você deve adicionar o arquivo ao seu projeto. Vá em Project | Add File to Project
Excluirgostei mto desse trabalho...mas não entendi direito a explicação...além q eu queria fazer um pra brincar mas eu queria com mais de uma matriz..teria como vcs colocarem o exemplo de novo só q com mais de 1 matriz só pra mim ver como é??? vlw
ResponderExcluiragradeço
boa noite estou fazendo um projeto pra escola e preciso programar um PIC 16F84A para fazer acender os LEDs e tocar as notas musicais ou uma musica em que os LEDs acedam no ritimo alguem pode dar uma ajuda eu tenho no meu pc o mikrobasic e o proteus
ResponderExcluirvc faz projetos com pic16f877 sob encomenda? preciso de um que use 8 painéis led matriz 8x8 para texto rolante e alguns efeitos para uma banda email ifurtado@r7.com
ResponderExcluirParabéns pela iniciativa e muito obrigado pelas dicas!
ResponderExcluirUm grande abraço!
Jacson Santana.