1. Introdução
Uma das interfaces mais utilizadas é o display alfanumérico. Nele é possível exibir frases completas, valores numéricos, menus de opções, gráficos etc... Dada a importância desta interface, o pacote de atualização dos Beans inclui um componente contendo uma série de funções para manipular este dispositivo. Dentre os diversos tipos disponíveis no mercado, a fig. 1 mostra um display de 16 caracteres por duas linhas.
Figura 1. DIsplay LCD alfanumérico
Fonte: Google.com
Estes módulos são considerados como um periférico a serem controlados por um MCU, pois possuem barramentos de dados e de controle, como visto na fig. 2. As especificações temporais dependem do modelo fabricado.
Figura 2. Diagrama de blocos do LCD 16x2.
Fonte: Google.com
2. Configuração do LCD
Como mostra a fig. 3, o Component Library oferece alguns Beans para comunicação com LCDs, dentre eles o tipo adequado para esta aplicação está em destaque (LCDHTA).
Figura 3. Beans para interface com LCD.
Fonte: elaborado pelo autor.
A fig. 4 mostra a aba de dados do Bean LCDHTA contendo as opções que devem configuradas para LCD. Na opção LCD type é recomendado selecionar a opção generic para que o pino enable (E) seja usado para habilitar o LCD, caso contrário o pino deve estar conectado ao Vcc do mesmo. O LCDHTA já traz as configurações dos endereços de memória do LCD para as linhas 1 e 2, pois estes valores são usados pela maioria dos fabricantes, caso contrário esta informação deve ser consultada na folha de dados do dispositivo. Nesta aba também são configurados o número de linhas, no campo LCD lines, e o número de caracteres por linha no campo Characters per Line. No campo Wait(us), pode ser configurado um atraso de tempo entre cada operação de escrita ou leitura. Este atraso pode ser desconsiderado se for habilitada a opção de verificação do busy flag descrito a seguir.
Figura 4. Aba de configurações do LCDHTA.
Fonte: elaborado pelo autor.
Na aba LCD Enable Signal é necessário escolher um pino do MCU para controlar o acesso ao LCD. A fig. 5 mostra que é necessário desabilitar a opção LCD Enable Signal .
Figura 5. Configuração do pino de habilitação.
Fonte: elaborado pelo autor.
Como dito anteriormente, é possível ler um busy flag para verificar se o LCD está ocupado ou não para trocar dados com o MCU. A fig. 6 mostra a aba de configurações correspondente ao busy flag, é necessário selecionar um pino do MCU para conectar ao pino R/W (read/write) do LCD e habilitar a opção Check busy flag.
Figura 6. Configuração do Busy flag.
Fonte: elaborado pelo autor.
A aba seguinte E2 não é usada para este módulo mas outros modelos utilizam um segundo pino de controle. Na aba Data/Control Bus, são selecionados os pinos a serem usados no barramento de dados e de controle.
A fig. 7 mostra as configurações disponíveis. Este módulo LCD possui um barramento de 8 vias de largura mas pode operar no modo nibble (4 bits), este modo é usado para economizar pinos do MCU, sendo assim, são necessários 4 vias de dados e mais 3 de controle para realizar a comunicação com o LCD. Em contrapartida, para cada comando devem ser efetuados dois acessos ao LCD. Neste exemplo foi usado o modo nibble, como mostra a fig. 7, portanto, foram selecionados 4 pinos do MCU para o barramento de dados do LCD.
Figura 7. Configuração Data/Control Bus.
Fonte: elaborado pelo autor.
3. Funções do Bean LCDHTA
A fig. 8 mostra as funções implementadas no Bean LCDHTA. As funções implementam as funções de acesso e manipulação de dados.
Figura 7. Configuração Data/Control Bus.
Fonte: elaborado pelo autor.
No início do programa o LCD é inicializado, ficando disponível para o usuário. O trecho de código a seguir exemplifica o uso do LCD:
CÓDIGO
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
LCD1_DisplayOn();
LCD1_Home();
MyGPIO1Ptr = SENSOR_Init((LDD_TUserData *) NULL);
/* Write your code here */
for (;;) {
j = ds1820_read(1, &f_temp);
LCD1_GotoXY(1, 1);
UTIL1_strcpy(s_texto,16,"teste ");
UTIL1_strcatNumFloat(s_texto, 16, f_temp, 1);
UTIL1_strcat(s_texto,16," ");
UTIL1_strcatNum8u(s_texto, 16, i);
LCD1_WriteLineStr(1, s_texto);
WAIT2_Waitms(500);
}
No trecho acima, o display é inicializado na execução da PE_low_level_init(); ficando pronto para uso na aplicação. A função LCD1_DisplayOn() aciona o display e a função LCD1_Home(); posiciona o cursor na posição 1 do LCD. Para exibir caracteres é necessário passar uma matriz como parâmetro para a função LCD1_WriteLineStr(1, s_texto); e a linha de exibição. A informação a ser exibida precisa estar formatada, como mostrado no código acima.