terça-feira, junho 19, 2012

Escrevendo um Firmware Alternativo para o Display JY-MCU 3208 - Parte 3

Dando mais um passo, vamos escrever uma rotina que permita controlar os LEDs por linha e coluna.


O programa que fizemos no post anterior nos revelou o mapeamento dos LEDs na memória do controlador:

A rotina de controle dos LEDs por linha e coluna consiste em converter estas coordenadas no endereço da posição de memória e na máscara para o bit correspondente. A rotina atualiza tanto a memória no controlador do display como a sua cópia no microcontrolador.
  1. // Acende ou apaga o LED na posição x,y  
  2. // 0 <= x <= 31  0 <= y <= 7  
  3. void ht1632c_setLED (uint8_t x, uint8_t y, uint8_t valor)  
  4. {  
  5.     uint8_t addr, mask;  
  6.       
  7.     mask = 1 << (3 - (x & 3));  
  8.     addr = ((x & ~7) << 1) + (y << 1);  
  9.     if (x & 4)  
  10.         addr++;  
  11.     if (valor)  
  12.         ht1632c_shadowram[addr] |= mask;  
  13.     else  
  14.         ht1632c_shadowram[addr] &= ~mask;  
  15.       
  16.     HT_CS_PORT &= ~HT_CS_BIT;  
  17.     ht1632c_send (HT_ID_WRITE, 3);  
  18.     ht1632c_send (addr, 7);  
  19.     ht1632c_send (ht1632c_shadowram[addr], 4);  
  20.     HT_CS_PORT |= HT_CS_BIT;  
  21. }  
Vamos alterar o nosso programa de teste para acender e apagar os LEDs da esquerda para a direita e de cima para baixo:
  1. // Programa principal  
  2. int main(void)  
  3. {  
  4.     uint8_t x, y, valor;  
  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.     // Muda um LED a cada segundo  
  11.     valor = 1;  
  12.     for (;;)  
  13.     {  
  14.         for (y = 0; y < HT_ROWS; y++)  
  15.         {  
  16.             for (x = 0; x < HT_COLS; x++)  
  17.             {  
  18.                 ht1632c_setLED (x, y, valor);  
  19.                 delay_seg (1);  
  20.             }  
  21.         }  
  22.         valor ^= 1;  
  23.     }  
  24. }  
O vídeo abaixo mostra o resultado.



Podemos usar esta rotina para implementar uma escrita simples de caracteres, é o que veremos no próximo post da série.

Nenhum comentário: