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.
// 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: