terça-feira, julho 24, 2012

Display JY-MCU3208: Escrevendo Caracteres

Agora que já sabemos como alterar um ponto no display, vamos fazer uma rotina simples de escrita de caracteres.


Para esta experiência, vamos escrever apenas dígitos, usando uma matriz de 5x7 pontos.
// Matriz de Caracteres 5x7
// Contem os dígitos de 0 a 9
uint8_t digitos [10][7] PROGMEM =
{
    { 0x0E, 0x11, 0x15, 0x15, 0x15, 0x11, 0x0E },
    { 0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x1F },
    { 0x0E, 0x11, 0x02, 0x04, 0x08, 0x10, 0x1F },
    { 0x0E, 0x11, 0x01, 0x06, 0x01, 0x11, 0x0E },
    { 0x11, 0x11, 0x11, 0x1F, 0x01, 0x01, 0x01 },
    { 0x1F, 0x10, 0x10, 0x1E, 0x01, 0x11, 0x0E },
    { 0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E },
    { 0x1F, 0x11, 0x01, 0x02, 0x04, 0x04, 0x04 },
    { 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E },
    { 0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C }
};
O PROGMEM no código acima indica que a matriz deve ser colocada na Flash. A rotina de escrita do caracter não tem muito segredo, basta usar corretamente a função pgm_read_byte para ler os dados na Flash.
// Mostra o digito d a partir da posição x
static void display (uint8_t x, uint8_t d)
{
    uint8_t i, y, mask, gc;
    
    for (y = 0; y < 7; y++)
    {
        gc = pgm_read_byte(&(digitos[d][y]));
        mask = 0x10;
        for (i = 0; i < 5; i++)
        {
            ht1632c_setLED (x+i, y, gc & mask);
            mask = mask >> 1;
        }
    }
}
Para exercitar a rotina, vamos mostrar um contador incrementado a cada segundo:
// Programa principal
int main(void)
{
    uint8_t i, contador[5];
    
    ht1632c_init();             // inicia o controlador do display
    ht1632c_send_screen ();     // limpa o display
    tempo_init();               // inicia a contagem de tempo

    // Inicia o contador
    for (i = 0; i < 5; i++)
        contador[i] = 0;
    
    // Loop perpétuo, incrementa o contador a cada 1 segundo
    for (;;)
    {
        for (i = 0; i < 5; i++)
            display (6*i, contador[i]);
        delay_seg (1);
        i = 5;
        while (i > 0)
        {
            i--;
            contador[i]++;
            if (contador[i] < 10)
                break;
            contador[i] = 0;
        }
    }
}
O programa completo (JYMCU3208_Teste3.zip) pode ser baixado dos arquivos do blog.

O vídeo abaixo mostra o programa em funcionamento.



Nenhum comentário: