Os displays alfanuméricos baseados no controlador HD44780 permitem programar 8 caracteres. Estes caracteres correspondem aos códigos 0 a 7 na memória da tela. Os caracteres de 8 a 15 são os mesmos que de 0 a 7.
Tipicamente os caracteres possuem uma área útil de 5 colunas por 8 linhas. Uma margem de uma coluna e uma linha adicionais, sempre apagadas, separam os caracteres entre si (o que impede, por exemplo, de fazer um traço contínuo).
A cada caracter definível correspondem 8 bytes na CGRam, o caracter de código "n" (de 0 a 7) corresponde aos endereços 8*n a 8*n+7. Cada byte corresponde a uma linha do caracter, apenas os 5 bits menos significativos são utilizados. A figura abaixo mostra esta correspondência:
Os caracteres programáveis podem ser usados para colocar alguns símbolos especiais que não estão disponíveis no display ou para fazer algumas animações simples.
Utilizando a mesma montagem do post anterior, alterei o programa no Arduino para colocar os caracteres de código 0 a 15 na primeira linha do display e programá-los com alguns desenhos. Após algum tempo, o caracter 0 é reprogramado para gerar uma pequena animação.
// Definição dos nossos caracteres
uint8_t gc[8*8] =
{
0x1F, 0x1D, 0x1D, 0x1D, 0x11, 0x11, 0x11, 0x1F,
0x04, 0x0E, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x1F, 0x0E, 0x04,
0x04, 0x15, 0x0E, 0x04, 0x04, 0x0A, 0x11, 0x11,
0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A,
0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x0E, 0x11, 0x15, 0x15, 0x15, 0x15, 0x11, 0x0E
};
uint8_t anima[4*8] =
{
0x1F, 0x1D, 0x1D, 0x1D, 0x11, 0x11, 0x11, 0x1F,
0x1F, 0x17, 0x17, 0x17, 0x11, 0x11, 0x11, 0x1F,
0x1F, 0x11, 0x11, 0x11, 0x17, 0x17, 0x17, 0x1F,
0x1F, 0x11, 0x11, 0x11, 0x1D, 0x1D, 0x1D, 0x1F
};
// Iniciacao
void setup() {
Serial.begin (9600);
lcd_init (12, 11, 5, 4, 3, 2);
// Desliga o cursor e programa o gerador
lcd_envia_byte (CMD, LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
lcd_envia_byte (CMD, LCD_SETCGRAMADDR | 0);
for (int i = 0; i < 8*8; i++)
lcd_envia_byte (DATA, gc[i]);
// Escreve os caracteres na primeira linha
lcd_envia_byte (CMD, LCD_SETDDRAMADDR | 0);
for (uint8_t i = 0; i < 16; i++)
lcd_envia_byte (DATA, i);
delay (2000);
}
// Programa de teste
void loop() {
// Faz uma animação simples do primeiro caracter
for (int j = 0; j < 4; j++) {
lcd_envia_byte (CMD, LCD_SETCGRAMADDR | 0);
for (int i = 0; i < 8; i++)
lcd_envia_byte (DATA, anima[j*8+i]);
delay(300);
}
}
Um cuidado a ser tomado é que o cursor é movido quando a memória CGRAM é acessada. Por este motivo é aconselhável desligar o cursor durante a programação. Um outro cuidado é que após selecionar um endereço na CGRAM as leituras e escritas de dados serão nesta memória. Para poder voltar a escrever na tela é preciso selecionar um endereço na DDRAM.

Nenhum comentário:
Postar um comentário