Fork me on GitHub

10/04/13

PIC: Texto Rolante com Matriz de Leds

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);
}
}

21 comentários:

  1. Boa tarde Tiago, PARABÉNS!!!!!!

    Simplismente D+.

    ResponderExcluir
  2. 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!!!

    ResponderExcluir
  3. De 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.

    ResponderExcluir
  4. Bom dia Tiago!

    Com 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.

    ResponderExcluir
  5. 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???
    Valeu!!!

    ResponderExcluir
  6. 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

    ResponderExcluir
  7. Ja 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...

    ResponderExcluir
  8. Faz alguma coisa referente a cubo de leds. Você explica bem, parabéns

    ResponderExcluir
  9. Cara 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.

    Agradeço muito se você poder me ajudar, pois só sei o básico sobre microcontroladores pic.

    ResponderExcluir
  10. alguem tem ideia de como fazer isto só que em assembly??????

    ResponderExcluir
  11. ola!! como vai?? gostei dessa ideia! mas nao to conseguindo fazer esse codigo funcionar
    tentei 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!!!!!

    ResponderExcluir
  12. entao se eu compilar esse mesmo codigo no CCS nao vai dar??

    ResponderExcluir
  13. entao meu caro!!! eu fiz o download do microc mas o resultado foi o mesmo que o CCS apresentou!!
    o 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!!!

    ResponderExcluir
    Respostas
    1. Você deve adicionar o arquivo ao seu projeto. Vá em Project | Add File to Project

      Excluir
  14. gostei 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
    agradeço

    ResponderExcluir
  15. 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

    ResponderExcluir
  16. vc 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

    ResponderExcluir
  17. Parabéns pela iniciativa e muito obrigado pelas dicas!
    Um grande abraço!
    Jacson Santana.

    ResponderExcluir

Postagens Relacionadas!!