terça-feira, julho 24, 2012

Display JY-MCU3208: Escrevendo Caracteres

Agora que já sabemos como alterar um ponto no display, vamos fazer uma rotina simples de escrita de caracteres.


Para esta experiência, vamos escrever apenas dígitos, usando uma matriz de 5x7 pontos.
  1. // Matriz de Caracteres 5x7  
  2. // Contem os dígitos de 0 a 9  
  3. uint8_t digitos [10][7] PROGMEM =  
  4. {  
  5.     { 0x0E, 0x11, 0x15, 0x15, 0x15, 0x11, 0x0E },  
  6.     { 0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x1F },  
  7.     { 0x0E, 0x11, 0x02, 0x04, 0x08, 0x10, 0x1F },  
  8.     { 0x0E, 0x11, 0x01, 0x06, 0x01, 0x11, 0x0E },  
  9.     { 0x11, 0x11, 0x11, 0x1F, 0x01, 0x01, 0x01 },  
  10.     { 0x1F, 0x10, 0x10, 0x1E, 0x01, 0x11, 0x0E },  
  11.     { 0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E },  
  12.     { 0x1F, 0x11, 0x01, 0x02, 0x04, 0x04, 0x04 },  
  13.     { 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E },  
  14.     { 0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C }  
  15. };  
O PROGMEM no código acima indica que a matriz deve ser colocada na Flash. A rotina de escrita do caracter não tem muito segredo, basta usar corretamente a função pgm_read_byte para ler os dados na Flash.
  1. // Mostra o digito d a partir da posição x  
  2. static void display (uint8_t x, uint8_t d)  
  3. {  
  4.     uint8_t i, y, mask, gc;  
  5.       
  6.     for (y = 0; y < 7; y++)  
  7.     {  
  8.         gc = pgm_read_byte(&(digitos[d][y]));  
  9.         mask = 0x10;  
  10.         for (i = 0; i < 5; i++)  
  11.         {  
  12.             ht1632c_setLED (x+i, y, gc & mask);  
  13.             mask = mask >> 1;  
  14.         }  
  15.     }  
  16. }  
Para exercitar a rotina, vamos mostrar um contador incrementado a cada segundo:
  1. // Programa principal  
  2. int main(void)  
  3. {  
  4.     uint8_t i, contador[5];  
  5.       
  6.     ht1632c_init();             // inicia o controlador do display  
  7.     ht1632c_send_screen ();     // limpa o display  
  8.     tempo_init();               // inicia a contagem de tempo  
  9.   
  10.     // Inicia o contador  
  11.     for (i = 0; i < 5; i++)  
  12.         contador[i] = 0;  
  13.       
  14.     // Loop perpétuo, incrementa o contador a cada 1 segundo  
  15.     for (;;)  
  16.     {  
  17.         for (i = 0; i < 5; i++)  
  18.             display (6*i, contador[i]);  
  19.         delay_seg (1);  
  20.         i = 5;  
  21.         while (i > 0)  
  22.         {  
  23.             i--;  
  24.             contador[i]++;  
  25.             if (contador[i] < 10)  
  26.                 break;  
  27.             contador[i] = 0;  
  28.         }  
  29.     }  
  30. }  
O programa completo (JYMCU3208_Teste3.zip) pode ser baixado dos arquivos do blog.

O vídeo abaixo mostra o programa em funcionamento.



Nenhum comentário: