terça-feira, março 26, 2013

LCD Alfanumérico 2x16 - Parte 2

Nesta segunda parte vamos ver como controlar o LCD através dos registradores.

Diagrama de blocos do controlador, destacando os registradores.
A Memória

Internamente o LCD possui duas pequenas memórias que armazenam os caracteres no display (endereços 0x00 a 0x0F para a primeira linha e 0x40 a 0x4F para a segunda) a definição de 8 caracteres programáveis (8 bytes para cada caracter, endereçados de 0x00 a 0x3F).

Estas memórias não são acessadas diretamente pelo microcontrolador Internamente ao controlador existem dois contadores de endereço, um para o display (DDRAM) e o outro para o gerador de caracteres (CGRAM).

Os Registradores

Toda a interação do microcontrolador com o controlador do display é feita através de dois registradores, um de instrução (somente de escrita) e outro de dado (de leitura e escrita).

Para escrever uma instrução no registrador correspondente, os sinais  RS e R/W devem ser colocados em nível baixo. Quando o sinal R/W está em nível alto com RS em nível baixo, o pino DB7 indica se o controlador está ocupado (DB7 em nível alto) ou pronto para receber uma nova instrução (DB7 em nível baixo).

O registrador de dados é acessado colocando o sinal RS em nível alto. Se R/W também estiver em nível alto, o dado escrito pelo microcontrolador será escrito na memória DDRAM ou CGRAM (dependendo das instruções enviadas anteriormente). Se R/W estiver em nível baixo, o valor  lido do registrador de dados virá da memória DDRAM ou CGRAM (dependendo das instruções enviadas anteriormente).


As Instruções


Clear Display (0x01)

Preenche a memória do display com espaços (0x20) e inicia o endereço DDRAM com zero. Desliga o deslocamento do display, fazendo o endereço 0 corresponder ao canto superior esquerdo do display. Seleciona o modo de incremento automático do endereço.

Return Home (0x02 ou 0x03)

Inicia o endereço DDRAM com zero. Desliga o deslocamento do display, fazendo o endereço 0 corresponder ao canto superior esquerdo do display.

Entry Mode Set (0x04 a 0x07)

O bit 1 (I/D) determina se o endereço da memória será automaticamente incrementado (valor 1) ou decrementado (valor 0) a cada leitura ou escrita.

O bit 0 da instrução controla o deslocamento do display. Se este bit for 1, o cursor ficará parado e o texto na linha será deslocado para a direta ou esquerda (conforme estiver ativo o incremento ou decremento automático).

Display On/Off Control (0x08 a 0x0F)

O bit 2  (D) determina se o display estará ligado (1) ou desligado (0).

O bit 1 (C) determina se será apresentado o cursor (bloco reverso na posição correspondente ao endereço selecionado da DDRAM). O valor 1 ativa o cursor e 0 o desativa.

O bit 0 (B) determina se o cursor pisca (1) ou não (0).

Cursor/Display Shift (0x10 a 0x1F)

Esta instrução permite deslocar o display ou o curosr para a direita ou esquerda. A movimentação do cursor implica no incremento ou decremento do endereço da memória.

O bit (S/C) seleciona se será deslocado o display (1) ou o cursor (0). O bit 2 (R/L) seleciona a direção: direita (1) ou esquerda (0).

Function Set (0x20 a 0x3F)

Esta instrução configura o display.

O bit 4 (DL) determina se a conexão ao microcontrolador usa 8 (valor 1) ou 4 (valor 0) bits.

O bit 3 (N) determina se o display tem duas (1) ou uma (0) linha.

O bit 2 (F) determina o tamanho dos caracteres: 5x7 (0) ou 5x10 (1).

No nosso caso vamos usar sempre DL=0, N=1 e F=0.

Set CGRAM Address (0x40 a 0x7F)

Define o valor do endereço da CGRAM (nos bits 5 a 0 da instrução). As leituras e escritas seguintes serão na CGRAM.

Set DDRAM Address (0x80 a 0xFF)

Define o valor do endereço da DDRAM (nos bits 6 a 0 da instrução). As leituras e escritas seguintes serão na DDRAM.


A tabela abaixo resume as instruções (clique para ampliar).



Iniciação do Controlador

Quando o controlador do LCD é alimentado passa por um ciclo interno de iniciação, que pode demorar até 10 milisegundos. Neste ciclo são executadas as instruções Clear Display, Function Set (8 bits, 1 linha, caracter 5x8), Display On/Off Control (display, cursor e pisca desligados) e Entry Mode Set (auto incremento sem deslocamento).

Na nossa iniciação vamos querer colocar o display no modo 4 bits e display de duas linhas, independente do estado anterior. Quando o controlador está configurado para 8 bits (por exemplo após um reset), só conseguimos escrever os 4 bits mais significativos, os demais são indeterminados. Se o controlador estiver configurado para operar com 4 bits, existe ainda a possibilidade de uma escrita ter sido interrompida entre as duas partes de uma instrução.

A solução é escrever três vezes 0011 no registrador de instruções, para garantir que o controlador estará no modo 8 bits independente do estado anterior. Escrevendo 0010 em seguida, o controlador estará no modo 4 bits, pronto para receber a primeira metade de uma instrução ou dado. Durante a etapa inicial (escrita dos três 0011), não é possível testar de forma confiável o sinal de ocupado.


Na próxima parte veremos um programa de teste usando um Arduino que nos permitirá testar as instruções de forma interativa.

Nenhum comentário: