quinta-feira, agosto 16, 2012

Rolando Texto no Display JY-MCU3208

Nesta nova brincadeira com o JY-MCU3208 vamos rolar um texto da direita para a esquerda. Além de exercitar um pouco mais a programação do display, o resultado obtido é util para a apresentação de pequenas mensagens.



Para aproveitar melhor o display, vamos usar caracteres de largura variável. Para isto parti da definição de caracteres em um exemplo de Rick Shear. Coloquei os caracteres na ordem do código ASCII e completei para cobrir a faixa 0x20 a 0x7F. Cada caracter ocupa seis bytes na Flash, o primeiro indica a largura e os seguintes o desenho:
const uint8_t font[] PROGMEM =
{
 3, 0x00, 0x00, 0x00, 0x00, 0x00, // " "
 1, 0xFD, 0x00, 0x00, 0x00, 0x00, //  !
 5, 0xE0, 0xC0, 0x00, 0xE0, 0xC0, //  "
 5, 0x24, 0xFF, 0x24, 0xFF, 0x24, //  #
 5, 0x12, 0x2A, 0x7F, 0x2A, 0x24, //  $
 // ...
 5, 0x11, 0x13, 0x15, 0x19, 0x11, //  z
 3, 0x10, 0x6E, 0x81, 0x00, 0x00, //  {
 1, 0xFF, 0x00, 0x00, 0x00, 0x00, //  |
 3, 0x81, 0x6E, 0x10, 0x00, 0x00, //  }
 4, 0x40, 0x80, 0x40, 0x80, 0x00, //  ~
 5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  //  DEL
};
Vamos escrever os caracteres uma coluna por vez na margem direita do display, deslocando em seguida toda a tela para a esquerda. O deslocamento é apenas uma questão de mover os bits, a rotina abaixo inclui a opção de apagar a coluna mais à direita ao final do deslocamento.
static void desloca (uint8_t fLimpa)
{
    uint8_t x, y;
    
    for (x = 1; x < 32; x++)
        for (y = 0; y < 8; y++)
            ht1632c_setLED(x-1, y, ht1632c_getLED(x, y));
    if (fLimpa)
        for (y = 0; y < 8; y++)
            ht1632c_setLED(31, y, 0);
}
A escrita de um caracter é semelhante ao que já vimos nas vezes anteriores, exceto que o número de colunas é variável e escrevemos sempre na última coluna e depois deslocamos a tela.
static void display (uint8_t c)
{
    uint8_t x, y, mask, gc, tam;
    int iFont;
    
    iFont = (c - 0x20) * 6;
    tam = pgm_read_byte(&(font[iFont]));
    
    for (x = 0; x < tam; x++)
    {
        desloca(FALSE);
        iFont++;
        gc = pgm_read_byte(&(font[iFont]));
        mask = 0x80;
        for (y = 0; y < 8; y++)
        {
            ht1632c_setLED (31, y, gc & mask);
            mask = mask >> 1;
        }
        delay_ticks (2);
    }
    desloca (TRUE);
    delay_ticks (2);
}
O programa principal apresenta uma vez uma mensagem de teste (com todos os caracteres) e depois rola continuamente a nossa mensagem.
int main(void)
{
    uint8_t fTeste = TRUE;
    uint8_t msg[97];
    uint8_t iMsg;
    uint8_t *pMsg;
    
    ht1632c_init();             // inicia o controlador do display
    ht1632c_send_screen ();     // limpa o display
    tempo_init();               // inicia a contagem de tempo

    // Monta a mensagem de teste
    for (iMsg = 0; iMsg < 96; iMsg++)
        msg[iMsg] = iMsg + 0x20;
    msg[96] = 0;
    pMsg = msg;
    
    // Loop perpétuo
    for (;;)
    {
        iMsg = 0;
        while (pMsg[iMsg])
        {
            display (pMsg[iMsg]);
            iMsg++;
        }
        delay_ticks (32);
        if (fTeste)
        {
            pMsg = (uint8_t *) "DQSoft - Teste do display JY-MCU 3208    ";
            fTeste = FALSE;
        }
    }
}
O projeto completo está nos arquivos do blog, no arquivo JYMCU3208_Banner.zip.

3 comentários:

Ale Vecchio disse...

Olá DQ,

Você acredita que dá para enviar de um arduino, por uma "rede" 2,4Ghz, um valor de uma variável para este display mostrar? Será que cabe no Mega8?

Pretendo usar os NRF24L01+ como "rede wireless". Tenho uma MCU que tem que exibir diversos valores em até 6 JY-MCU3208.

Daniel Quadros disse...

Ale, em princípio eu acho que sim. Ainda não mexi com o NRF24L01+ mas a interface dele é simples o suficiente para rodar fácil no Mega8.

Ale Vecchio disse...

Já estou te devendo uma cerveja...
Estou "limpando" o exemplo que você fez para deixar só o que preciso. Depois vou começar com o 24L01.

Hora dessas eu apareço no Garoa para mostrar como estão as coisas e pedir ajuda.

Obrigado.