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