You are on page 1of 28

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Os Displays LCD Alfanumricos

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 das Pinagens:


Pino Funo
1 alimentao
2 Alimentao
3
4
5
6
7
8
9
10
11
12
12
14
15
16

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)

Alm da pinagem importante entendermos uma outra caracterstica de hardware


desse dispositivo, que so suas reas de memria; ele possui trs reas de
memria com funes bem diferentes:

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.

Endereo de cada caracter no display 16 x 2


Abaixo est o endereo em hexadecimal de cada caracter no display LCD 16 x 2,
assim fica mais fcil a movimentao do cursor e das letras a serem escritas:

Lista de cdigos dos Caracteres


A seguir o cdigo que devemos enviar para o LCD a fim de obtermos um determinado caracter:

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.

interessante atentarmos para a seguinte caracterstica, a via de dados e


instrues a mesma, dessa forma a sinalizao, que indica se o Byte que chega
no display dado ou instruo proveninte do sinal encontrado no pino 4 (RS):
RS = 0 -> Instruo
RS = 1 -> Dado
Outra caracterstica importante que precisamos pulsar (de 1 para 0) o sinal
Enable (pino 6) para que a informao que chega aos terminais do LCD seja
interpretada pelo controlador do display.
Em nosso estudo manteremos o pino 5 (R/W) em zero, pois apenas escreveremos
no LCD. Podemos ligar este pino do LCD no PIC tambm.

Para utilizarmos esse novo dispositivo em nossos projetos, devemos seguir


alguns passos:
1 Inicializar o LCD: Primeiramente criar uma rotina em nosso programa, que envie
para o display uma sequncia de informaes que determinar o modo com o qual
trabalharemos, com por exemplo:
-

Definio da matriz de pontos (nosso caso 5 x 7)


Definio do cursor
Definio da direo de deslocamento (mensagem ou cursor)
Limpeza do display.

O mikroC automaticamente carrega as rotinas de inicilizao do LCD na compilao de


um programa. O programador no precisa se preocupar em inicilizar o LCD desde que o
hardware do dispositivo esteja configurado no programa corretamente no modo 4 ou 8
bits; (veremos com detalhes mais adiante).

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:

Tabela com as instrues mais comuns:

Resumo com as instrues mais teis:

Endereos de cada caractere no LCD 16x2


Abaixo est o endereo em hexadecimal de cada caracter no display LCD 16 x 2,
assim fica mais fcil a movimentao do cursor e das letras a serem
escritas:(ENDEREOS EM HEXADECIMAL)

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.

Definindo o modo de operao do LCD.


Os LCD's podem ser programados para operarem das seguintes formas:
modo 8 bits
modo 4 bits

No mikroC possvel trabalhar com os LCD's nos dois modos.


no modo 8 bits.
no modo 4 bits - somente um port de controle/dados
no modo 4 bits - com dois ports para controle e dados do LCD

LCD Modo 8 Bits


No modo 8 bits, todos os pinos do barramento de dados do LCD so utilizados,
conforme figura abaixo:

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.

O compilador mikroC possui diversas bibliotecas de funes prontas para trabalharmos


com displays LCD. Para exemplificar, vamos apresentar um programa em C que utiliza
os recursos das funes de controle de LCD do compilador mikroC, acompanhe:

/*********************************************************************
*****
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
}

Descrio detalhada do programa:


O programa acima tem a funo de escrever no LCD 16X2 duas mensagens
"Microgenios" na primeira linha do LCD, e "KIT PICGENIOS" na segunda linha do
LCD.
A funo main(), j conhecemos.
Os comando abaixo definem os sentidos das portas de i/o do PIC.
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

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

A funo lcd8_config acima, determina os PORTs e os pinos que participam do


controle do LCD:
Port que controla o LCD:
PORTE
Funes dos pinos de controle do port de controle:
RS: 1
EN: 1
RW: 0

//pino RE2
//pino RE1
//pino RE0

Port de dados do LCD;


PORTD
Funes dos pinos do port de dados no LCD;
D7: 7
D6: 6
D5: 5
D4: 4
D3: 3
D2: 2
D1: 1
D0: 0

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

Configuramos ento nosso lcd conforme figura abaixo:

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):

No mikroC podemos configurar o LCD de diversas formas diferentes. Atravs da


funo lcd8_cmd(), podemos determinar diversas "tarefas" que o LCD dever executar.
Acompanhe:
Sintaxe:
Lcd8_cmd(comandos_LCD);
onde:
Comando_LCD pode ser:
Comandos
Descrio
LCD_FIRST_ROW
Move cursor para primeira linha do LCD
LCD_SECOND_ROW
Move cursor para segunda linha do LCD
LCD_THIRD_ROW
Move cursor para a terceira linha do LCD
LCD_FOURTH_ROW
Move cursor para a quarta linha do LCD
LCD_CLEAR
Apaga display
LCD_RETURN_HOME
Retorna cursor para a primeira coluna da primeira linha do LCD
LCD_CURSOR_OFF
Desliga cursor
LCD_UNDERLINE_ON
Salta cursor para a linha inferior
LCD_BLINK_CURSOR_ON
Ativa o modo piscante do cursor
LCD_MOVE_CURSOR_LEFT Move cursor para a esquerda sem movimentar os textos
LCD_MOVE_CURSOR_RIGHTMove cursor para a direita sem movimentar os textos
LCD_TURN_ON
Liga cursor
LCD_TURN_OFF
Apaga todo o visor do LCD, sem perder os dados no visor
LCD_SHIFT_LEFT
Movimenta textos do LCD para a esquerda
LCD_SHIFT_RIGHT
Movimenta textos do LCD para a direita
No exemplo utilizamos o seguinte comando para apagar o display LCD:
lcd8_cmd(lcd_clear); //apaga 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

E agora escrevemos a mensagem "Microgenios" na coordenada informada pela


funo lcd8_out no LCD.
lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do
LCD

Os nmeros 1, 1 da funo acima, informa que a mensagem "Microgenios" ser escrita


na primeira linha da primeira coluna do LCD. o Primeiro numero informa a linha do
LCD e o segundo nmero informa a coluna do LCD.
Os displays LCD so constituidos de linhas e colunas conforme podemos ver na figura
abaixo:

O LCD apresentado possui 4 linhas por 20 colunas.


Podemos escrever um dado em qualquer posio do LCD. basta informar a linha e a
coluna para inicio do texto.

No caso de desejarmos escrever uma mensagem "ligado" na quarta linha, dcima


coluna do LCD 20 x 4, basta escrever o seguinte comando:
lcd8_out(4,10,"ligado"); // escreve mensagem na quarta linha, dcima
coluna do lcd 20 x 4

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
}

Neste exemplo repare que utilizamos a mesma configurao de hardware do LCD


anterior. Repare que agora temos um comando novo em nosso programa, o comando
lcd8_out_cp, cuja funo escrever no lcd uma string ou varivel na corrente posio
do cursor.
Repare que o comando lcd8_out(1,1,"Maquina: "); deixa o cursor posicionada na
stima coluna da primeira linha do lcd. O prximo comando que vem em seguida no
programa lcd8_out_cp(texto), que escreve na posio do cursor do lcd o valor da
varivel "texto", que neste caso a string "ligado".
Teremos como resultado:
Maqu i n a : L i gado
P r o g : L i g a do

LCD Modo 4 bits - Somente um port de controle/dados


No modo de 4 bits, devemos ligar apenas o nibble mais significativo (DB4 a DB7)
do barramento de dados do LCD ao microcontrolador, conforme o esquema eltrico
seguinte:

Para exemplificar este modo 4 bits iremos apresentar um programa:


/*********************************************************************
*****
Centro de tecnologia Microgenios
Programa exemplo: LCD_modo_4bits_00.c
Este programa tem por objetivo escrever a mensagem "teste LCD" na
primeira
linha do LCD. Programa no modo 4 bits
**********************************************************************
****
*/

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);
}

Descrio detalhada do programa:


O programa acima tem a funo de escrever na primeira linha do display lcd o texto
"teste LCD". Repare na imagem acima que utilizamos somente um port do PIC para
controle e envio de dados para o LCD.
Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada
um dos comandos:
O comando lcd_config ( ):
O comando lcd_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:
lcd_config(&port_controle/dados, RS, EN, RW, D7, D6, D5, D4 );

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

A funo lcd_config acima, determina o PORT e os pinos que participam do controle


do LCD:
Port que controla o LCD:
PORTD

Funes dos pinos de controle do port de controle:


//pino RD2
//pino RD3
//qualquer valor de outro pino, pois o RW do LCD
esta aterrado

RS: 1
EN: 3
RW: 2

Port de dados do LCD;


PORTD
Funes dos pinos do port de dados no LCD;
D7: 7
D6: 6
D5: 5
D4: 4

//pino
//pino
//pino
//pino

RD7
RD6
RD5
RD4

do
do
do
do

PORTD
PORTD
PORTD
PORTD

PODEMOS ATERRAR O PINO R/W DO LCD, POIS AS FUNES DE CONTROLE DE LCD


DO MIKROC NO UTILIZA ESTE PINO SIMPLESMENTE DEIXAM ESTE PINO EM NIVEL
LGICO 0. CASO VENHAMOS A ATERRAR O PINO RW, ECONOMIZAREMOS 1 PINO DE
I/O DO PIC.

Os demais comandos do programa estudamos anteriormente, em caso de dvida leia


novamente o contedo do tpico lcd modo 8 bits.

LCD Modo 4 bits - Controlado por dois ports do PIC


Este mais um dos modos 4 bits de trabalharmos com LCD. Neste novo modo podemos
ter um port de controle e outro port do PIC para dados. Veja o esquema abaixo:

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

// programa pinos de A/D como I/O de uso

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);
}

Descrio detalhada do programa:


O programa acima tem a funo de escrever na primeira linha, quarta coluna do display
lcd o texto "Programa LCD". Repare no esquema eletrnico acima que temos dois ports
do PIC ligado ao LCD.
Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada
um dos comandos:
O comando lcd_custom_config ( ):
O comando lcd_custom_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:
lcd_config(&port_dados, D7, D6, D5, D4, &port_controle, RS, RW, EN );

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

A funo lcd_custom_Config acima, determina os PORTs e os pinos que participam


do controle e envio de dados para o LCD:
Port que controla o LCD:
PORTA

Funes dos pinos de controle do port de controle:


//pino RA1
//pino RA3
//qualquer valor de outro pino, pois o RW do LCD
esta aterrado, neste caso conectados a RA2

RS: 1
EN: 3
RW: 2

Port de dados do LCD;


PORTD
Funes dos pinos do port de dados no LCD;
D7: 0
D6: 2
D5: 4
D4: 5

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

figura 01 - Esquema eltrico


/*********************** Animao de Display LCD ************************
Centro de Tecnologia Microgenios
Programa: Animao LCD
Compilador: MikroC
Cristal: 8Mhz
Microcontrolador: PIC18F452
Objetivo: Deslocar as mensagem dos display LCD para a direita e para a
esquerda
utilizando lao For.
*************************************************************************/
void main() {
unsigned char inc = 0;

//declara variavel chamada "inc" como char

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
lcd8_out(1,1,"Microgenios");
//escreve no display LCD
lcd8_out(2,1,"KIT PICGENIOS");
//escreve no display LCD
//*********** desloca mensagens do lcd para a direita
*********************
for (inc = 0 ; inc < 16 ; inc++){
lcd8_cmd(LCD_SHIFT_RIGHT); //desloca mensagem para a direita
Delay_ms(200);
//aguarda 200 milisegundos
}

//*********** desloca mensagens do lcd para a esquerda


*********************
for (inc = 0 ; inc < 16 ; inc++){
lcd8_cmd(LCD_SHIFT_left); //desloca mensagem para a esquerda
Delay_ms(200);
//aguarda 200 milisegundos
}
while(1); //loop infinito
}

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

bytetostr(contador, texto); //converte o valor numrico de


contador e atribui ao vetor Texto
lcd8_out(1,1,texto);
//escreve no display LCD o valor do vetor
texto
while(1); //loop infinito
}

O programa deste exerccio possui muitas informaes importantes, dentre elas, a


utilizao de Arrays, ou como neste caso chamado, vetor.
Para que possamos enviar o valor numrico presente em uma varivel qualquer, a
principio precisamos converter cada um de seus algorismo em caracterer, pois a funo
de display LCD do MikroC somente opera com caracteres e string.
Um erro comum (acredito que voc j tentou), utilizar as funes dessa forma:
lcd8_out(1,1,contador);
varivel contador

//escreve no display LCD o valor da

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.

Veja como ficar o resultado no modo de debugao no MikroC:

Figura 02 - Debugao do programa anterior


Perceba o preenchimento do vetor Texto aps a execuo do comando:
bytetostr(contador, texto);

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:

/*********************** 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
http://br.youtube.com/watch?v=NS6-T3bGNd4
*************************************************************************/
//1 caracterer************
const char character1[] = {
const char character2[] = {
const char character3[] = {
const char character4[] = {
const char character5[] = {
const char character6[] = {
const char character7[] = {
const char character8[] = {

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};

void escreve(char pos_row, char pos_char, char pos_row1, char


pos_char1,char num) {
char i;
if (num == 1){
LCD8_Cmd(64);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8[i]);
LCD8_Cmd(LCD_RETURN_HOME);
lcd8_chr(pos_row, pos_char, 0);
LCD8_Chr_cp(1);
LCD8_Chr_cp(2);
LCD8_Chr_cp(3);
lcd8_chr(pos_row1, pos_char1, 4);
LCD8_Chr_cp(5);
LCD8_Chr_cp(6);
LCD8_Chr_cp(7);
}
if (num == 2){
LCD8_Cmd(64);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7a[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8a[i]);
LCD8_Cmd(LCD_RETURN_HOME);
lcd8_chr(pos_row, pos_char, 0);
LCD8_Chr_cp(1);
LCD8_Chr_cp(2);
LCD8_Chr_cp(3);
lcd8_chr(pos_row1, pos_char1, 4);
LCD8_Chr_cp(5);
LCD8_Chr_cp(6);
LCD8_Chr_cp(7);
}
if (num == 3){
LCD8_Cmd(64);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7b[i]);
for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8b[i]);
LCD8_Cmd(LCD_RETURN_HOME);
lcd8_chr(pos_row, pos_char, 0);
LCD8_Chr_cp(1);
LCD8_Chr_cp(2);

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);
}
}

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao


em C
Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou
integral desse material sem prvio aviso. Maiores informaes:
suporte@microgenios.com.br

You might also like