Professional Documents
Culture Documents
umento
1.0 Introduo
1.1 Hardware e Pinagem
1.2 Endereos de cada caractere no LCD 16x2
1.3 LCD Modo 8 Bits
1.4 LCD Modo 4 bits - Somente um port de controle/dados
1.5 LCD Modo 4 bits - Controlado por dois ports do PIC
Introduo
Agora que j conhecemos os recursos fundamentais da linguagem C, estamos prontos para criar nossos
programas para controle de equipamentos. Estudaremos as principais funes e ferramentas para
manipular displays LCD. Para implementar nossos projetos interessante a utilizao de um display,
capaz de tornar mais simples a visualizao de informaes e a interao com nosso equipamento,
escolhemos para tratar nesta obra de um display de utilizao muito comum em sistemas
microcontrolados, suas caractersticas so as seguintes:
Tipo: Display LCD
Exibio: Caracteres Alfanumricos
Quantidade de informaes: 16 x 2 (dezesseis caracters em 2 linhas)
Controlador: padro HD44780 Hitchi
Um display LCD desse tipo, possui embutido em seu circuito um outro microcontrolador, e para
podermos utiliz-lo temos que entender um pouco de seus comandos e funes. Dessa forma, da mesma
maneira com que trabalhamos com o PIC, para utilizar um display LCD temos que seguir uma sequncia
de procedimentos.
Hardware e Pinagem
Existem modelos diferentes, com localizao diferente da pinagem, porm a numerao e funo dos
pinos geralmente a mesma, nos kits didticos e profissionais Microgenios utilizado o LCD
apresentado em seguida:
Descrio
Terra ou GND
VCC ou +5V
Tenso para ajuste de
V0
contraste (ver figura1)
RS Seleo: 1 - dado, 0 - instruo
R/W seleo 1 - Leitura, 0 - Escrita
E chip
1 ou (1 - 0) Habilita, 0 Select
desabilita
B0
LSB
B1
B2
B3
B4
barramento de dados
B5
B6
B7 MSB
A (display
Anodo p/ LED backlight
c/ back)
K (display
Catodo p/ LED backlight
c/ back)
CGROM: Memria no voltil onde esto gravados os cdigos para escrita dos
caracteres, isso muito til, pois apenas enviamos o cdigo ASCII do caracter e
esse j escrito no display.
DDRAM: uma rea de memria voltil, onde escrevemos o que queremos que
aparea no display, cada endereo dessa memria equivale a um endereo de
caracter dos display, podemos fazer a seguinte analogia para facilitar, cada caracter
do display como uma janela que exibe o contedo que escrevemos na DDRAM.
CGRAM: uma pequena rea de memria onde podemos desenhar caracteres
diferentes (apenas 8 caracteres). Ela muito utilizada quando precisamos criar
caracteres que no so comuns a todas as lnguas como por exemplo o caracter
do portugus.
Endereos e Instrues
Agora conhecemos a pinagem desse LCD, vamos conhecer seu modo de
funcionamento e saber um pouco mais das instrues e dados que precisaremos
utilizar.
Tabelas de Instrues
Na seqncia disponibilizamos as tabelas de instrues para esse tipo display,
como nosso objetivo no o estudo do display propriamente dito,
aconselhamos aos interessados nesse dispositivo que procurem bibliografias
dedicadas a eles para um maior detalhamento das funes.
Tabela com o conjunto completo de instrues:
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
Inicializao do LCD
Toda vez que alimentarmos o LCD, devemos executar um procedimento de
inicializao, o qual consiste em enviar comandos que configuram o modo de operao
para execuo de um dado programa: fixao das condies de utilizao, fixao do
modo de controle ativo/inativo do display e limpeza da tela.
No mikroC no precisamos nos preocupar em programar todos os comandos
de inicializao do LCD, pois, atravs de simples funes, o compilador se encarrega
de program-lo para ns. Por esse motivo devemos informar ao sistema o tipo de
LCD que estamos utilizando por meio de linhas de comando. A seguir, vamos conhecer
e estudar as instrues de controle de LCD usadas no mikroC.
Repare que todos os 8 pinos do barramento de dados do LCD (D0 a D7) esto ligados
no microcontrolador PIC, neste modo, estamos enviando as instrues e comandos para
o LCD em 8 bits.
/*********************************************************************
*****
Centro de tecnologia Microgenios
Programa exemplo: LCD_modo_8bits.c
Este programa tem por objetivo escrever a mensagem "Microgenios" na
primeira
linha do LCD e na segunda "Kit PICGENIOS".
**********************************************************************
****
*/
void main()
{
trisd = 0; //configura todos os pinos do portd como sada
trise = 0; //configura todos os pinos do porte como saida
ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral
lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e
inicializa o LCD
lcd8_cmd(lcd_clear); //apaga LCD
lcd8_cmd(lcd_cursor_off); // desliga cursor
lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do
LCD
lcd8_out(2,1,"KIT PICGENIOS"); // escreve mensagem na segunda linha do
LCD
delay_ms(10); //delay de 10 ms
while(1); //loop infinito
}
Os comandos seguintes controlam o display LCD no modo 8 bits. Vamos estudar cada
um dos comandos:
O comando lcd8_config ( ):
O comando lcd8_config determina quais so os pinos do barramento de dados e de
controle do LCD que esto ligados ao PIC, assim como tambm inicializa o LCD.
Sintaxe:
lcd8_config(&port_controle, &port_dados, RS, EN, RW, D7, D6, D5, D4,
D3, D2, D1, D0 );
Onde:
port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.
RS : pino do port_controle que determina o bit de instrues ou dado do LCD.
EN : pino do port_controle que determina o bit de "enable" do LCD.
RW : pino do port_controle que determina o bit de leitura /escrita do LCD.
(nolmalmente coloca-se este pino do LCD no GND).
D7 D0: Pinos do port_dados
Vejamos nosso exemplo de programa:
lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e
inicializa o LCD
//pino RE2
//pino RE1
//pino RE0
//pino
//pino
//pino
//pino
//pino
//pino
//pino
//pino
RD7
RD6
RD5
RD4
RD3
RD2
RD1
RD0
do
do
do
do
do
do
do
do
PORTD
PORTD
PORTD
PORTD
PORTD
PORTD
PORTD
PORTD
Apartir desta primeira linha de programa, concluimos que nosso LCD esta ligado da
seguinte maneira:
Repare que o pino R/W do LCD foi aterrado. No comando Lcd8_config informamos
que o pino RW era RE0 do PIC.
O comando lcd8_cmd(comandos_LCD):
Este e os demais comandos que estudaremos somente podem ser utilizados aps a
execuo do comando lcd8_config().
Utilizamos o comando para desligar o cursor do LCD
lcd8_cmd(lcd_cursor_off); // desliga cursor
Vamos escrever agora outro programa que escreve uma mensagem no display lcd 16 x
4:
/*********************************************************************
*****
Centro de tecnologia Microgenios
Programa exemplo: LCD_modo_8bits_01.c
Este programa tem por objetivo escrever a mensagem "Maquina: ligado"
na primeira
linha do LCD e na segunda linha "Prog: ligado".
**********************************************************************
****
*/
char *texto = "ligado"
void main()
{
trisd = 0; //configura todos os pinos do portd como sada
trise = 0; //configura todos os pinos do porte como saida
ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral
lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e
inicializa o LCD
lcd8_cmd(lcd_clear); //apaga LCD
lcd8_cmd(lcd_cursor_off); // desliga cursor
lcd8_out(1,1,"Maquina: "); // escreve mensagem na primeira linha do
LCD
lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD
lcd8_out(2,1,"Prog: "); // escreve mensagem na segunda linha do LCD
lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD
delay_ms(10); //delay de 10 ms
while(1); //loop infinito
}
void main() {
TRISD = 0;
// programa portD como saida
Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD
Lcd_Cmd(Lcd_CLEAR);
// apaga display
Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor
Lcd_Out(1, 1, "teste LCD");
// escreve texto "teste LCD" na
primeira linha, primeira coluna do LCD
while(1);
}
Onde:
port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.
RS : pino do port_controle que determina o bit de instrues ou dado do LCD.
EN : pino do port_controle que determina o bit de "enable" do LCD.
RW : pino do port_controle que determina o bit de leitura /escrita do LCD.
(nolmalmente coloca-se este pino do LCD no GND).
D7 D4: pinos do port_dados
Vejamos nosso exemplo de programa:
Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD
RS: 1
EN: 3
RW: 2
//pino
//pino
//pino
//pino
RD7
RD6
RD5
RD4
do
do
do
do
PORTD
PORTD
PORTD
PORTD
Repare que para controlar o display LCD utilizamos dois ports do PIC, o PORTA para
controle, e o PORTD como dados.
Vamos estudar um programa para entendermos os comandos de controle:
/*********************************************************************
*****
Centro de tecnologia Microgenios
Programa exemplo: LCD_modo_4bits_01.c
Este programa tem por objetivo escrever a mensagem "Programa LCD" na
primeira
linha do LCD. Programa no modo 4 bits
**********************************************************************
****
*/
void main() {
ADCON1 = 6;
geral
TRISA = 0;
// programa portA como saida
TRISD = 0;
// programa portD como saida
Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e
inicializa LCD no modo 4 bits
Lcd_Cmd(Lcd_CLEAR);
// apaga display
Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor
Lcd_Out(1, 4, "Programa LCD");
// escreve texto "Programa LCD" na
primeira linha, quarta coluna do LCD
while(1);
}
Onde:
port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.
RS : pino do port_controle que determina o bit de instrues ou dado do LCD.
EN : pino do port_controle que determina o bit de "enable" do LCD.
RW : pino do port_controle que determina o bit de leitura /escrita do LCD.
(nolmalmente coloca-se este pino do LCD no GND).
D7 D4: pinos do port_dados
Vejamos nosso exemplo de programa:
Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e
inicializa LCD no modo 4 bits
RS: 1
EN: 3
RW: 2
//pino
//pino
//pino
//pino
RD0
RD2
RD4
RD5
do
do
do
do
PORTD
PORTD
PORTD
PORTD
Aprendendo Programando:
Apartir de agora, iremos desenvolver alguns exemplos de programas utilizando display
LCD alfanumricos.
1 Programa:
Vamos elaborar um programa utilizando os recursos das funes de display LCD do
MikroC para que funcione da seguinte maneira:
Nosso hardware esta operando o LCD no formato 8 bits
Inicialmente ser escrito uma string na primeira linha do display LCD e outra na
segunda linha.
As mensagem devero se deslocar 16 casas para a direita e posteriormente dever
retornar ao seu local de origem:
Cada deslocamente levar aproximadamente 200 milisegundos.
Microcontrolador: PIC18F4x2
Cristal: 8MHz
Acompanhe o harware:
Obs: repare neste programa que o pino R/W do display LCD foi aterrado, e na funo
lcd8_config foi declarado como sendo pino RE4. O pino R/W normalmente no
utilizado nas maioria das aplicaes, neste caso, como a
funo lcd8_config necessita de algum parmetro, informamos um valor qualquer,
neste caso foi um pino inexistente no chip. (lembre-se que todos os ports do PIC so
composto por 8 bits, neste caso a posio de memria RE4 existe, porm no tem
aplicao para este chip).
Regras do C: Se na declarao de uma funo declararmos "n"
parametros, necessriamente deveremos enviar todos os "n" parmetros na
chamada desta funo.
2 Programa:
Nosso segundo programa, tem como objetivo escrever no display LCD o valor
numrico 100 armazenado em uma varivel do tipo char, chamada "contador".
Utilizaremos o mesmo esquema eletrnico apresentado do exemplo 01.
Acompanhe:
/*********************** Animao de Display LCD ************************
Centro de Tecnologia Microgenios
Programa: Animao LCD
Compilador: MikroC
Cristal: 8Mhz
Microcontrolador: PIC18F452
Objetivo: enviar para o display LCD o valor da varivel contador
*************************************************************************/
void main() {
unsigned char contador = 100; //declara varivel char contador e
atribui o valor 100
unsigned char texto[10]; //cria vetor (array) do tipo char com 11
elementos (os indice comeam do 0)
trisd = 0; //configura todos os pinos do portd como sada
trise = 0; //configura todos os pinos do porte como saida
ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso
geral
lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //
lcd8_cmd(lcd_clear);
//apaga display LCD
lcd8_cmd(lcd_cursor_off); //desliga cursor
Se voc pensou que iria aparecer no display LCD o valor da varivel contador no
display LCD voc se enganou.
Vamos analizar com mais calma:
Seu display LCD somente pode operar com caracterer, ou seja, char. Lembre-se que o
barramento do LCD de 8 bits, no qual permite o envio de valores de 0 a 255 no
mximo.
Cada caracterer no padro ASCII do comprimento de um char, neste caso voc j
comea a pensar...
"Tenho que enviar um caracter por vez no display LCD".
exatamente isso, temos que enviar caracter por caracter, caso nossa intenso seja
escrever uma mensagem no visor do LCD.
Nosso compilador possui algumas bibliotecas que iro nos ajudar e muito na elaborao
do nosso programa. Utilizamos uma funo chamada bytetostr no programa, que tem
por objetivo converter o valor numrico de uma varivel para String e armazenar em
uma Tabela (vetor).
" Professor, estou com uma dvida !! . Afinal qual a diferena entre um caractere e uma string???
Na linguagem C diferenciamos um caractere de uma string atravs das aspas simples ' e aspas duplas ".
Exemplo:
'A' ---> caractere A padro ASCII
"A" ---> string A
mas qual a diferena?
Caractere:
todo caractere ASCII possui um valor numrica (consulte o menu Tools > ASC Chart do MikroC)
String:
No exite uma representao numrica para uma string, pois est composta por caractere + 1
caractere de terminao, chamado "Null", cujo valor Zero.
ento teremos:
"A" ---> igual a: --- > 'A' (caractere) + "\0" (caractere de terminao de string null)
Pense e responda:
Qual o nmero que representa seu nome?
resp:
No existe um nmero que represente seu nome, e isso acontece em qualquer string.
3 Programa:
Este Terceiro programa tem por objetivo mostrar utilizar os recursos da memria
CGRAM do display LCD. Neste exemplo, aparecer um pequeno "cavalinho" andando
no display LCD alfanumrico.
Teste este programa no seu kit PICgenios e veja o resultado:
32
32
32
32
12
31
31
28
,
,
,
,
,
,
,
,
32 , 32 , 32 , 3 , 7 , 14 , 14};
32 , 32 , 32 , 15 , 31 , 31 , 31};
32 , 32 , 32 , 3 , 31 , 31 , 31};
1 , 31 , 31 , 31 , 27 , 19 , 16};
24 , 16 , 1 , 1 , 1 , 32 , 32};
31 , 30 , 23 , 32 , 32 , 16 , 32};
31 , 1 , 1 , 1 , 1 , 32 , 32};
28 , 4 , 4 , 8 , 32 , 32 , 32};
const
const
const
const
const
const
const
const
char
char
char
char
char
char
char
char
character1a[]
character2a[]
character3a[]
character4a[]
character5a[]
character6a[]
character7a[]
character8a[]
=
=
=
=
=
=
=
=
{
{
{
{
{
{
{
{
32
32
32
32
16
31
31
24
,
,
,
,
,
,
,
,
32 , 32 , 32 , 32 , 7 , 15 , 30};
32 , 32 , 32 , 14 , 31 , 31 , 31};
32 , 32 , 32 , 7 , 31 , 31 , 31};
2 , 31 , 31 , 31 , 27 , 19 , 16};
32 , 32 , 1 , 1 , 1 , 32 , 32};
31 , 27 , 18 , 1 , 1 , 17 , 32};
31 , 1 , 1 , 1 , 1 , 32 , 32};
28 , 4 , 8 , 16 , 32 , 16 , 32};
const
const
const
const
const
const
const
const
char
char
char
char
char
char
char
char
character1b[]
character2b[]
character3b[]
character4b[]
character5b[]
character6b[]
character7b[]
character8b[]
=
=
=
=
=
=
=
=
{
{
{
{
{
{
{
{
32 , 32 , 32 , 7 , 15 , 14 , 28 , 24};
32 , 32 , 32 , 15 , 31 , 31 , 31 , 3};
32 , 32 , 32 , 3 , 31 , 31 , 31 , 31};
1 , 31 , 31 , 31 , 27 , 27 , 16 , 16};
19 , 19 , 2 , 2 , 4 , 32 , 32 , 32};
31 , 7 , 14 , 6 , 1 , 32 , 32 , 32};
15 , 7 , 19 , 15 , 32 , 16 , 32 , 32};
16 , 24 , 12 , 4 , 2 , 1 , 32 , 32};
LCD8_Chr_cp(3);
lcd8_chr(pos_row1, pos_char1, 4);
LCD8_Chr_cp(5);
LCD8_Chr_cp(6);
LCD8_Chr_cp(7);
}
}
void main() {
unsigned char texto[10];
trisd = 0; //configura todos os pinos do portd como sada
trise = 0; //configura todos os pinos do porte como saida
ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral
lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //
lcd8_cmd(lcd_clear);
//apaga display LCD
lcd8_cmd(lcd_cursor_off); //desliga cursor
while(1){
escreve (1,1,2,1,3);
delay_ms(100);
escreve (1,1,2,1,2);
delay_ms(100);
escreve (1,1,2,1,1);
delay_ms(100);
}
}