Escolar Documentos
Profissional Documentos
Cultura Documentos
br
www.mecatronicadegaragem.blogspot.com.br
NDICE
NDICE..........................................................................................................................................................................2
INTRODUO..............................................................................................................................................................5
Captulo 1 - O LCD ALFA-NUMRICO ........................................................................................................................9
Figura 1: Display 08X02 sem back-light.........................................................................................................9
Figura 2: Display 16X01 sem back-light.........................................................................................................9
Figura 3: Display 16X02 com back-light.........................................................................................................9
Figura 4: Display 16X04 com back-light.......................................................................................................10
Figura 5: Display 20X01 sem back-light.......................................................................................................10
Figura 6: Display 20X02 sem back-light.......................................................................................................10
Figura 7: Display 20X04 com back-light.......................................................................................................10
Parte 1 - Os caracteres .......................................................................................................................................11
Figura 8: O padro de cada clula de um display 5X7 (em mm).................................................................11
Parte 2 - Conexes..............................................................................................................................................12
Tabela 1: Descrio das funes dos pinos do LCD ...................................................................................12
Figura 9: Controle de contraste de um LCD ................................................................................................13
Parte 3 - Comandos do LCD ...............................................................................................................................14
Figura 10: LCD 16X02 energizado, mas no inicializado. ...........................................................................14
Tabela 2: Instrues para inicializao e configurao do LCD ..................................................................14
Tabela 3: Configuraes possveis para o LCD ..........................................................................................15
Parte 4 - Tabelas de Caracteres .........................................................................................................................17
Tabela 4: Os caracteres do ROM Code A00 ...............................................................................................17
Tabela 5: Os caracteres do ROM Code A02 ...............................................................................................18
Parte 5 - Endereamento ....................................................................................................................................19
Figura 11: Endereamento direto para um LCD 16X02...............................................................................19
Figura 12: Endereamento com deslocamento para um LCD 16X02 .........................................................19
Figura 13: Endereamentos com deslocamento para diversos LCDs.........................................................20
Parte 6 - Rotacionando o LCD ............................................................................................................................20
Parte 7 - A CGRAM Caracteres definidos pelo usurio ...................................................................................20
Figura 14: O modelo do caractere na CG RAM...........................................................................................21
Figura 15: Criando um rob na CG RAM.....................................................................................................21
Figura 16: O rob, traduzido em bits............................................................................................................21
Parte 8 - Transferncia em 8 bits ........................................................................................................................23
Figura 17: Inicializando em 8 vias................................................................................................................23
Parte 9 - Transferncia em 4 bits ........................................................................................................................24
Figura 18: Inicializando em 4 vias................................................................................................................25
Parte 10 - Timing .................................................................................................................................................26
Figura 19: Diagrama de temporizao para o LCD .....................................................................................26
6: Diagrama de temporizao real para o LCD............................................................................................27
Captulo 2 - O HARDWARE .......................................................................................................................................31
Figura 20: Esquemtico para a placa de testes de LCD .............................................................................31
Figura 21: PCI lado dos componentes.........................................................................................................32
Figura 22: PCI lado da solda (trilhas)...........................................................................................................32
Figura 23: Placa de testes conectada ao McPlus via conector ICSP..........................................................32
Captulo 3 - O SOFTWARE ........................................................................................................................................35
Parte 1 Comunicao em 8 vias pela McLAB2 ................................................................................................35
Parte 2 Comunicao em 4 vias pela McLAB2 ................................................................................................38
Definio de constantes ...............................................................................................................................38
Rotina de envio de um nibble ....................................................................................................................38
Rotina de envio de um Byte .........................................................................................................................39
Funo para Limpar o LCD..........................................................................................................................39
Inicializao do LCD.....................................................................................................................................40
Parte 3 Comunicao em 4 vias pela placa de testes .....................................................................................42
Definio de constantes ...............................................................................................................................42
Outras alteraes .........................................................................................................................................42
Exerccio 1 Inicializando o LCD e Ol Mundo.......................................................................................................45
McLAB2 ...............................................................................................................................................................45
Figura 24: Fluxograma para a placa McLAB2 .............................................................................................45
Placa de testes ....................................................................................................................................................50
Figura 25: Fluxograma para a placa de testes ............................................................................................50
Exerccio 2 A funo PRINTF() ...............................................................................................................................57
McLAB2 ...............................................................................................................................................................58
Tutorial LCD em 4 vias
www.mecatronicadegaragem.blogspot.com.br
Figura 26: Fluxograma para a placa McLAB2 .............................................................................................58
Placa de testes ....................................................................................................................................................63
Figura 27: Fluxograma para a placa de testes ............................................................................................63
Exerccio 3 Rotacionando o display ........................................................................................................................71
McLAB2 ...............................................................................................................................................................72
Placa de testes ....................................................................................................................................................76
Exerccio 4 Criando caracteres................................................................................................................................83
Figura 28: Fluxograma para o exemplo 4 ....................................................................................................83
McLAB2 ...............................................................................................................................................................84
Placa de testes ....................................................................................................................................................89
Exerccio 5 Uma pequena animao.......................................................................................................................97
Figura 29: Fluxograma para a animao nas placas McLAB2 e de testes .................................................97
McLAB2 ...............................................................................................................................................................98
Placa de testes ..................................................................................................................................................103
CONSIDERAES FINAIS......................................................................................................................................111
www.mecatronicadegaragem.blogspot.com.br
www.mecatronicadegaragem.blogspot.com.br
INTRODUO
A idia deste material realizar a conexo de um LCD paralelo que utiliza o processador
Hitachi HD44780 ou KS0066U a um microcontrolador PIC, utilizando apenas 4 vias de dados.
Devido sua simplicidade, estes LCDs no so avanados e no possuem recursos como
gerenciamento automtico de pixels, no so coloridos (full color), no possuem iluminao
ativa entre outras limitaes, mas ainda so largamente utilizados na indstria. Basta ver que
muitas registradoras, equipamentos hand-held, sistemas de informao de computadores
servidores entre outros, ainda utilizam largamente este dispositivo.
Os testes foram executados em uma placa Mosaico McLAB2 e em uma placa
confeccionada para esta finalidade. Os diagramas para esta placa encontram-se no captulo
referente ao hardware.
Este material foi desenvolvido utilizando o MPLAB 7.21 e o compilador PCWH 3.168
(verso gratuita).
Estes procedimentos tambm foram testados em Assembly, mas est fora do escopo
deste trabalho. Para programao e gravao do microcontrolador existente nas placas utilizei
o McPLUS (tambm da Mosaico). Isto garantiu uma perfeita integrao ao MPLAB e s
caractersticas de gravao in circuit (ICSP).
Os PICs testados foram o PIC16F628A, PIC16F877A e o PIC18F452.
www.mecatronicadegaragem.blogspot.com.br
www.mecatronicadegaragem.blogspot.com.br
www.mecatronicadegaragem.blogspot.com.br
www.mecatronicadegaragem.blogspot.com.br
www.mecatronicadegaragem.blogspot.com.br
10
www.mecatronicadegaragem.blogspot.com.br
Parte 1 - Os caracteres
Basicamente, cada "clula" (caractere) do LCD composto de 8 pixels na horizontal e
de 5 pixels na vertical, ou seja, cada "clula" representada da seguinte forma (todas as
medidas so em mm):
Estes caracteres so conhecidos como 5X7, uma vez que a linha inferior normalmente
reservada para o cursor. Existem tambm displays que possuem 11 pixels de altura. Os
caracteres deste LCD so conhecidos como 5X10 e tem a vantagem de que no existe a
distncia entre a primeira e a segunda linha. Os caracteres podem parecer contguos.
11
www.mecatronicadegaragem.blogspot.com.br
Parte 2 - Conexes
Basicamente os LCDs alfa numricos seguem um padro de especificao de interface,
onde esto presentes 14 pinos de acesso (para os LCDs sem iluminao em "back-light") ou 16
pinos (para os que possuem iluminao em "back-light"). Na verdade, estes pinos so pads
soldveis para a insero de conectores IDC e so classificados em 8 pinos para controle de
dados, trs linhas de controle e trs linhas de alimentao. Iremos detalhar cada um a seguir.
As conexes esto dispostas em 1 linha de 14 (ou 16) pinos lado a lado, onde podemos utilizar
uma barra de pinos SIL ou em duas linhas de 7 (ou 8) pinos, onde nos valeremos de um
conector DIL. Na figura 1 podemos ver um exemplo de conector DIL e na figura 2 o exemplo
mostra um display com conexo SIL.
Na maioria dos displays, a pinagem est impressa e torna mais fcil a identificao de
cada um. Mas, nos casos onde no h identificao impressa, lembre-se que o pino 1
sempre o terra e deve possuir uma trilha mais larga ou estar aterrado na carcaa em algum
ponto da trilha.
A funo de cada pino resumida de acordo com a tabela abaixo:
Pino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nome
Vss
Vdd
Vo
RS
R/W
E
D0
D1
D2
D3
D4
D5
D6
D7
A
K
Funo
Terra
Positivo (normalmente 5V)
Apesar dos LCDs serem projetados para trabalharem com 5V, consumindo apenas
alguns miliampres, tenses entre 4,5V e 6V funcionam perfeitamente. Alguns mdulos
tambm funcionam com 3V. Por isso, o mais indicado sempre ler o data sheet do LCD que
voc possui para saber melhor seus recursos e limitaes. Por estas razes que o LCD pode
ser utilizado, sem problemas, em equipamentos alimentados por pilhas e baterias. O consumo
deles bem menor que o de um simples LED!
Como j dito antes, o pino 1 (Vss) o terra do mdulo LCD e pode ser ligado juntamente
com o pino Vss do PIC.
O Pino 2 (Vdd) o positivo e deve ser ligado juntamente com o Vdd do PIC
O pino 3 (Vo) onde controlamos o contraste do LCD, ou seja, onde controlamos se o
que ir aparecer no LCD ser "escuro" ou "claro". Para isso devemos lig-lo a um
potencimetro ou trim-pot de 10KR conectado ao Vss e Vdd (atuando como um divisor de
tenso) de acordo com o esquemtico a seguir:
12
www.mecatronicadegaragem.blogspot.com.br
O pino 4 (RS) o Seletor de Registros. Resumindo, quando este pino est em nvel
lgico baixo (0), os dados enviados para o LCD so tratados como comandos e os dados lidos
do LCD indicam o seu estado atual (status). Quando este pino est em nvel lgico alto (1), os
dados so tratados como caracteres, tanto para leitura como para escrita.
Para indicar se os dados sero lidos ou escritos no LCD, existe o pino 5 (R/W) que
controla exatamente se a operao em andamento ser de leitura (quando estivem em nvel
lgico alto - 1) ou gravao (quando estiver em nvel lgico baixo - 0).
O pino 6 (E) a linha de habilitao para os comandos do LCD. utilizado para iniciar a
transferncia de comandos ou caracteres entre o mdulo e as linhas de dados. Quando estiver
escrevendo para o display, os dados sero transmitidos apenas a partir de uma transio de
high para low (H -> L) deste sinal. No entanto, para ler informaes do display, as informaes
estaro disponveis imediatamente aps uma transio L -> H e permanecer l at que o sinal
volte para o nvel lgico baixo (0) novamente.
Os pinos 7 a 14 fazem parte do barramentos de dados. Ele trabalha com os oito sinais
em paralelo ou ainda pode trabalhar com um barramento de 4 vias (normalmente D4 a D7),
mas os dados devem ser transmitidos em dois pacotes. Cada pacote de quatro bits
conhecido como "nibble". Este um excelente recurso para minimizar o uso de pinos de I/O do
microcontrolador, mas ocupa um pouco mais de memria. A deciso de utilizar 8 vias ou 4 vias
exclusiva do desenvolvedor do projeto.
13
www.mecatronicadegaragem.blogspot.com.br
Parte 3 - Comandos do LCD
Ao ligar o LCD na alimentao, a primeira linha fica toda preenchida (veja foto abaixo).
Para que ele fique operacional, precisamos inicializ-lo, passando diversas informaes de
configurao. Para isso, existem alguns parmetros que precisam ser definidos. A tabela 2 a
seguir mostra quais so estes comandos.
Instruo
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
NOP
Clear Display
Cursor Home
Entry Mode
Set
I/D
S/C
R/L
DL
Endereo DDRAM
BF
Write Data
Dado
Read Data
Dado
Display
Control
Cursor /
Display shift
Function Set
Set CGRAM
Address
Set DDRAM
Address
Busy Flag &
Address
x : Sem
importncia
I/D
S
D
C
B
S/C
1
0
1
0
1
0
1
0
1
0
1
0
Endereo CGRAM
Incrementa
Decrementa
Deslocamento automtico do display
Display ON (ligado)
Display OFF (desligado)
Cursor ON (ligado)
Cursor OFF (desligado)
Cursor piscando
R/L
DL
N
F
Descrio
Sem efeito
Limpa o display e seta contador de
endereo para zero.
Seta contador de endereo para
zero, retorna o cursor para a
posio original.
O contedo da DD RAM permanece
inalterado.
Seta a direo do movimento do
cursor (I/D) e especifica
deslocamento automtico (S).
Liga e desliga o Display (D), cursor
(C) e ativa cursor piscante, (B).
Desloca o display ou move o cursor
(S/C) e especifica a direo (R/L).
Seta nmero de bits para
comunicao (DL), nmero de linhas
(N) e tamanho da fonte (F).
Seta o endereo da CGRAM. O
dado (endereo) enviado junto.
Seta o endereo da DDRAM. O
dado (endereo) enviado junto.
1
0
1
0
1
0
1
0
Ciclos
de
Clock
0
165
3
3
3
3
3
3
0
3
3
14
www.mecatronicadegaragem.blogspot.com.br
Baseados na tabela anterior verificamos que existem diversas configuraes que podem
ser atribudas ao LCD. A tabela a seguir mostra as opes disponveis.
15
www.mecatronicadegaragem.blogspot.com.br
Lembre-se que, antes de qualquer operao com o LCD ele precisa ser inicializado
utilizando estas informaes da Tabela 3. importante salientar que no existe uma ordem
especfica para os itens de configurao especificados acima. Eles podem ser enviados em
qualquer ordem, uma vez que o bit mais significativo de cada categoria indica o seu grupo de
configurao. No entanto para o processo de inicializao, importante que antes de
entrarmos nos grupos acima, existe uma ordem que deve ser respeitada. Isso ser visto em um
captulo especfico que ir abordar a rotina de inicializao do display.
16
www.mecatronicadegaragem.blogspot.com.br
Existe outra tabela que tambm encontrada nos LCDs, mas so mais raras.
Geralmente os LCDs mais caros possuem esta opo. Novamente, sempre muito importante
Tutorial LCD em 4 vias
17
www.mecatronicadegaragem.blogspot.com.br
ler o data sheet do seu mdulo de LCD antes de prosseguir com o desenvolvimento do projeto.
A tabela a seguir ilustra os caracteres pertencentes ao ROM Code A02:
Como voc pode reparar, os caracteres acentuados que temos em portugus somente
estaro disponveis nesta verso de ROM. Os LCDs so fornecidos com apenas um tabela de
caracteres.
Para evitar que os mdulos sejam rgidos no que diz respeito a caracteres exibidos,
todos eles possuem uma rea especfica para caracteres criados pelo usurio. Esta rea
Tutorial LCD em 4 vias
18
www.mecatronicadegaragem.blogspot.com.br
chama-se CG RAM e voltil, ou seja, se desligarmos o LCD ou o reiniciarmos, todas estas
informaes sero perdidas. Termos um captulo especfico sobre a CGRAM.
Parte 5 - Endereamento
Aps ligarmos o LCD e o iniciarmos, o cursor ir para a primeira posio que a 0x00
(primeira linha x primeira coluna). De acordo com que vamos inputando dados nele, o cursor ir
deslocar para as posies seguintes. Este auto-incremento uma facilidade muito
interessante, pois dispensa especificar cada posio para cada caractere em separado,
economizando (e muito) em linhas de cdigos necessrias.
fMas, e se quisermos escrever em um ponto especfico do LCD?
Neste caso, podemos especificar exatamente qual o endereo que o cursor dever
estar para exibir o caractere desejado. Este dado ser passado para o LCD pelas mesmas vias
de dados que passamos um caractere, s que dessa vez ser um comando. De acordo com a
Tabela 2, para entrarmos com um comando para setar um endereo na DDRAM do LCD
precisaremos ter o pino RS e RW em nvel lgico baixo e o bit mais significativo precisa estar
obrigatoriamente em nvel lgico alto. Com isso podemos enderear at 128 posies e, ao
passar o endereo, deveremos somar este bit, ou seja, precisaremos somar o valor 0x80 ao
endereo desejado.
Para ilustrar, o endereamento de um display LCD 16X02 o seguinte:
Como devemos, obrigatoriamente fazer com que o bit mais significativo do endereo
seja 1, o valor que devemos passar para o LCD obedece figura abaixo:
19
www.mecatronicadegaragem.blogspot.com.br
Para facilitar as contas, segue abaixo o endereamento para a maioria dos LCDs
comerciais:
20
www.mecatronicadegaragem.blogspot.com.br
21
www.mecatronicadegaragem.blogspot.com.br
Lembrando que, pelo fato do byte ter 8 bits e o caractere ter apenas 5 bits, os 3 bits
mais significativos sero sempre 0. Agora fica fcil para entendermos que o rob pode ser
traduzido nos seguintes bytes (sempre de cima para baixo): 00001110, 00010001, 00001110,
00000100, 00011111, 00000100, 00001010 e 00010001. Passando para hexadecimal, teremos
que o robozinho decomposto nos bytes 0x0E, 0X11, 0X0E, 0X04, 0X1F, 0X04, 0X0A e 0X11.
Agora que j vimos como decompor um caractere, vamos aprender a program-lo na
CGRAM. De acordo com a Tabela 2, precisamos enviar o comando SET CGRAM ADRESS
juntamente com o endereo do caractere inicial que desejamos gravar. Ento, para iniciar a
programao pelo primeiro caractere disponvel, precisamos enviar o comando 00010000 para
o LCD dizendo para posicionar o ponteiro no primeiro endereo da CGRAM. A seguir
precisaremos enviar os 8 bytes que compes o caractere. Voil! O nosso robozinho comea a
aparecer na tela e pode ser acessado normalmente pelo endereo 0x00!
Agora, se continuarmos inserindo informaes de bytes, automaticamente o ponteiro
passar para o segundo caractere na CG RAM e assim sucessivamente. Ento para
programarmos os oitos caracteres, bastaria posicionar na posio inicial (0x00) e passarmos 64
bytes diretamente para o LCD.
Maiores detalhes sero vistos durante os exerccios onde criaremos diversos caracteres
para uso.
22
www.mecatronicadegaragem.blogspot.com.br
23
www.mecatronicadegaragem.blogspot.com.br
24
www.mecatronicadegaragem.blogspot.com.br
25
www.mecatronicadegaragem.blogspot.com.br
Parte 10 - Timing
Antes de passarmos definitivamente para a parte prtica deste tutorial, precisamos
conhecer uma limitao dos LCDs: o tempo de sincronizao, tambm conhecido como
TIMING. Independentemente da velocidade em que seu projeto/prottipo opera, existe um
tempo mnimo que o LCD precisa para processar as informaes. Se este tempo no for
respeitado, o LCD no funcionar.
A figura abaixo ilustra o grfico de tempo que o LCD opera
Parmetro
tAS
tAH
tDS
tDH
tDA
tEH
tEL
tRF
Descrio
Tempo de set-up do endereo (Address set-up time).
Tempo de reteno do endereo (Address hold time).
Tempo de ajuste do dado (Data set-up time).
Tempo de reteno do dado (Data hold time).
Tempo de acesso ao dado (Data access time).
Tempo para habilitar nvel 1(Enable high time time).
Tempo para habilitar nvel 0(Enable low time).
Tempo de transio (Rise/Fall time).
Tempo
Mnimo 140ns
Mnimo 10ns
Mnimo 200ns
Mnimo 20ns
Mnimo 320ns
Mnimo 450ns
Mnimo 500ns
Mnimo 25ns
Mas cuidado Este diagrama no conta toda a histria. Apesar de o LCD precisar
apenas destes tempos para a execuo, diversos flags internos precisam ser setados que,
aliados a outros fatores, tornam o processo de temporizao muito maior. A maioria dos
comandos ocupam o LCD por at 40us e outros podem demandar at 3ms para serem
liberados. exatamente por isso que existe um flag chamado BUSY que indica se o display
est pronto para executar outra instruo ou no. A funo para esta operao a READ
STATUS.
Em caso onde no utilizamos o modo de leitura do LCD, podemos nos basear em um
tempo mnimo que cada operao precisa para ser completada. A tabela a seguir ilustra os
tempos necessrios.
26
www.mecatronicadegaragem.blogspot.com.br
Instruo
Limpar ao Display (Clear Display)
Ir para a posio inicial (display & Cursor Home)
Entrada de caracteres (Character Entry Mode)
Controles de Display e Cursor (Display On/Off &
Cursor)
Deslocamento do display e do cursor (Display/Cursor
Shift)
Ajustes de funes (Function Set)
Setar endereo da CGRAM (Set CGRAM Address)
Setar endereo do display (Set Display Address)
Escrever dados (Write Data)
Ler dados (Read Data)
Led o estado (Read Status)
Tempo
82us a 4,1ms
40us a 4,1ms
40us
40us
40us
40us
40us
40us
40us
40us
1us
27
www.mecatronicadegaragem.blogspot.com.br
28
www.mecatronicadegaragem.blogspot.com.br
Captulo 2 O Hardware
29
www.mecatronicadegaragem.blogspot.com.br
30
www.mecatronicadegaragem.blogspot.com.br
Captulo 2 - O HARDWARE
Apesar de este tutorial ter sido desenvolvido para utilizao na placa Mosaico McLAB2,
quem no possuir esta placa poder fazer uma placa para testes. O esquemtico para tal placa
de testes mostrado na figura abaixo. Para testes realizados na placa McLAB2 nenhuma
alterao necessria.
31
www.mecatronicadegaragem.blogspot.com.br
A placa de circuito impresso sugerida mostrada nas figuras abaixo e tem 2.225 X
1.600 (aproximadamente 56,5mm X 40.6mm).
32
www.mecatronicadegaragem.blogspot.com.br
Captulo 3 O Software
33
www.mecatronicadegaragem.blogspot.com.br
34
www.mecatronicadegaragem.blogspot.com.br
Captulo 3 - O SOFTWARE
Esta seo ser dividida em trs partes. A primeira e a segunda sero inteiramente
focadas na McLAB2, onde apresentaremos, na parte 1, o cdigo para comunicao em 8 vias e
em seguida o cdigo necessrio para estabelecer a comunicao em 4 bits na parte 2. Todo o
detalhamento explicitado no prprio cdigo.
Na terceira parte iremos demonstrar a comunicao em 4 bits na placa de testes
apresentada no captulo anterior. Como no h ligao fsica das 8 vias de dados nela,
obviamente no iremos demonstrar esta comunicao. Mas ser facilmente verificado que o
cdigo detalhado para a McLAB2 ser perfeitamente aproveitado com pequenas mudanas.
Parte 1 Comunicao em 8 vias pela McLAB2
Este o cdigo necessrio para exibir uma mensagem no LCD, utilizando o PORTD do
PIC16F877A da placa McLAB2
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 23/09/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
*
*
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Este exemplo foi elaborado para explicar o funcionamento do mdulo de LCD.
Foi utilizado um barramento de 8 vias de comunicao pelo PORTD
#include
<16f877A.h> // microcontrolador utilizado
#fuses
xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
//
configurao
fusveis
#use delay(clock=4000000, RESTART_WDT)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#bit rs = porte.0
// via do LCD que sinaliza recepo de dados ou comando
#bit enable = porte.1
// enable do lcd
dos
35
www.mecatronicadegaragem.blogspot.com.br
********************/
36
www.mecatronicadegaragem.blogspot.com.br
portc=0x00;
portd=0x00;
porte=0x00;
// limpa portc
// limpa portd
// limpa porte
tela_principal();
37
www.mecatronicadegaragem.blogspot.com.br
Definio de constantes
Antes de comearmos a programao propriamente dita, precisamos informar quais so
os pinos de I/O que sero utilizados pelo nosso LCD. Este procedimento faz com que a
portabilidade entre os cdigos e entre LCDs seja maximizada. Estas so as linhas que
devemos incluir em nosso programa principal, juntamente com outras constantes internas:
#define
#define
#define
#define
#define
#define
lcd_enable
lcd_rs
lcd_db4
lcd_db5
lcd_db6
lcd_db7
pin_e1
pin_e0
pin_d4
pin_d5
pin_d6
pin_d7
//
//
//
//
//
//
pino
pino
pino
pino
pino
pino
enable do LCD
rs do LCD
de dados d4 do
de dados d5 do
de dados d6 do
de dados d7 do
LCD
LCD
LCD
LCD
return;
www.mecatronicadegaragem.blogspot.com.br
39
www.mecatronicadegaragem.blogspot.com.br
instabilidade para o seu LCD em particular, experimente alterar o valor deste delay, lembrando
que, como boa prtica e de acordo com a Tabela 6, este valor pode variar entre 82us e 4,1ms.
/********************************************************************************/
/*
Funo para limpar o LCD
*/
/********************************************************************************/
//
void limpa_lcd()
{
envia_byte_lcd(0,0x01);
// Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Inicializao do LCD
A seguir, temos o cdigo para inicializar um LCD em 4 vias. A primeira ao da rotina
forar todas as linhas para o nvel lgico 0. O passo seguinte aguardar 15ms para
estabilizar o LCD, aps ser energizado. At este ponto, o mesmo procedimento para os
modos de 8 e 4 vias. Aps este ponto, precisamos mandar as informaes para inicializao
bsica do LCD que consiste em enviar trs vezes o nibble 0x03, ou enviar o byte 0x30. Para
efeito de economia de cdigo e utilizando a caracterstica de que a rotina envia_nibble_lcd()
trabalha com o nibble inferior, ser melhor enviarmos o comando 0x03. Repare que devemos
aguardar um tempo para estabilizar o LCD. Como este um procedimento executado apenas 1
vez em todo o ciclo do PIC e verificando que o tempo determinado na maioria dos data sheets
so inferiores ou muito prximos a 5ms, adotou-se este valor como intervalo mnimo entre as
fases iniciais de configurao, onde devemos enviar 3 comando 0x03. Aps isso, vamos enviar
o nibble para posicionar o cursor para a posio inicial e, ainda seguindo a Tabela 6,
devemos aguardar de 40us a 4,1ms . Por padro foi adotado 1ms. Aqui tambm cabe a
observao de que, se o display apresentar instabilidades, este tempo deve ser alterado. Em
seguida enviado o nibble 0x20 que indica que o LCD ser configurado para 4 vias de dados,
e 1 linha com matriz de 7X5 com cursor. Este valor pode ser alterado a fim de realizar testes,
conforme descrito nas Tabelas 2 e 3. Repare que para este ltimo comando, necessrio
enviar um byte completo e no apenas um nibble.
Estes so os procedimentos iniciais e obrigatoriamente deve seguir esta seqncia. A
partir deste ponto podemos entrar com as configuraes constantes nas Tabelas 2 e 3 em
qualquer ordem. importante salientar tambm que as instrues constantes a partir deste
ponto, assim como a de posicionamento do cursor (CURSOR HOME) podem ser utilizadas em
qualquer ponto do programa e no apenas na inicializao do LCD. Com isso fica fcil
implementar, por exemplo, uma rotina do tipo backspace.
Os comando seguintes enviam um byte completo (e no apenas um nibble) para as
configuraes de controle do display (Display control) e para os deslocamentos desejados
(Entry Mode Set).
Sempre use as Tabelas 2 e 3 como referncia.
E para finalizar, existe o comando RETURN para retornar ao ponto onde a rotina foi
chamada. Novamente esta uma boa prtica, mas este comando pode ser retirado, uma vez a
funo sempre retorna ao ponto onde foi chamada.
40
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4);
// Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5);
// Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6);
// Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7);
// Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);
// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);
// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);
// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);
// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x02);// CURSOR HOME - Envia comando para zerar o contador de
// caracteres e retornar posio inicial (0x80).
delay_ms(1);
// Aguarda 1ms para estabilizar o LCD
envia_byte_lcd(0,0x28);
// FUNCTION SET - Configura o LCD para 4 bits,
// 2 linhas, fonte 5X7.
envia_byte_lcd(0,0x0c);
// DISPLAY CONTROL - Display ligado, sem cursor
limpa_lcd();
// Limpa o LCD
envia_byte_lcd(0,0x06);
// ENTRY MODE SET - Desloca o cursor para a direita
}
return;
41
www.mecatronicadegaragem.blogspot.com.br
lcd_enable
lcd_rs
lcd_db4
lcd_db5
lcd_db6
lcd_db7
pin_b5
pin_b4
pin_b0
pin_b1
pin_b2
pin_b3
//
//
//
//
//
Outras alteraes
obvio que, alm destas configuraes, o tipo de processador, fuses, declarao e
inicializao de PORTs e TRIS, assim como as configuraes bsicas do microcontrolador
devero ser adequados, uma vez que utilizamos o PIC16F628A ao invs do PIC16F877A
existente na McLAB2.
Isso ficar bem claro ao comparar os dois cdigos referentes a um mesmo exerccio.
42
www.mecatronicadegaragem.blogspot.com.br
43
www.mecatronicadegaragem.blogspot.com.br
44
www.mecatronicadegaragem.blogspot.com.br
Define Microcontrolador
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
Final
45
www.mecatronicadegaragem.blogspot.com.br
O cdigo que dever ser gravada na McLAB2 o seguinte:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
Para uso na placa de testes
*
*
Exerccio 1 - Ol Mundo!
*
*
Criado por Eduardo de Souza Ramos
*
*
Memory usage:
ROM=4%
RAM=3% * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
DATA : 31/08/2005
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
*
*
*
*
*
*
*
6%
*
* * * * * * * * * *
*
*
* * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Primeiro teste de LCD em 4 vias - Ol Mundo
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_e1
// pino enable do LCD
#define lcd_rs
pin_e0
// pino rs do LCD
#define lcd_db4
pin_d4
// pino de dados d4 do
#define lcd_db5
pin_d5
// pino de dados d5 do
#define lcd_db6
pin_d6
// pino de dados d6 do
#define lcd_db7
pin_d7
// pino de dados d7 do
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta
portb
portc
portd
porte
=
=
=
=
=
* * * * * * * * *
*
* * * * * * * * */
LCD
LCD
LCD
LCD
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
0x05
0x06
0x07
0x08
0x09
/***************************************************************************/
/*
Rotinas para o LCD
*/
/***************************************************************************/
Tutorial LCD em 4 vias
46
www.mecatronicadegaragem.blogspot.com.br
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco);// Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4); // Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
delay_us(40);
return;
/*
*
*
//
//
//
//
// dado/comando
// Aguarda 40us para estabilizar o LCD
// Retorna ao ponto de chamada da funo
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no lcd>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no lcd>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz cvom que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Tutorial LCD em 4 vias
47
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4); // Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5); // Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6); // Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7); // Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
//
//
//
//
//
//
//
//
delay_ms(1);
//
envia_byte_lcd(0,0x28); //
//
envia_byte_lcd(0,0x0c); //
limpa_lcd();
//
envia_byte_lcd(0,0x06); //
}
return;
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Pic
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Configura o PIC
setup_adc_ports(no_analogs);
// Reseta portas
porta = 0;
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
escreve_lcd("O");
escreve_lcd("l");
escreve_lcd("a");
escreve_lcd(" ");
Tutorial LCD em 4 vias
48
www.mecatronicadegaragem.blogspot.com.br
escreve_lcd("M");
escreve_lcd("u");
escreve_lcd("n");
escreve_lcd("d");
escreve_lcd("o");
escreve_lcd("!");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como no h outra execuo, a rotina principal fica vazia
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
49
www.mecatronicadegaragem.blogspot.com.br
Placa de testes
O fluxograma necessrio para realizar este primeiro exerccio exibido na figura abaixo:
Incio
Define Microcontrolador
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
Final
50
www.mecatronicadegaragem.blogspot.com.br
Este o cdigo a ser programado em nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
Para uso na placa de testes
*
*
Exerccio 1 Ol Mundo!
*
*
Criado por Eduardo de Souza Ramos
*
*
Memory usage:
ROM=15%
RAM=3% * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
DATA : 31/08/2005
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
*
*
*
*
*
*
*
6%
*
* * * * * * * * * *
*
*
* * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Primeiro teste de LCD em 4 vias - Ol Mundo
//
//
//
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f628a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses INTRC,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP
#ROM 0x07ff = {0} //Calibragem do oscilador interno
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_b5
// pino enable do LCD
#define lcd_rs
pin_b4
// pino rs do LCD
#define lcd_db4
pin_b0
// pino de dados d4 do
#define lcd_db5
pin_b1
// pino de dados d5 do
#define lcd_db6
pin_b2
// pino de dados d6 do
#define lcd_db7
pin_b3
// pino de dados d7 do
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
* * * * * * * * *
*
* * * * * * * * */
LCD
LCD
LCD
LCD
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
51
www.mecatronicadegaragem.blogspot.com.br
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/comando
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no LCD>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no LCD>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz com que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Tutorial LCD em 4 vias
52
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4);
// Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5);
// Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6);
// Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7);
// Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);
// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
delay_ms(1);
envia_byte_lcd(0,0x28);
envia_byte_lcd(0,0x0c);
limpa_lcd();
envia_byte_lcd(0,0x06);
}
return;
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do PIC
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Reseta portas
porta = 0;
portb = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11000000);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
escreve_lcd("O");
escreve_lcd("l");
escreve_lcd("a");
escreve_lcd(" ");
escreve_lcd("M");
escreve_lcd("u");
escreve_lcd("n");
escreve_lcd("d");
escreve_lcd("o");
escreve_lcd("!");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
Tutorial LCD em 4 vias
53
www.mecatronicadegaragem.blogspot.com.br
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como no h outra execuo, a rotina principal fica vazia
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
Repare que neste programa exemplo, o uso de memria foi ROM=15% e RAM=3% 6%. Esta observao importante para que possamos comparar com os outros exerccios.
54
www.mecatronicadegaragem.blogspot.com.br
55
www.mecatronicadegaragem.blogspot.com.br
56
www.mecatronicadegaragem.blogspot.com.br
57
www.mecatronicadegaragem.blogspot.com.br
McLAB2
O fluxograma necessrio para realizar este exerccio exibido na figura abaixo:
Incio
Define Microcontrolador
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
Final
58
www.mecatronicadegaragem.blogspot.com.br
Este o cdigo:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
Para uso na placa de testes
*
*
Exerccio 2 - A funo PRINTF()
*
*
Criado por Eduardo de Souza Ramos
*
*
Memory usage:
ROM=3%
RAM=3% - 6%
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
DATA : 31/08/2005
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/* * * * * * * * * * * * * * * * * * * *
*
Descrio
* * * * * * * * * * * * * * * * * * * *
// Segundo teste de LCD em 4 vias - Ol
//
//
//
*
*
*
*
*
*
*
*
*
*
*
*
*/
* * * * * * * * * * * * * * * * * *
geral
*
* * * * * * * * * * * * * * * * * */
Mundo utilizando a funo PRINTF()
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_e1
// pino enable do LCD
#define lcd_rs
pin_e0
// pino rs do LCD
#define lcd_db4
pin_d4
// pino de dados d4 do
#define lcd_db5
pin_d5
// pino de dados d5 do
#define lcd_db6
pin_d6
// pino de dados d6 do
#define lcd_db7
pin_d7
// pino de dados d7 do
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte
#byte
#byte
#byte
porta
portb
portc
portd
=
=
=
=
* * * * * * * * *
*
* * * * * * * * */
LCD
LCD
LCD
LCD
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
0x05
0x06
0x07
0x08
59
www.mecatronicadegaragem.blogspot.com.br
#byte porte = 0x09
/***************************************************************************/
/*
Rotinas para o LCD
*/
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
//
//
//
//
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz cvom que o cdigo compilado seja menor.
void limpa_lcd()
Tutorial LCD em 4 vias
60
www.mecatronicadegaragem.blogspot.com.br
{
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4);
// Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5);
// Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6);
// Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7);
// Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);//
delay_ms(5);
//
envia_nibble_lcd(0x03);//
delay_ms(5);
//
envia_nibble_lcd(0x03);//
delay_ms(5);
//
envia_nibble_lcd(0x02);//
//
delay_ms(1);
//
envia_byte_lcd(0,0x28);//
//
envia_byte_lcd(0,0x0c);//
limpa_lcd();
//
envia_byte_lcd(0,0x06);//
return;
}
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Pic
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Configura o PIC
setup_adc_ports(no_analogs);
// Reseta portas
porta = 0;
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
// Inicializa o LCD
inicializa_lcd();
Tutorial LCD em 4 vias
61
www.mecatronicadegaragem.blogspot.com.br
//Escreve tela
printf(escreve_lcd,"Ola Mundo!");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como no h outra execuo, a rotina principal fica vazia
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
62
www.mecatronicadegaragem.blogspot.com.br
Placa de testes
O fluxograma necessrio para realizar este exerccio exibido na figura abaixo:
Incio
Define Microcontrolador
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
Final
63
www.mecatronicadegaragem.blogspot.com.br
Este o cdigo para a nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
*
Para uso na placa de testes
*
*
*
*
Exerccio 2 - A funo PRINTF()
*
*
*
*
Criado por Eduardo de Souza Ramos
*
*
*
*
Memory usage:
ROM=9%
RAM=3% - 6%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 31/08/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * *
*
Descrio
* * * * * * * * * * * * * * * * * * * *
// Segundo teste de LCD em 4 vias - Ol
//
* * * * * * * * * * * * * * * * * *
geral
*
* * * * * * * * * * * * * * * * * */
Mundo utilizando a funo PRINTF()
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f628a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses INTRC,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP
#ROM 0x07ff = {0} //Calibragem do oscilador interno
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_b5
// pino enable do LCD
#define lcd_rs
pin_b4
// pino rs do LCD
#define lcd_db4
pin_b0
// pino de dados d4 do LCD
#define lcd_db5
pin_b1
// pino de dados d5 do LCD
#define lcd_db6
pin_b2
// pino de dados d6 do LCD
#define lcd_db7
pin_b3
// pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
64
www.mecatronicadegaragem.blogspot.com.br
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
delay_us(1);
output_low(lcd_enable);
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/comando
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no LCD>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no LCD>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz com que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
Tutorial LCD em 4 vias
65
www.mecatronicadegaragem.blogspot.com.br
{
return;
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do PIC
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Reseta portas
porta = 0;
portb = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11000000);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
printf(escreve_lcd,"Ola Mundo!");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como no h outra execuo, a rotina principal fica vazia
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
Tutorial LCD em 4 vias
66
www.mecatronicadegaragem.blogspot.com.br
Repare que neste programa exemplo, o uso de memria foi ROM=9% e RAM=3% - 6%.
Se compararmos com o exerccio anterior, veremos que houve um ganho substancial de
memria (6 pontos percentuais) que em alguns casos pode representar o sucesso de seu
projeto! Portanto, use esta funo e seja feliz!!!
Maiores detalhes sobre esta funo e como imprimir o contedo de variveis pode ser
encontrada no help do compilador CCS
67
www.mecatronicadegaragem.blogspot.com.br
68
www.mecatronicadegaragem.blogspot.com.br
69
www.mecatronicadegaragem.blogspot.com.br
70
www.mecatronicadegaragem.blogspot.com.br
71
www.mecatronicadegaragem.blogspot.com.br
McLAB2
Este o cdigo para a McLAB2
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
Para uso na placa de testes
*
*
Exerccio 3 - Deslocando e rotacionando o display
*
*
Criado por Eduardo de Souza Ramos
*
*
Memory usage:
ROM=4%
RAM=3% - 7%
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
DATA : 31/08/2005
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
*
*
*
*
*
*
*
*
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Neste exerccio, o display ser deslocado para a esquerda e, ao final
// da mensagem ele ser deslocado para a direita, criando um efeito de
// vai-e-vem. Sero utilizadas as duas linhas do LCD para ter uma melhor
// visualizao.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#include <16f877a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#use delay(clock=4000000)
* * * * * * * * *
*
* * * * * * * * */
* * * * * * * * *
*
* * * * * * * * */
* * * * * * * * *
*
* * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
#define lcd_enable
pin_e1
// pino enable do LCD
#define lcd_rs
pin_e0
// pino rs do LCD
#define lcd_db4
pin_d4
// pino de dados d4 do LCD
#define lcd_db5
pin_d5
// pino de dados d5 do LCD
#define lcd_db6
pin_d6
// pino de dados d6 do LCD
#define lcd_db7
pin_d7
// pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta
portb
portc
portd
porte
=
=
=
=
=
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
0x05
0x06
0x07
0x08
0x09
72
www.mecatronicadegaragem.blogspot.com.br
/***************************************************************************/
/*
Rotinas para o LCD
*/
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
// ENABLE = 1
delay_us(1);
// Recomendado para estabilizar o LCD
output_low(lcd_enable);
// ENABLE = 0
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no lcd>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no lcd>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz cvom que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Tutorial LCD em 4 vias
73
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4); // Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5); // Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6); // Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7); // Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5);
// Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x02);// CURSOR HOME - Envia comando para zerar o contador de
// caracteres e retornar posio inicial (0x80).
delay_ms(1);
// Aguarda 1ms para estabilizar o LCD
envia_byte_lcd(0,0x28);// FUNCTION SET - Configura o LCD para 4 bits,
// 2 linhas, fonte 5X7.
envia_byte_lcd(0,0x0c);// DISPLAY CONTROL - Display ligado, sem cursor
limpa_lcd();
// Limpa o LCD
envia_byte_lcd(0,0x06);// ENTRY MODE SET - Desloca o cursor para a direita
return;
// Retorna ao ponto de chamada da funo
}
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Pic
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Configura o PIC
setup_adc_ports(no_analogs);
// Reseta portas
porta = 0;
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
set_tris_a(0b00111111); // configurao da direo dos pinos de I/O
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
printf(escreve_lcd,"Teste 1-linha com mais de 16 caracteres");
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"Teste 2-linha comum, + de 16 caracteres");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta rotina a responsvel pelo movimento de vai-e-vem do display.
// Ela fica em loop infinito.;
while (true)
Tutorial LCD em 4 vias
74
www.mecatronicadegaragem.blogspot.com.br
{
int i;
//Desloca os caracteres do LCD para a esquerda
for(i=0;i<=22;i++)
{
envia_byte_lcd(0,0x18); //0x18 = 0b00011000
delay_ms(250);
}
//Desloca os caracteres do LCD para a direita
for(i=0;i<=22;i++)
{
envia_byte_lcd(0,0x1c); //0x1c = 0b00011100
delay_ms(250);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
75
www.mecatronicadegaragem.blogspot.com.br
Placa de testes
O seguinte cdigo o que dever ser executado em nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
Para uso na placa de testes
*
*
Exerccio 3 - Deslocando e rotacionando o
*
*
Criado por Eduardo de Souza Ramos
*
*
Memory usage:
ROM=15%
RAM=3% * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
DATA : 31/08/2005
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * *
*
*
*
display
*
*
*
*
7%
*
* * * * * * * * * * *
*
*
* * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Neste exerccio, o display ser deslocado para a esquerda e, ao final
// da mensagem ele ser deslocado para a direita, criando um efeito de
// vai-e-vem. Sero utilizadas as duas linhas do LCD para ter uma melhor
// visualizao.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f628a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses INTRC,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP
#ROM 0x07ff = {0} //Calibragem do oscilador interno
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_b5
// pino enable do LCD
#define lcd_rs
pin_b4
// pino rs do LCD
#define lcd_db4
pin_b0
// pino de dados d4 do LCD
#define lcd_db5
pin_b1
// pino de dados d5 do LCD
#define lcd_db6
pin_b2
// pino de dados d6 do LCD
#define lcd_db7
pin_b3
// pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
76
www.mecatronicadegaragem.blogspot.com.br
/*
Rotinas para o LCD
*/
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
delay_us(1);
output_low(lcd_enable);
return;
//
//
//
//
ENABLE = 1
Recomendado para estabilizar o LCD
ENABLE = 0
Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/comando
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no LCD>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no LCD>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz com que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Tutorial LCD em 4 vias
77
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4);
// Garante que o pino DB4 esto em 0 (low)
output_low(lcd_db5);
// Garante que o pino DB5 esto em 0 (low)
output_low(lcd_db6);
// Garante que o pino DB6 esto em 0 (low)
output_low(lcd_db7);
// Garante que o pino DB7 esto em 0 (low)
output_low(lcd_rs);
// Garante que o pino RS esto em 0 (low)
output_low(lcd_enable);
// Garante que o pino ENABLE esto em 0 (low)
delay_ms(15);
// Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
envia_byte_lcd(0,0x0c);
limpa_lcd();
envia_byte_lcd(0,0x06);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
return;
delay_ms(1);
envia_byte_lcd(0,0x28);
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do PIC
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Reseta portas
porta = 0;
portb = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11000000);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
printf(escreve_lcd,"Teste 1-linha com mais de 16 caracteres");
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"Teste 2-linha comum, + de 16 caracteres");
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta rotina a responsvel pelo movimento de vai-e-vem do display.
// Ela fica em loop infinito.;
while (true)
{
int i;
//Desloca os caracteres do LCD para a esquerda
Tutorial LCD em 4 vias
78
www.mecatronicadegaragem.blogspot.com.br
for(i=0;i<=22;i++)
{
envia_byte_lcd(0,0x18); //0x18 = 0b00011000
delay_ms(250);
}
//Desloca os caracteres do LCD para a direita
for(i=0;i<=22;i++)
{
envia_byte_lcd(0,0x1c); //0x1c = 0b00011100
delay_ms(250);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
Faa um teste... Comentes as linhas que direcionam os caracteres do LCD para a direita
e veja o que acontece...
79
www.mecatronicadegaragem.blogspot.com.br
80
www.mecatronicadegaragem.blogspot.com.br
81
www.mecatronicadegaragem.blogspot.com.br
82
www.mecatronicadegaragem.blogspot.com.br
cria_cgram();
Define microcontrolador
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
Limpa o LCD
Fim
Retorna
83
www.mecatronicadegaragem.blogspot.com.br
McLAB2
Este o cdigo que dever ser implementado em nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
*
Para uso na placa de testes
*
*
*
*
Exerccio 4 - Criando caracteres na CGRAM
*
*
*
*
Criado por Eduardo de Souza Ramos
*
*
*
*
Memory usage:
ROM=7%
RAM=3% - 6%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 31/08/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//
Neste exerccio, criaremos 8 caracteres especiais (desenhos) na CGRAM
// para utilizarmos em qualquer ponto do LCD
//
A priori eles sero exibidos nas 8 primeiras posies da primeira
// linha do LCD. Maseles podero ser utilizados em qualquer ponto.
//
Como estes caracteres ficam na CGRAM, so volteis, ou seja, ao
// desligarmos o mdulo e o ligarmos novamente, precisarmos reintroduzir
// o cdigo para a criao de caracteres.
//
Reparem que, apesar de termos 16 posies disponveis na CGRAM,
// somente poderemos criar 8 caracteres. As 8 posies adjacentes (posies
// 0x08 a 0x0f) so espelho da primeira (0x00 a 0x07)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_e1
// pino enable do LCD
#define lcd_rs
pin_e0
// pino rs do LCD
#define lcd_db4
pin_d4
// pino de dados d4 do LCD
#define lcd_db5
pin_d5
// pino de dados d5 do LCD
#define lcd_db6
pin_d6
// pino de dados d6 do LCD
#define lcd_db7
pin_d7
// pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao dos port's
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Tutorial LCD em 4 vias
84
www.mecatronicadegaragem.blogspot.com.br
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta
portb
portc
portd
porte
=
=
=
=
=
0x05
0x06
0x07
0x08
0x09
/***************************************************************************/
/*
Rotinas para o LCD
*/
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
delay_us(1);
output_low(lcd_enable);
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no lcd>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no lcd>);
void escreve_lcd(char c)
// envia caractere para o display
{
Tutorial LCD em 4 vias
85
www.mecatronicadegaragem.blogspot.com.br
envia_byte_lcd(1,c);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz cvom que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * *
*
* * * * * * * * * * * * * *
void inicializa_lcd()
{
output_low(lcd_db4);
//
output_low(lcd_db5);
//
output_low(lcd_db6);
//
output_low(lcd_db7);
//
output_low(lcd_rs);
//
output_low(lcd_enable); //
delay_ms(15);
//
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
//
//
//
//
//
//
//
//
delay_ms(1);
//
envia_byte_lcd(0,0x28); //
//
envia_byte_lcd(0,0x0c); //
limpa_lcd();
//
envia_byte_lcd(0,0x06); //
}
return;
* * * * * * * * * * * * * * * * * * * * * * * *
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * */
Garante
Garante
Garante
Garante
Garante
Garante
Aguarda
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria caracteres na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cria_cgram()
{
envia_byte_lcd(0,0b01000000); // Vai para primeira posio da CGRAM
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
//
//
//
//
Cria
Cria
Cria
Cria
a
a
a
a
86
www.mecatronicadegaragem.blogspot.com.br
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
Cria
Cria
Cria
Cria
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00001010);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
limpa_lcd();
return;
}
/***************************************************************************/
Tutorial LCD em 4 vias
87
www.mecatronicadegaragem.blogspot.com.br
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Pic
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Configura o PIC
setup_adc_ports(no_analogs);
// Reseta portas
porta = 0;
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
limpa_lcd();
cria_cgram();
//Escreve os caracteres da CGRAM nas duas linhas do LCD
escreve_lcd(0b00000000);
escreve_lcd(0b00000001);
escreve_lcd(0b00000010);
escreve_lcd(0b00000011);
escreve_lcd(0b00000100);
escreve_lcd(0b00000101);
escreve_lcd(0b00000110);
escreve_lcd(0b00000111);
envia_byte_lcd(0,0xc0);
escreve_lcd(0b00001000);
escreve_lcd(0b00001001);
escreve_lcd(0b00001010);
escreve_lcd(0b00001011);
escreve_lcd(0b00001100);
escreve_lcd(0b00001101);
escreve_lcd(0b00001110);
escreve_lcd(0b00001111);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
Tutorial LCD em 4 vias
88
www.mecatronicadegaragem.blogspot.com.br
Placa de testes
Este o cdigo que dever ser implementado em nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
*
Para uso na placa de testes
*
*
*
*
Exerccio 4 - Criando caracteres na CGRAM
*
*
*
*
Criado por Eduardo de Souza Ramos
*
*
*
*
Memory usage:
ROM=26%
RAM=3% - 6%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 31/08/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//
Neste exerccio, criaremos 8 caracteres especiais (desenhos) na CGRAM
// para utilizarmos em qualquer ponto do LCD
//
A priori eles sero exibidos nas 8 primeiras posies da primeira
// linha do LCD. Mas eles podero ser utilizados em qualquer ponto.
//
Como estes caracteres ficam na CGRAM, so volteis, ou seja, ao
// desligarmos o mdulo e o ligarmos novamente, precisarmos reintroduzir
// o cdigo para a criao de caracteres.
//
Reparem que, apesar de termos 16 posies disponveis na CGRAM,
// somente poderemos criar 8 caracteres. As 8 posies adjacentes (posies
// 0x08 a 0x0f) so espelho da primeira (0x00 a 0x07)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f628a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses INTRC,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP
#ROM 0x07ff = {0} //Calibragem do oscilador interno
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_b5
// pino enable do LCD
#define lcd_rs
pin_b4
// pino rs do LCD
#define lcd_db4
pin_b0
// pino de dados d4 do LCD
#define lcd_db5
pin_b1
// pino de dados d5 do LCD
#define lcd_db6
pin_b2
// pino de dados d6 do LCD
#define lcd_db7
pin_b3
// pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
Tutorial LCD em 4 vias
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
89
www.mecatronicadegaragem.blogspot.com.br
#use
fast_io(b)
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/comando
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no LCD>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no LCD>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
Tutorial LCD em 4 vias
90
www.mecatronicadegaragem.blogspot.com.br
// faz com que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * *
*
* * * * * * * * * * * * *
void inicializa_lcd()
{
output_low(lcd_db4); //
output_low(lcd_db5);
output_low(lcd_db6);
output_low(lcd_db7);
output_low(lcd_rs);
output_low(lcd_enable);
delay_ms(15);
//
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
envia_byte_lcd(0,0x0c);
limpa_lcd();
envia_byte_lcd(0,0x06);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
return;
delay_ms(1);
envia_byte_lcd(0,0x28);
* * * * * * * * * * * * * * * * * * * * * * * * *
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria caracteres na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cria_cgram()
{
envia_byte_lcd(0,0b01000000); // Vai para primeira posio da CGRAM
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
91
www.mecatronicadegaragem.blogspot.com.br
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00001010);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00011111);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
limpa_lcd();
}
return;
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do PIC
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
Tutorial LCD em 4 vias
92
www.mecatronicadegaragem.blogspot.com.br
{
// Reseta portas
porta = 0;
portb = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11000000);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
limpa_lcd();
cria_cgram();
//envia_byte_lcd(0,0x80);
escreve_lcd(0b00000000);
escreve_lcd(0b00000001);
escreve_lcd(0b00000010);
escreve_lcd(0b00000011);
escreve_lcd(0b00000100);
escreve_lcd(0b00000101);
escreve_lcd(0b00000110);
escreve_lcd(0b00000111);
envia_byte_lcd(0,0xc0);
escreve_lcd(0b00001000);
escreve_lcd(0b00001001);
escreve_lcd(0b00001010);
escreve_lcd(0b00001011);
escreve_lcd(0b00001100);
escreve_lcd(0b00001101);
escreve_lcd(0b00001110);
escreve_lcd(0b00001111);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//
while (true)
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
93
www.mecatronicadegaragem.blogspot.com.br
94
www.mecatronicadegaragem.blogspot.com.br
95
www.mecatronicadegaragem.blogspot.com.br
96
www.mecatronicadegaragem.blogspot.com.br
cria_cgram();
anima_cgram();
Define microcontrolador
Executa um backspace
Executa um backspace
Executa um backspace
Configura o PIC:
Reseta PORTs
Configura TRIS
Inicializa o LCD
Escreve na tela
No
Limpa o LCD
Sim
Fim
Retorna
Retorna
97
www.mecatronicadegaragem.blogspot.com.br
McLAB2
O cdigo a seguir deve ser programado na McLAB2:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
*
Para uso na placa de testes
*
*
*
*
Exerccio 5 - Uma pequena animao
*
*
*
*
Memory usage:
ROM=5%
RAM=3% - 7%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 31/08/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Pequena animao para exemplificar o uso dos caracteres gerados na CGRAM
// e testar a funo de backspace.
// O tempo de animao controlado pela constante tempo
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_e1
// pino enable do LCD
#define lcd_rs
pin_e0
// pino rs do LCD
#define lcd_db4
pin_d4
// pino de dados d4 do LCD
#define lcd_db5
pin_d5
// pino de dados d5 do LCD
#define lcd_db6
pin_d6
// pino de dados d6 do LCD
#define lcd_db7
pin_d7
// pino de dados d7 do LCD
#define tempo 150
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte
#byte
#byte
#byte
porta
portb
portc
portd
=
=
=
=
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
0x05
0x06
0x07
0x08
98
www.mecatronicadegaragem.blogspot.com.br
#byte porte = 0x09
/***************************************************************************/
/*
Rotinas para o LCD
*/
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
// ENABLE = 1
delay_us(1);
// Recomendado para estabilizar o LCD
output_low(lcd_enable);
// ENABLE = 0
return;
// Retorna ao ponto de chamada da funo
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no lcd>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no lcd>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz cvom que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
Tutorial LCD em 4 vias
99
www.mecatronicadegaragem.blogspot.com.br
return;
/* * * * * * * * * * * * * *
*
* * * * * * * * * * * * * *
void inicializa_lcd()
{
output_low(lcd_db4);
//
output_low(lcd_db5);
//
output_low(lcd_db6);
//
output_low(lcd_db7);
//
output_low(lcd_rs);
//
output_low(lcd_enable); //
delay_ms(15);
//
envia_nibble_lcd(0x03); //
delay_ms(5);
//
envia_nibble_lcd(0x03); //
delay_ms(5);
//
envia_nibble_lcd(0x03); //
delay_ms(5);
//
envia_nibble_lcd(0x02); //
//
delay_ms(1);
//
envia_byte_lcd(0,0x28); //
//
envia_byte_lcd(0,0x0c); //
limpa_lcd();
//
envia_byte_lcd(0,0x06); //
return;
//
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria caracteres na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cria_cgram()
{
//escreve_lcd(0b00000000);
//escreve_lcd(0b00000001);
//escreve_lcd(0b00000010);
//escreve_lcd(0b00000011);
//escreve_lcd(0b00000100);
//escreve_lcd(0b00000101);
//escreve_lcd(0b00000110);
//escreve_lcd(0b00000111);
envia_byte_lcd(0,0b01000000);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
//
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
100
www.mecatronicadegaragem.blogspot.com.br
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00001010);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
limpa_lcd();
return;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria uma animao na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void anima_cgram()
{
int i;
for (i=0;i<=15;i++)
{
escreve_lcd(0b00000000);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000001);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000010);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000011);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(" ");
}
return;
}
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Pic
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Configura o PIC
setup_adc_ports(no_analogs);
// Reseta portas
porta = 0;
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
Tutorial LCD em 4 vias
101
www.mecatronicadegaragem.blogspot.com.br
set_tris_a(0b00111111);
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
limpa_lcd();
cria_cgram();
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta rotina a responsvel pelo movimento de vai-e-vem do display.
while (true)
{
//Faz uma animao do robozinho
envia_byte_lcd(0,0x80);
anima_cgram();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
102
www.mecatronicadegaragem.blogspot.com.br
Placa de testes
O cdigo a seguir deve ser programado na nossa placa de testes:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tutorial LCD em 4 vias
*
*
Para uso na placa de testes
*
*
*
*
Exerccio 5 - Uma pequena animao
*
*
*
*
Memory usage:
ROM=19%
RAM=3% - 7%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
VERSO : 1.0
*
*
DATA : 31/08/2005
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Pequena animao para exemplificar o uso dos caracteres gerados na CGRAM
// e testar a funo de backspace.
// O tempo de animao controlado pela constante tempo
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio do PIC utilizado
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f628a.h>
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses INTRC,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP
#ROM 0x07ff = {0} //Calibragem do oscilador interno
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio para uso de Rotinas de Delay
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use delay(clock=4000000)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Estas so as definies dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlaro os pinos do LCD
#define lcd_enable
pin_b5
// pino enable do LCD
#define lcd_rs
pin_b4
// pino rs do LCD
#define lcd_db4
pin_b0
// pino de dados d4 do LCD
#define lcd_db5
pin_b1
// pino de dados d5 do LCD
#define lcd_db6
pin_b2
// pino de dados d6 do LCD
#define lcd_db7
pin_b3
// pino de dados d7 do LCD
#define tempo 150
/* * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao
* * * * * * * * * * * * * * * * * * * * * * *
#use fast_io(a)
// Inicializao rpida dos
#use fast_io(b)
* * * * * * * * * * * * * * *
dos port's
*
* * * * * * * * * * * * * * */
Pinos de I/O
103
www.mecatronicadegaragem.blogspot.com.br
/***************************************************************************/
//Este o bloco com as rotinas necessrias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de "Nibble" para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable);
delay_us(1);
output_low(lcd_enable);
// ENABLE = 1
// Recomendado para estabilizar o LCD
// ENABLE = 0
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Envio de Byte para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo:
//
ENDEREO = 0 -> a varivel DADO ser uma instruo
//
ENDEREO = 1 -> a varivel DADO ser um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere
delay_us(100);
// Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable);
// Desativa a linha ENABLE
envia_nibble_lcd(dado>>4);
// Envia a parte ALTA do dado/comando
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40);
// Aguarda 40us para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
/*
*
*
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Envio de caractere para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Esta rotina serve apenas como uma forma mais fcil de escrever um caractere
no display. Ela pode ser eliminada e ao invs dela usaremos diretamente a
funo envia_byte_lcd(1,"<caractere a ser mostrado no LCD>"); ou
envia_byte_lcd(1,<cdigo do caractere a ser mostrado no LCD>);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operao pode ser muito utilizada, transformando-a em funo
// faz com que o cdigo compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instruo para limpar o LCD
delay_ms(2);
// Aguarda 2ms para estabilizar o LCD
return;
// Retorna ao ponto de chamada da funo
}
Tutorial LCD em 4 vias
104
www.mecatronicadegaragem.blogspot.com.br
/* * * * * * * * * * * * *
*
* * * * * * * * * * * * *
void inicializa_lcd()
{
output_low(lcd_db4);
output_low(lcd_db5);
output_low(lcd_db6);
output_low(lcd_db7);
output_low(lcd_rs);
output_low(lcd_enable);
delay_ms(15);
//
//
//
//
//
//
//
Garante
Garante
Garante
Garante
Garante
Garante
Aguarda
envia_byte_lcd(0,0x0c);
limpa_lcd();
envia_byte_lcd(0,0x06);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
return;
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x03);
delay_ms(5);
envia_nibble_lcd(0x02);
delay_ms(1);
envia_byte_lcd(0,0x28);
* * * * * * * * * * * * * * * * * * * * * * * * *
Inicializa o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * */
que o pino DB4 esto em 0 (low)
que o pino DB5 esto em 0 (low)
que o pino DB6 esto em 0 (low)
que o pino DB7 esto em 0 (low)
que o pino RS esto em 0 (low)
que o pino ENABLE esto em 0 (low)
15ms para estabilizar o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria caracteres na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cria_cgram()
{
//escreve_lcd(0b00000000);
//escreve_lcd(0b00000001);
//escreve_lcd(0b00000010);
//escreve_lcd(0b00000011);
//escreve_lcd(0b00000100);
//escreve_lcd(0b00000101);
//escreve_lcd(0b00000110);
//escreve_lcd(0b00000111);
envia_byte_lcd(0,0b01000000); // Vai para primeira posio da CGRAM
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00011111);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
105
www.mecatronicadegaragem.blogspot.com.br
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00010001);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010001);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00010101);
envia_byte_lcd(1,0b00001110);
envia_byte_lcd(1,0b00000100);
envia_byte_lcd(1,0b00001010);
envia_byte_lcd(1,0b00001010);
//
//
//
//
//
//
//
//
Cria
Cria
Cria
Cria
Cria
Cria
Cria
Cria
a
a
a
a
a
a
a
a
limpa_lcd();
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Cria uma animao na CG RAM
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void anima_cgram()
{
int i;
for (i=0;i<=15;i++)
{
escreve_lcd(0b00000000);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000001);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000010);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(0b00000011);
delay_ms(tempo);
envia_byte_lcd(0,0b00010000); //backspace
escreve_lcd(" ");
}
return;
}
/***************************************************************************/
/*
Final das rotinas para o LCD
*/
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do PIC
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main()
{
// Reseta portas
porta = 0;
portb = 0;
// configura os tris
set_tris_a(0b00111111);
set_tris_b(0b11000000);
Tutorial LCD em 4 vias
www.mecatronicadegaragem.blogspot.com.br
// Inicializa o LCD
inicializa_lcd();
//Escreve tela
limpa_lcd();
cria_cgram();
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta rotina a responsvel pelo movimento de vai-e-vem do display.
// Ela fica em loop infinito.;
while (true)
{
//Faz uma animao do robozinho
envia_byte_lcd(0,0x80);
anima_cgram();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
107
www.mecatronicadegaragem.blogspot.com.br
108
www.mecatronicadegaragem.blogspot.com.br
Consideraes finais
109
www.mecatronicadegaragem.blogspot.com.br
110
www.mecatronicadegaragem.blogspot.com.br
CONSIDERAES FINAIS
Acreditamos que este material cobriu todos os tpicos que abordam a configurao de
um mdulo LCD baseado nos processadores HD44780, KS0066U ou equivalentes.
Com este material, voc ser capaz de introduzir ou modificar um LCD em seus
projetos.
Portanto, mos obra e boa sorte!
111