Módulo LCD 16x2
Para ligarmos um display LCD 16×2 ao PIC, precisamos antes de mais nada entender um pouco sobre a forma como esse tipo de display trabalha. Um dos tipos mais comuns de controlador utilizados em displays LCD é o HD44780, que pode ser ligado ao microcontrolador usando-se 4 ou 8 fios, e que vai determinar a velocidade de comunicação entre eles.
Não podemos simplesmente enviar dados à um LCD sem uma sequência lógica. Antes de utilizá-lo, é necessário o envio de comandos que preparam o display para receber caracteres. Vamos tomar como exemplo o display LCD 16×2 com controlador HD44780.
Esse tipo de display tem 16 pinos: 3 pinos de alimentação, 3 de controle, 8 de dados e 2 para acionar o backlight (ou luz de fundo), que você pode ver em detalhes na imagem abaixo:
- Os pinos de controle do display LCD 16×2 são o RS, o R/W e o E.
- O pino RS tem a função de mostrar ao display que tipo de dados estamos transmitindo. Em nível baixo (0), os dados são tratados como comandos, e em nível alto (1), os dados são tratados como caracteres.
- O pino R/W (Read/Write) é utilizado para determinar se estamos lendo ou transmitindo dados para o display.
Já o pino ENABLE é utilizado para determinar o início da transferência de dados entre o microcontrolador e o display.
Os pinos de dados D0 a D7 formam o barramento de dados. O mais comum é utilizarmos apenas 4 pinos para comunicação com o microcontrolador, mas nada impede que em aplicações mais elaboradas sejam utilizados todos os 8 pinos. Essa é uma das funções do envio de comandos que preparam o display, pois é nesse momento que determinamos se vamos usar 4 ou 8 pinos para comunicação. Partindo do problema da aula anterior (Display de 7 segmentos – Leitura do nibble presenta na porta B), imagine que se queira ler o byte inteiro presente na porta B e colocar o seu valor escrito em 2 displays de 7 segmentos.
Biblioteca do LCD
Existem várias bibliotecas que simplificam a utilização deste periférico. Utilizamos a biblioteca mostrada no livro “Micontroladores PIC18 – Aprenda e Programe em Linguagem C” de Alberto Noboru Miyadaira. Esta biblioteca possui as seguintes funções:
- lcd_inicia (conf_1, conf_2, conf_3) Inicia o lcd, os parâmetros
- conf_1:
- 0x20 – Comunicação em 4 bits, display de 1 linha, matriz 8 x 5
- 0x24 – Comunicação em 4 bits, display de 1 linha, matriz 10 x 5
- 0x28 – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 8 x 5
- 0x2C – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 10 x 5
- 0x30 – Comunicação em 8 bits, display de 1 linha, matriz 8 x 5
- 0x34 – Comunicação em 8 bits, display de 1 linha, matriz 10 x 5
- 0x38 – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 8 x 5
- 0x3C – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 10 x 5
- conf_2:
- 0x3C – Desliga o cursor
- 0X08 – Desliga o display
- 0x02 – Desloca o cursor para linha 1 coluna 1
- 0x14 – Desloca o cursor para direita sem deslocar a mensagem
- 0x10 – Desloca o cursor para esquerda, sem deslocar a mensagem
- 0x0F – Liga o cursor com alternância
- 0x0E – Liga o display e o cursor
- 0x0D – Liga o display e o cursor piscante
- 0x01 – Limpa a tela do display e desloca para linha 1, coluna1
- conf_3:
- 0x04 – Desloca o cursor para esquerda quando um caractere é inserido, mas não desloca a mensagem
- 0x06 – Desloca o cursor para direita quando um caractere é inserido mas não desloca a mensagem
- 0x05 – Desloca o cursor e a mensagem para esquerda quando um caractere é inserido
- 0x07 – Desloca o cursor e a mensagem para direita quando um caractere é inserido
- lcd_limpa_tela () Limpa a tela do display LCD
- lcd_posicao (linha, coluna) Coloca o cursor em uma determinada posição do display LCD
- imprime_string_lcd (s_caracteres) Envia uma string localizada na memória de programa para o display LCD, onde s_caracteres = ponteiro para a string
- imprime_buffer_lcd (s_caracteres, tamanho_buffer) Envia uma matriz de dados para o display LCD, onde s_caracteres = ponteiro para o buffer e tamanho_buffer = quantidade de dados que serão enviados
- lcd_LD_cursor (config) Liga/Desliga o cursor/display
- 0 – Desliga o cursor
- 1 – Desliga o display
- 2 – Liga o cursor com alternância
- 3 – Liga o display e o cursor
- 4 – Liga o display e o cursor piscante
- lcd_cursor_home() Coloca o cursor na linha e coluna 1 do display
- lcd_desloca_cursor (direita-esquerda) Descola o cursor para a direita ou esquerda
- 0 – Direita
- 1 – Esquerda
- lcd_desloca_mensagem(direita_esquerda) Desloca a mensagem para direita ou esquerda
- 0 – Direita
- 1 – Esquerda
- lcd_escreve_dado(dado) Escreve um caractere ou símbolo no display
- lcd_le_dado () Retorna o caractere presente na posição do cursor
- lcd_status() Retorna o valor do status + contador de endereço
Ligação do display LCD no PIC
A biblioteca prevê uma ligação utilizando o a porta D, porém nada impede a edição do arquivo para modificação dos pinos ou mesmo da porta.
Utilizando uma comunicação de 4 bits temos o uso de 7 pinos:
PIC LCD
RD0 (19) RS (04)
RD1 (20) RW (05)
RD7 (30) E (6)
RD6 (29) D4 (11)
RD5 (28) D5 (12)
RD4 (27) D6 (13)
RD2 (21) D7 (14)
Programa de exemplo uso do LCD
/*
* File: IS2_LCD_0_Exemplo.c
* Author: Pilger-Win7
*
* Created on 15 de Março de 2018, 10:36
*
* LCD 2 x 16
* 0 - Exemplo
*
* Objeto: Mostrar o LCD em funcionamento
*
*/
#define _XTAL_FREQ 48000000
#include <xc.h>
#include "c:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
void delay_ms(int i) {
for (int x = 0; x < i; x++) {
__delay_ms(1);
}
}
void delay_1s(unsigned char tempo) {
for (int i = 0; i < tempo; i++) { // Gera um delay de múltiplos de 1s
delay_ms(1000); // Gera um delay de 1s
}
}
void main(void) {
ADCON1 = 0x0F; // configura os pinos dos ports A a E como IO
TRISD = 0x00; // define o port D como saída
LATD = 0; // "zera" a porta D
lcd_inicia(0x28, 0x0f, 0x06); // Inicializa o LCD
lcd_posicao(1, 5); // coloca o cursor na linha 1, coluna 5
imprime_string_lcd(" PIC18F4550 "); // escreve texto no LCD
delay_1s(4); // conta 4s
while (1) {
lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
imprime_string_lcd(" Teste do LCD "); // escreve texto no LCD
delay_1s(4); // conta 4s
lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
imprime_string_lcd(" LCD escrito "); // escreve texto no LCD
delay_1s(4); // conta 4s
}
}
Atividades
Atividade 1:
Escrever um programa em Linguagem C para o PIC18F4550, para controlar um LED por um botão e mostrar no display o status do hardware botão solto ou pressionado, e LED ligado ou desligado.
Atividade 2:
Utilizando o programa do semáforo “cruzamento” (aula 4) pede-se construir/modificar o programa para informar no módulo LCD 2 x 16 o estado de cada semáforo.
Nenhum comentário:
Postar um comentário