terça-feira, abril 02, 2013

LCD Alfanumérico 2x16 - Bonus

Um dos exemplos na parte anterior foi a programação de um caracter. Neste post veremos mais detalhes deste recurso do display.


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.
  1. // Definição dos nossos caracteres  
  2. uint8_t gc[8*8] =  
  3. {  
  4.   0x1F, 0x1D, 0x1D, 0x1D, 0x11, 0x11, 0x11, 0x1F,  
  5.   0x04, 0x0E, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04,  
  6.   0x04, 0x04, 0x04, 0x04, 0x04, 0x1F, 0x0E, 0x04,  
  7.   0x04, 0x15, 0x0E, 0x04, 0x04, 0x0A, 0x11, 0x11,  
  8.   0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A,  
  9.   0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04,  
  10.   0x04, 0x04, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00,  
  11.   0x0E, 0x11, 0x15, 0x15, 0x15, 0x15, 0x11, 0x0E  
  12. };  
  13.   
  14. uint8_t anima[4*8] =  
  15. {  
  16.   0x1F, 0x1D, 0x1D, 0x1D, 0x11, 0x11, 0x11, 0x1F,  
  17.   0x1F, 0x17, 0x17, 0x17, 0x11, 0x11, 0x11, 0x1F,  
  18.   0x1F, 0x11, 0x11, 0x11, 0x17, 0x17, 0x17, 0x1F,  
  19.   0x1F, 0x11, 0x11, 0x11, 0x1D, 0x1D, 0x1D, 0x1F  
  20. };  
  21.   
  22. // Iniciacao  
  23. void setup() {  
  24.   Serial.begin (9600);  
  25.   lcd_init (12, 11, 5, 4, 3, 2);  
  26.       
  27.   // Desliga o cursor e programa o gerador  
  28.   lcd_envia_byte (CMD, LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);  
  29.   lcd_envia_byte (CMD, LCD_SETCGRAMADDR | 0);  
  30.   for (int i = 0; i < 8*8; i++)  
  31.     lcd_envia_byte (DATA, gc[i]);  
  32.   
  33.   // Escreve os caracteres na primeira linha      
  34.   lcd_envia_byte (CMD, LCD_SETDDRAMADDR | 0);  
  35.   for (uint8_t i = 0; i < 16; i++)  
  36.     lcd_envia_byte (DATA, i);  
  37.   delay (2000);  
  38. }  
  39.   
  40. // Programa de teste  
  41. void loop() {  
  42.   // Faz uma animação simples do primeiro caracter  
  43.   for (int j = 0; j < 4; j++) {  
  44.     lcd_envia_byte (CMD, LCD_SETCGRAMADDR | 0);  
  45.     for (int i = 0; i < 8; i++)  
  46.       lcd_envia_byte (DATA, anima[j*8+i]);  
  47.     delay(300);      
  48.   }  
  49. }  
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: