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