quinta-feira, agosto 16, 2012

Rolando Texto no Display JY-MCU3208

Nesta nova brincadeira com o JY-MCU3208 vamos rolar um texto da direita para a esquerda. Além de exercitar um pouco mais a programação do display, o resultado obtido é util para a apresentação de pequenas mensagens.



Para aproveitar melhor o display, vamos usar caracteres de largura variável. Para isto parti da definição de caracteres em um exemplo de Rick Shear. Coloquei os caracteres na ordem do código ASCII e completei para cobrir a faixa 0x20 a 0x7F. Cada caracter ocupa seis bytes na Flash, o primeiro indica a largura e os seguintes o desenho:
  1. const uint8_t font[] PROGMEM =  
  2. {  
  3.  3, 0x00, 0x00, 0x00, 0x00, 0x00, // " "  
  4.  1, 0xFD, 0x00, 0x00, 0x00, 0x00, //  !  
  5.  5, 0xE0, 0xC0, 0x00, 0xE0, 0xC0, //  "  
  6.  5, 0x24, 0xFF, 0x24, 0xFF, 0x24, //  #  
  7.  5, 0x12, 0x2A, 0x7F, 0x2A, 0x24, //  $  
  8.  // ...  
  9.  5, 0x11, 0x13, 0x15, 0x19, 0x11, //  z  
  10.  3, 0x10, 0x6E, 0x81, 0x00, 0x00, //  {  
  11.  1, 0xFF, 0x00, 0x00, 0x00, 0x00, //  |  
  12.  3, 0x81, 0x6E, 0x10, 0x00, 0x00, //  }  
  13.  4, 0x40, 0x80, 0x40, 0x80, 0x00, //  ~  
  14.  5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  //  DEL  
  15. };  
Vamos escrever os caracteres uma coluna por vez na margem direita do display, deslocando em seguida toda a tela para a esquerda. O deslocamento é apenas uma questão de mover os bits, a rotina abaixo inclui a opção de apagar a coluna mais à direita ao final do deslocamento.
  1. static void desloca (uint8_t fLimpa)  
  2. {  
  3.     uint8_t x, y;  
  4.       
  5.     for (x = 1; x < 32; x++)  
  6.         for (y = 0; y < 8; y++)  
  7.             ht1632c_setLED(x-1, y, ht1632c_getLED(x, y));  
  8.     if (fLimpa)  
  9.         for (y = 0; y < 8; y++)  
  10.             ht1632c_setLED(31, y, 0);  
  11. }  
A escrita de um caracter é semelhante ao que já vimos nas vezes anteriores, exceto que o número de colunas é variável e escrevemos sempre na última coluna e depois deslocamos a tela.
  1. static void display (uint8_t c)  
  2. {  
  3.     uint8_t x, y, mask, gc, tam;  
  4.     int iFont;  
  5.       
  6.     iFont = (c - 0x20) * 6;  
  7.     tam = pgm_read_byte(&(font[iFont]));  
  8.       
  9.     for (x = 0; x < tam; x++)  
  10.     {  
  11.         desloca(FALSE);  
  12.         iFont++;  
  13.         gc = pgm_read_byte(&(font[iFont]));  
  14.         mask = 0x80;  
  15.         for (y = 0; y < 8; y++)  
  16.         {  
  17.             ht1632c_setLED (31, y, gc & mask);  
  18.             mask = mask >> 1;  
  19.         }  
  20.         delay_ticks (2);  
  21.     }  
  22.     desloca (TRUE);  
  23.     delay_ticks (2);  
  24. }  
O programa principal apresenta uma vez uma mensagem de teste (com todos os caracteres) e depois rola continuamente a nossa mensagem.
  1. int main(void)  
  2. {  
  3.     uint8_t fTeste = TRUE;  
  4.     uint8_t msg[97];  
  5.     uint8_t iMsg;  
  6.     uint8_t *pMsg;  
  7.       
  8.     ht1632c_init();             // inicia o controlador do display  
  9.     ht1632c_send_screen ();     // limpa o display  
  10.     tempo_init();               // inicia a contagem de tempo  
  11.   
  12.     // Monta a mensagem de teste  
  13.     for (iMsg = 0; iMsg < 96; iMsg++)  
  14.         msg[iMsg] = iMsg + 0x20;  
  15.     msg[96] = 0;  
  16.     pMsg = msg;  
  17.       
  18.     // Loop perpétuo  
  19.     for (;;)  
  20.     {  
  21.         iMsg = 0;  
  22.         while (pMsg[iMsg])  
  23.         {  
  24.             display (pMsg[iMsg]);  
  25.             iMsg++;  
  26.         }  
  27.         delay_ticks (32);  
  28.         if (fTeste)  
  29.         {  
  30.             pMsg = (uint8_t *) "DQSoft - Teste do display JY-MCU 3208    ";  
  31.             fTeste = FALSE;  
  32.         }  
  33.     }  
  34. }  
O projeto completo está nos arquivos do blog, no arquivo JYMCU3208_Banner.zip.

3 comentários:

Ale Vecchio disse...

Olá DQ,

Você acredita que dá para enviar de um arduino, por uma "rede" 2,4Ghz, um valor de uma variável para este display mostrar? Será que cabe no Mega8?

Pretendo usar os NRF24L01+ como "rede wireless". Tenho uma MCU que tem que exibir diversos valores em até 6 JY-MCU3208.

Daniel Quadros disse...

Ale, em princípio eu acho que sim. Ainda não mexi com o NRF24L01+ mas a interface dele é simples o suficiente para rodar fácil no Mega8.

Ale Vecchio disse...

Já estou te devendo uma cerveja...
Estou "limpando" o exemplo que você fez para deixar só o que preciso. Depois vou começar com o 24L01.

Hora dessas eu apareço no Garoa para mostrar como estão as coisas e pedir ajuda.

Obrigado.