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.
// Acende ou apaga o LED na posição x,y
// 0 <= x <= 31  0 <= y <= 7
void ht1632c_setLED (uint8_t x, uint8_t y, uint8_t valor)
{
    uint8_t addr, mask;
    
    mask = 1 << (3 - (x & 3));
    addr = ((x & ~7) << 1) + (y << 1);
    if (x & 4)
        addr++;
    if (valor)
        ht1632c_shadowram[addr] |= mask;
    else
        ht1632c_shadowram[addr] &= ~mask;
    
    HT_CS_PORT &= ~HT_CS_BIT;
    ht1632c_send (HT_ID_WRITE, 3);
    ht1632c_send (addr, 7);
    ht1632c_send (ht1632c_shadowram[addr], 4);
    HT_CS_PORT |= HT_CS_BIT;
}
Vamos alterar o nosso programa de teste para acender e apagar os LEDs da esquerda para a direita e de cima para baixo:
// Programa principal
int main(void)
{
    uint8_t x, y, valor;
    
    ht1632c_init();             // inicia o controlador do display
    ht1632c_send_screen ();     // limpa o display
    tempo_init();               // inicia a contagem de tempo
    
    // Muda um LED a cada segundo
    valor = 1;
    for (;;)
    {
        for (y = 0; y < HT_ROWS; y++)
        {
            for (x = 0; x < HT_COLS; x++)
            {
                ht1632c_setLED (x, y, valor);
                delay_seg (1);
            }
        }
        valor ^= 1;
    }
}
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: