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:
Postar um comentário