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);
- }
- }
Nenhum comentário:
Postar um comentário