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;
- }
- // 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;
- }
- }
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