28
Centro de Tecnologia Microgenios - Todos os direitos reservados Clique aqui para Imprimir o doc umento Os Displays LCD Alfanuméricos 1.0 Introdução 1.1 Hardware e Pinagem 1.2 Endereços de cada caractere no LCD 16x2 1.3 LCD Modo 8 Bits 1.4 LCD Modo 4 bits - Somente um port de controle/dados 1.5 LCD Modo 4 bits - Controlado por dois ports do PIC Introdução Agora que já conhecemos os recursos fundamentais da linguagem C, estamos prontos para criar nossos programas para controle de equipamentos. Estudaremos as principais funções e ferramentas para manipular displays LCD. Para implementar nossos projetos é interessante a utilização de um display, capaz de tornar mais simples a visualização de informações e a interação com nosso equipamento, escolhemos para tratar nesta obra de um display de utilização muito comum em sistemas microcontrolados, suas características são as seguintes: Tipo: Display LCD Exibição: Caracteres Alfanuméricos Quantidade de informações: 16 x 2 (dezesseis caracters em 2 linhas) Controlador: padrão HD44780 Hitchi Um display LCD desse tipo, possui embutido em seu circuito um outro microcontrolador, e para podermos utilizá-lo temos que entender um pouco de seus comandos e funções. Dessa forma, da mesma maneira com que trabalhamos com o PIC, para utilizar um display LCD temos que seguir uma sequência de procedimentos.

Os Display LCD Alfanumericos

Embed Size (px)

DESCRIPTION

Parte 15

Citation preview

Page 1: Os Display LCD Alfanumericos

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc umento

Os Displays LCD Alfanuméricos

1.0 Introdução

1.1 Hardware e Pinagem

1.2 Endereços de cada caractere no LCD 16x2

1.3 LCD Modo 8 Bits

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

1.5 LCD Modo 4 bits - Controlado por dois ports do PIC

Introdução

Agora que já conhecemos os recursos fundamentais da linguagem C, estamos prontos para criar nossos

programas para controle de equipamentos. Estudaremos as principais funções e ferramentas para

manipular displays LCD. Para implementar nossos projetos é interessante a utilização de um display,

capaz de tornar mais simples a visualização de informações e a interação com nosso equipamento,

escolhemos para tratar nesta obra de um display de utilização muito comum em sistemas

microcontrolados, suas características são as seguintes:

Tipo: Display LCD Exibição: Caracteres Alfanuméricos Quantidade de informações: 16 x 2 (dezesseis caracters em 2 linhas) Controlador: padrão HD44780 Hitchi

Um display LCD desse tipo, possui embutido em seu circuito um outro microcontrolador, e para

podermos utilizá-lo temos que entender um pouco de seus comandos e funções. Dessa forma, da mesma

maneira com que trabalhamos com o PIC, para utilizar um display LCD temos que seguir uma sequência

de procedimentos.

Page 2: Os Display LCD Alfanumericos

Hardware e Pinagem

Existem modelos diferentes, com localização diferente da pinagem, porém a numeração e função dos

pinos geralmente é a mesma, nos kits didáticos e profissionais Microgenios é utilizado o LCD

apresentado em seguida:

Descrição das Pinagens:

Pino Função Descrição

1 alimentação Terra ou GND

2 Alimentação VCC ou +5V

3 V0 Tensão para ajuste de

contraste (ver figura1)

4 RS Seleção: 1 - dado, 0 - instrução

5 R/W seleção 1 - Leitura, 0 - Escrita

6 E chip

Select

1 ou (1 - 0) Habilita, 0 -

desabilita

7 B0 LSB

8 B1

9 B2

10 B3

11 B4 barramento de dados

12 B5

12 B6

14 B7 MSB

15 A (display

c/ back) Anodo p/ LED backlight

16 K (display

c/ back) Catodo p/ LED backlight

Page 3: Os Display LCD Alfanumericos

Além da pinagem é importante entendermos uma outra característica de hardware

desse dispositivo, que são suas áreas de memória; ele possui três áreas de

memória com funções bem diferentes:

CGROM: Memória não volátil onde estão gravados os códigos para escrita dos

caracteres, isso é muito útil, pois apenas enviamos o código ASCII do caracter e esse já é escrito no display.

DDRAM: É uma área de memória volátil, onde escrevemos o que queremos que

apareça no display, cada endereço dessa memória equivale a um endereço de

caracter dos display, podemos fazer a seguinte analogia para facilitar, cada caracter do display é como uma “janela” que exibe o conteúdo que escrevemos na DDRAM.

CGRAM: É uma pequena área de memória onde podemos “desenhar” caracteres

diferentes (apenas 8 caracteres). Ela é muito utilizada quando precisamos criar

caracteres que não são comuns a todas as línguas como por exemplo o caracter “ç”

do português.

Endereço de cada caracter no display 16 x 2

Abaixo está o endereço em hexadecimal de cada caracter no display LCD 16 x 2, assim fica mais fácil a movimentação do cursor e das letras a serem escritas:

Page 4: Os Display LCD Alfanumericos

Lista de códigos dos Caracteres

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

Endereços e Instruções Agora conhecemos a pinagem desse LCD, vamos conhecer seu modo de

funcionamento e saber um pouco mais das instruções e dados que precisaremos

utilizar.

Page 5: Os Display LCD Alfanumericos

É interessante atentarmos para a seguinte característica, a via de dados e

instruções é a mesma, dessa forma a sinalização, que indica se o Byte que chega

no display é dado ou instrução é proveninte do sinal encontrado no pino 4 (RS): RS = 0 -> Instrução RS = 1 -> Dado Outra característica importante é que precisamos pulsar (de 1 para 0) o sinal

Enable (pino 6) para que a informação que chega aos terminais do LCD seja

interpretada pelo controlador do display. Em nosso estudo manteremos o pino 5 (R/W) em zero, pois apenas escreveremos

no LCD. Podemos ligar este pino do LCD no PIC também. Para utilizarmos esse novo dispositivo em nossos projetos, devemos seguir

alguns passos: 1º Inicializar o LCD: Primeiramente criar uma rotina em nosso programa, que envie

para o display uma sequência de informações que determinará o modo com o qual

trabalharemos, com por exemplo: - Definição da matriz de pontos (nosso caso 5 x 7) - Definição do cursor - Definição da direção de deslocamento (mensagem ou cursor) - Limpeza do display.

O mikroC automaticamente carrega as rotinas de inicilização do LCD na compilação de

um programa. O programador não precisa se preocupar em inicilizar o LCD desde que o

hardware do dispositivo esteja configurado no programa corretamente no modo 4 ou 8

bits; (veremos com detalhes mais adiante).

Tabelas de Instruções

Na seqüência disponibilizamos as tabelas de instruções para esse tipo display, como nosso objetivo não é o estudo do display propriamente dito, aconselhamos aos interessados nesse dispositivo que procurem bibliografias dedicadas a eles para um maior detalhamento das funções.

Tabela com o conjunto completo de instruções:

Page 6: Os Display LCD Alfanumericos

Tabela com as instruções mais comuns:

Page 7: Os Display LCD Alfanumericos

Resumo com as instruções mais úteis:

Page 8: Os Display LCD Alfanumericos

Endereços de cada caractere no LCD 16x2

Abaixo está o endereço em hexadecimal de cada caracter no display LCD 16 x 2,

assim fica mais fácil a movimentação do cursor e das letras a serem

escritas:(ENDEREÇOS EM HEXADECIMAL)

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F

C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF

Inicialização do LCD

Toda vez que alimentarmos o LCD, devemos executar um procedimento de

inicialização, o qual consiste em enviar comandos que configuram o modo de operação

para execução de um dado programa: fixação das condições de utilização, fixação do

modo de controle ativo/inativo do display e limpeza da tela.

No mikroC não precisamos nos preocupar em programar todos os comandos

de inicialização do LCD, pois, através de simples funções, o compilador se encarrega

de programá-lo para nós. Por esse motivo devemos informar ao sistema o “tipo” de

LCD que estamos utilizando por meio de linhas de comando. A seguir, vamos conhecer

e estudar as instruções de controle de LCD usadas no mikroC.

Definindo o modo de operação do LCD.

Os LCD's podem ser programados para operarem das seguintes formas:

modo 8 bits modo 4 bits

Page 9: Os Display LCD Alfanumericos

No mikroC é possível trabalhar com os LCD's nos dois modos. no modo 8 bits. no modo 4 bits - somente um port de controle/dados no modo 4 bits - com dois ports para controle e dados do LCD

LCD Modo 8 Bits

No modo 8 bits, todos os pinos do barramento de dados do LCD são utilizados,

conforme figura abaixo:

Repare que todos os 8 pinos do barramento de dados do LCD (D0 a D7) estão ligados

no microcontrolador PIC, neste modo, estamos enviando as instruções e comandos para

o LCD em 8 bits.

O compilador mikroC possui diversas bibliotecas de funções prontas para trabalharmos

com displays LCD. Para exemplificar, vamos apresentar um programa em C que utiliza

os recursos das funções de controle de LCD do compilador mikroC, acompanhe:

Page 10: Os Display LCD Alfanumericos

/*********************************************************************

*****

Centro de tecnologia Microgenios

Programa exemplo: LCD_modo_8bits.c

Este programa tem por objetivo escrever a mensagem "Microgenios" na

primeira

linha do LCD e na segunda "Kit PICGENIOS".

**********************************************************************

****

*/

void main()

{

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e

inicializa o LCD

lcd8_cmd(lcd_clear); //apaga LCD

lcd8_cmd(lcd_cursor_off); // desliga cursor

lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do

LCD

lcd8_out(2,1,"KIT PICGENIOS"); // escreve mensagem na segunda linha do

LCD

delay_ms(10); //delay de 10 ms

while(1); //loop infinito

}

Descrição detalhada do programa:

O programa acima tem a função de escrever no LCD 16X2 duas mensagens

"Microgenios" na primeira linha do LCD, e "KIT PICGENIOS" na segunda linha do

LCD.

A função main(), já conhecemos.

Os comando abaixo definem os sentidos das portas de i/o do PIC.

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

Os comandos seguintes controlam o display LCD no modo 8 bits. Vamos estudar cada

um dos comandos:

O comando lcd8_config ( ):

O comando lcd8_config determina quais são os pinos do barramento de dados e de

controle do LCD que estão ligados ao PIC, assim como também inicializa o LCD.

Page 11: Os Display LCD Alfanumericos

Sintaxe:

lcd8_config(&port_controle, &port_dados, RS, EN, RW, D7, D6, D5, D4,

D3, D2, D1, D0 );

Onde:

port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.

RS : pino do port_controle que determina o bit de instruções ou dado do LCD.

EN : pino do port_controle que determina o bit de "enable" do LCD.

RW : pino do port_controle que determina o bit de leitura /escrita do LCD.

(nolmalmente coloca-se este pino do LCD no GND).

D7 à D0: Pinos do port_dados

Vejamos nosso exemplo de programa:

lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e

inicializa o LCD

A função lcd8_config acima, determina os PORTs e os pinos que participam do

controle do LCD:

Port que controla o LCD:

PORTE

Funções dos pinos de controle do port de controle:

RS: 1 //pino RE2

EN: 1 //pino RE1

RW: 0 //pino RE0

Port de dados do LCD;

PORTD

Funções dos pinos do port de dados no LCD;

D7: 7 //pino RD7 do PORTD

D6: 6 //pino RD6 do PORTD

D5: 5 //pino RD5 do PORTD

D4: 4 //pino RD4 do PORTD

D3: 3 //pino RD3 do PORTD

D2: 2 //pino RD2 do PORTD

D1: 1 //pino RD1 do PORTD

D0: 0 //pino RD0 do PORTD

Configuramos então nosso lcd conforme figura abaixo:

Page 12: Os Display LCD Alfanumericos

Apartir desta primeira linha de programa, concluimos que nosso LCD esta ligado da

seguinte maneira:

Repare que o pino R/W do LCD foi aterrado. No comando Lcd8_config informamos

que o pino RW era RE0 do PIC.

O comando lcd8_cmd(comandos_LCD):

Page 13: Os Display LCD Alfanumericos

No mikroC podemos configurar o LCD de diversas formas diferentes. Através da

função lcd8_cmd(), podemos determinar diversas "tarefas" que o LCD deverá executar.

Acompanhe:

Sintaxe:

Lcd8_cmd(comandos_LCD);

onde:

Comando_LCD pode ser:

Comandos Descrição LCD_FIRST_ROW Move cursor para primeira linha do LCD LCD_SECOND_ROW Move cursor para segunda linha do LCD LCD_THIRD_ROW Move cursor para a terceira linha do LCD LCD_FOURTH_ROW Move cursor para a quarta linha do LCD LCD_CLEAR Apaga display LCD_RETURN_HOME Retorna cursor para a primeira coluna da primeira linha do LCD LCD_CURSOR_OFF Desliga cursor LCD_UNDERLINE_ON Salta cursor para a linha inferior LCD_BLINK_CURSOR_ON Ativa o modo piscante do cursor LCD_MOVE_CURSOR_LEFT Move cursor para a esquerda sem movimentar os textos LCD_MOVE_CURSOR_RIGHT Move cursor para a direita sem movimentar os textos LCD_TURN_ON Liga cursor LCD_TURN_OFF Apaga todo o visor do LCD, sem perder os dados no visor LCD_SHIFT_LEFT Movimenta textos do LCD para a esquerda LCD_SHIFT_RIGHT Movimenta textos do LCD para a direita

No exemplo utilizamos o seguinte comando para apagar o display LCD:

lcd8_cmd(lcd_clear); //apaga LCD

Este e os demais comandos que estudaremos somente podem ser utilizados após a

execução do comando lcd8_config().

Utilizamos o comando para desligar o cursor do LCD

lcd8_cmd(lcd_cursor_off); // desliga cursor

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

função lcd8_out no LCD.

lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do

LCD

Os números 1, 1 da função acima, informa que a mensagem "Microgenios" será escrita

na primeira linha da primeira coluna do LCD. o Primeiro numero informa a linha do

LCD e o segundo número informa a coluna do LCD.

Os displays LCD são constituidos de linhas e colunas conforme podemos ver na figura

abaixo:

Page 14: Os Display LCD Alfanumericos

O LCD apresentado possui 4 linhas por 20 colunas.

Podemos escrever um dado em qualquer posição do LCD. basta informar a linha e a

coluna para inicio do texto.

No caso de desejarmos escrever uma mensagem "ligado" na quarta linha, décima

coluna do LCD 20 x 4, basta escrever o seguinte comando:

lcd8_out(4,10,"ligado"); // escreve mensagem na quarta linha, décima

coluna do lcd 20 x 4

Vamos escrever agora outro programa que escreve uma mensagem no display lcd 16 x

4:

/*********************************************************************

*****

Centro de tecnologia Microgenios

Programa exemplo: LCD_modo_8bits_01.c

Este programa tem por objetivo escrever a mensagem "Maquina: ligado"

Page 15: Os Display LCD Alfanumericos

na primeira

linha do LCD e na segunda linha "Prog: ligado".

**********************************************************************

****

*/

char *texto = "ligado"

void main()

{

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e

inicializa o LCD

lcd8_cmd(lcd_clear); //apaga LCD

lcd8_cmd(lcd_cursor_off); // desliga cursor

lcd8_out(1,1,"Maquina: "); // escreve mensagem na primeira linha do

LCD lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD

lcd8_out(2,1,"Prog: "); // escreve mensagem na segunda linha do LCD lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD

delay_ms(10); //delay de 10 ms

while(1); //loop infinito

}

Neste exemplo repare que utilizamos a mesma configuração de hardware do LCD

anterior. Repare que agora temos um comando novo em nosso programa, o comando

lcd8_out_cp, cuja função é escrever no lcd uma string ou variável na corrente posição

do cursor.

Repare que o comando lcd8_out(1,1,"Maquina: "); deixa o cursor posicionada na

sétima coluna da primeira linha do lcd. O próximo comando que vem em seguida no

programa é lcd8_out_cp(texto), que escreve na posição do cursor do lcd o valor da

variável "texto", que neste caso é a string "ligado".

Teremos como resultado:

M a q u i n a : L i g a d o

P r o g : L i g a d o

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

No modo de 4 bits, devemos ligar apenas o nibble mais significativo (DB4 a DB7)

do barramento de dados do LCD ao microcontrolador, conforme o esquema elétrico seguinte:

Page 16: Os Display LCD Alfanumericos

Para exemplificar este modo 4 bits iremos apresentar um programa:

/*********************************************************************

*****

Centro de tecnologia Microgenios

Programa exemplo: LCD_modo_4bits_00.c

Este programa tem por objetivo escrever a mensagem "teste LCD" na

primeira

linha do LCD. Programa no modo 4 bits

**********************************************************************

****

*/

Page 17: Os Display LCD Alfanumericos

void main() {

TRISD = 0; // programa portD como saida

Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD

Lcd_Cmd(Lcd_CLEAR); // apaga display

Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor

Lcd_Out(1, 1, "teste LCD"); // escreve texto "teste LCD" na

primeira linha, primeira coluna do LCD

while(1);

}

Descrição detalhada do programa:

O programa acima tem a função de escrever na primeira linha do display lcd o texto

"teste LCD". Repare na imagem acima que utilizamos somente um port do PIC para

controle e envio de dados para o LCD.

Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada

um dos comandos:

O comando lcd_config ( ):

O comando lcd_config( ) determina quais são os pinos do barramento de dados e de

controle do LCD que estão ligados ao PIC, assim como também inicializa o LCD.

Sintaxe:

lcd_config(&port_controle/dados, RS, EN, RW, D7, D6, D5, D4 );

Onde:

port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.

RS : pino do port_controle que determina o bit de instruções ou dado do LCD.

EN : pino do port_controle que determina o bit de "enable" do LCD.

RW : pino do port_controle que determina o bit de leitura /escrita do LCD.

(nolmalmente coloca-se este pino do LCD no GND).

D7 à D4: pinos do port_dados

Vejamos nosso exemplo de programa:

Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD

A função lcd_config acima, determina o PORT e os pinos que participam do controle

do LCD:

Port que controla o LCD:

PORTD

Page 18: Os Display LCD Alfanumericos

Funções dos pinos de controle do port de controle:

RS: 1 //pino RD2

EN: 3 //pino RD3

RW: 2 //qualquer valor de outro pino, pois o RW do LCD esta aterrado

Port de dados do LCD;

PORTD

Funções dos pinos do port de dados no LCD;

D7: 7 //pino RD7 do PORTD

D6: 6 //pino RD6 do PORTD

D5: 5 //pino RD5 do PORTD

D4: 4 //pino RD4 do PORTD

PODEMOS ATERRAR O PINO R/W DO LCD, POIS AS FUNÇÕES DE CONTROLE DE LCD

DO MIKROC NÃO UTILIZA ESTE PINO SIMPLESMENTE DEIXAM ESTE PINO EM NIVEL

LÓGICO 0. CASO VENHAMOS A ATERRAR O PINO RW, ECONOMIZAREMOS 1 PINO DE

I/O DO PIC.

Os demais comandos do programa estudamos anteriormente, em caso de dúvida leia

novamente o conteúdo do tópico lcd modo 8 bits.

LCD Modo 4 bits - Controlado por dois ports do PIC

Este é mais um dos modos 4 bits de trabalharmos com LCD. Neste novo modo podemos

ter um port de controle e outro port do PIC para dados. Veja o esquema abaixo:

Page 19: Os Display LCD Alfanumericos

Repare que para controlar o display LCD utilizamos dois ports do PIC, o PORTA para

controle, e o PORTD como dados.

Vamos estudar um programa para entendermos os comandos de controle:

/*********************************************************************

*****

Centro de tecnologia Microgenios

Programa exemplo: LCD_modo_4bits_01.c

Este programa tem por objetivo escrever a mensagem "Programa LCD" na

primeira

linha do LCD. Programa no modo 4 bits

**********************************************************************

****

*/

void main() {

ADCON1 = 6; // programa pinos de A/D como I/O de uso

geral

Page 20: Os Display LCD Alfanumericos

TRISA = 0; // programa portA como saida

TRISD = 0; // programa portD como saida

Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e

inicializa LCD no modo 4 bits

Lcd_Cmd(Lcd_CLEAR); // apaga display

Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor

Lcd_Out(1, 4, "Programa LCD"); // escreve texto "Programa LCD" na

primeira linha, quarta coluna do LCD

while(1);

}

Descrição detalhada do programa:

O programa acima tem a função de escrever na primeira linha, quarta coluna do display

lcd o texto "Programa LCD". Repare no esquema eletrônico acima que temos dois ports

do PIC ligado ao LCD.

Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada

um dos comandos:

O comando lcd_custom_config ( ):

O comando lcd_custom_config( ) determina quais são os pinos do barramento de dados

e de controle do LCD que estão ligados ao PIC, assim como também inicializa o LCD.

Sintaxe:

lcd_config(&port_dados, D7, D6, D5, D4, &port_controle, RS, RW, EN );

Onde:

port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE.

RS : pino do port_controle que determina o bit de instruções ou dado do LCD.

EN : pino do port_controle que determina o bit de "enable" do LCD.

RW : pino do port_controle que determina o bit de leitura /escrita do LCD.

(nolmalmente coloca-se este pino do LCD no GND).

D7 à D4: pinos do port_dados

Vejamos nosso exemplo de programa:

Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e

inicializa LCD no modo 4 bits

A função lcd_custom_Config acima, determina os PORTs e os pinos que participam

do controle e envio de dados para o LCD:

Port que controla o LCD:

PORTA

Page 21: Os Display LCD Alfanumericos

Funções dos pinos de controle do port de controle:

RS: 1 //pino RA1

EN: 3 //pino RA3

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

Port de dados do LCD;

PORTD

Funções dos pinos do port de dados no LCD;

D7: 0 //pino RD0 do PORTD

D6: 2 //pino RD2 do PORTD

D5: 4 //pino RD4 do PORTD

D4: 5 //pino RD5 do PORTD

Aprendendo Programando:

Apartir de agora, iremos desenvolver alguns exemplos de programas utilizando display

LCD alfanuméricos.

1º Programa:

Vamos elaborar um programa utilizando os recursos das funções de display LCD do

MikroC para que funcione da seguinte maneira:

Nosso hardware esta operando o LCD no formato 8 bits

Inicialmente será escrito uma string na primeira linha do display LCD e outra na

segunda linha.

As mensagem deverão se deslocar 16 casas para a direita e posteriormente deverá

retornar ao seu local de origem:

Cada deslocamente levará aproximadamente 200 milisegundos.

Microcontrolador: PIC18F4x2

Cristal: 8MHz

Acompanhe o harware:

Page 22: Os Display LCD Alfanumericos

figura 01 - Esquema elétrico

/*********************** Animação de Display LCD ************************

Centro de Tecnologia Microgenios

Programa: Animação LCD

Compilador: MikroC

Cristal: 8Mhz

Microcontrolador: PIC18F452

Objetivo: Deslocar as mensagem dos display LCD para a direita e para a

esquerda

utilizando laço For.

*************************************************************************/

void main() {

unsigned char inc = 0; //declara variavel chamada "inc" como char

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso

geral

lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //

lcd8_cmd(lcd_clear); //apaga display LCD

lcd8_cmd(lcd_cursor_off); //desliga cursor

lcd8_out(1,1,"Microgenios"); //escreve no display LCD

lcd8_out(2,1,"KIT PICGENIOS"); //escreve no display LCD

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

*********************

for (inc = 0 ; inc < 16 ; inc++){

lcd8_cmd(LCD_SHIFT_RIGHT); //desloca mensagem para a direita

Delay_ms(200); //aguarda 200 milisegundos

}

Page 23: Os Display LCD Alfanumericos

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

*********************

for (inc = 0 ; inc < 16 ; inc++){

lcd8_cmd(LCD_SHIFT_left); //desloca mensagem para a esquerda

Delay_ms(200); //aguarda 200 milisegundos

}

while(1); //loop infinito

}

Obs: repare neste programa que o pino R/W do display LCD foi aterrado, e na função

lcd8_config foi declarado como sendo pino RE4. O pino R/W normalmente não é

utilizado nas maioria das aplicações, neste caso, como a

função lcd8_config necessita de algum parâmetro, informamos um valor qualquer,

neste caso foi um pino inexistente no chip. (lembre-se que todos os ports do PIC são

composto por 8 bits, neste caso a posição de memória RE4 existe, porém não tem

aplicação para este chip).

Regras do C: Se na declaração de uma função declararmos "n"

parametros, necessáriamente deveremos enviar todos os "n" parâmetros na

chamada desta função.

2º Programa:

Nosso segundo programa, tem como objetivo escrever no display LCD o valor

numérico 100 armazenado em uma variável do tipo char, chamada "contador".

Utilizaremos o mesmo esquema eletrônico apresentado do exemplo 01.

Acompanhe:

/*********************** Animação de Display LCD ************************

Centro de Tecnologia Microgenios

Programa: Animação LCD

Compilador: MikroC

Cristal: 8Mhz

Microcontrolador: PIC18F452

Objetivo: enviar para o display LCD o valor da variável contador

*************************************************************************/

void main() {

unsigned char contador = 100; //declara variável char contador e

atribui o valor 100

unsigned char texto[10]; //cria vetor (array) do tipo char com 11

elementos (os indice começam do 0)

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso

geral

lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //

lcd8_cmd(lcd_clear); //apaga display LCD

lcd8_cmd(lcd_cursor_off); //desliga cursor

Page 24: Os Display LCD Alfanumericos

bytetostr(contador, texto); //converte o valor numérico de

contador e atribui ao vetor Texto

lcd8_out(1,1,texto); //escreve no display LCD o valor do vetor

texto

while(1); //loop infinito

}

O programa deste exercício possui muitas informações importantes, dentre elas, a

utilização de Arrays, ou como neste caso é chamado, vetor.

Para que possamos enviar o valor numérico presente em uma variável qualquer, a

principio precisamos converter cada um de seus algorismo em caracterer, pois a função

de display LCD do MikroC somente opera com caracteres e string.

Um erro comum (acredito que você já tentou), é utilizar as funções dessa forma:

lcd8_out(1,1,contador); //escreve no display LCD o valor da

variável contador

Se você pensou que iria aparecer no display LCD o valor da variável contador no

display LCD você se enganou.

Vamos analizar com mais calma:

Seu display LCD somente pode operar com caracterer, ou seja, char. Lembre-se que o

barramento do LCD é de 8 bits, no qual permite o envio de valores de 0 a 255 no

máximo.

Cada caracterer no padrão ASCII é do comprimento de um char, neste caso você já

começa a pensar...

"Tenho que enviar um caracter por vez no display LCD".

É exatamente isso, temos que enviar caracter por caracter, caso nossa intensão seja

escrever uma mensagem no visor do LCD.

Nosso compilador possui algumas bibliotecas que irão nos ajudar e muito na elaboração

do nosso programa. Utilizamos uma função chamada bytetostr no programa, que tem

por objetivo converter o valor numérico de uma variável para String e armazenar em

uma Tabela (vetor). " Professor, estou com uma dúvida !! . Afinal qual é a diferença entre um caractere e uma string??? Na linguagem C diferenciamos um caractere de uma string através das aspas simples ' e aspas duplas ".

Exemplo: 'A' ---> caractere A padrão ASCII "A" ---> string A mas qual é a diferença? Caractere: todo caractere ASCII possui um valor numérica (consulte o menu Tools > ASC Chart do MikroC) String:

Page 25: Os Display LCD Alfanumericos

Não exite uma representação numérica para uma string, pois está é composta por caractere + 1

caractere de terminação, chamado "Null", cujo valor é Zero. então teremos: "A" ---> é igual a: --- > 'A' (caractere) + "\0" (caractere de terminação de string null) Pense e responda: Qual é o número que representa seu nome? resp: Não existe um número que represente seu nome, e isso acontece em qualquer string.

Veja como ficará o resultado no modo de debugação no MikroC:

Figura 02 - Debugação do programa anterior

Perceba o preenchimento do vetor Texto após a execução do comando: bytetostr(contador, texto);

3º Programa:

Este Terceiro programa tem por objetivo mostrar utilizar os recursos da memória

CGRAM do display LCD. Neste exemplo, aparecerá um pequeno "cavalinho" andando

no display LCD alfanumérico.

Teste este programa no seu kit PICgenios e veja o resultado:

Page 26: Os Display LCD Alfanumericos

/*********************** Animação de Display LCD ************************

Centro de Tecnologia Microgenios

Programa: Animação LCD

Compilador: MikroC

Cristal: 8Mhz

Microcontrolador: PIC18F452

Objetivo: enviar para o display LCD o valor da variável contador

http://br.youtube.com/watch?v=NS6-T3bGNd4

*************************************************************************/

//1º caracterer************

const char character1[] = { 32 , 32 , 32 , 32 , 3 , 7 , 14 , 14};

const char character2[] = { 32 , 32 , 32 , 32 , 15 , 31 , 31 , 31};

const char character3[] = { 32 , 32 , 32 , 32 , 3 , 31 , 31 , 31};

const char character4[] = { 32 , 1 , 31 , 31 , 31 , 27 , 19 , 16};

const char character5[] = { 12 , 24 , 16 , 1 , 1 , 1 , 32 , 32};

const char character6[] = { 31 , 31 , 30 , 23 , 32 , 32 , 16 , 32};

const char character7[] = { 31 , 31 , 1 , 1 , 1 , 1 , 32 , 32};

const char character8[] = { 28 , 28 , 4 , 4 , 8 , 32 , 32 , 32};

const char character1a[] = { 32 , 32 , 32 , 32 , 32 , 7 , 15 , 30};

const char character2a[] = { 32 , 32 , 32 , 32 , 14 , 31 , 31 , 31};

const char character3a[] = { 32 , 32 , 32 , 32 , 7 , 31 , 31 , 31};

const char character4a[] = { 32 , 2 , 31 , 31 , 31 , 27 , 19 , 16};

const char character5a[] = { 16 , 32 , 32 , 1 , 1 , 1 , 32 , 32};

const char character6a[] = { 31 , 31 , 27 , 18 , 1 , 1 , 17 , 32};

const char character7a[] = { 31 , 31 , 1 , 1 , 1 , 1 , 32 , 32};

const char character8a[] = { 24 , 28 , 4 , 8 , 16 , 32 , 16 , 32};

const char character1b[] = { 32 , 32 , 32 , 7 , 15 , 14 , 28 , 24};

const char character2b[] = { 32 , 32 , 32 , 15 , 31 , 31 , 31 , 3};

const char character3b[] = { 32 , 32 , 32 , 3 , 31 , 31 , 31 , 31};

const char character4b[] = { 1 , 31 , 31 , 31 , 27 , 27 , 16 , 16};

const char character5b[] = { 19 , 19 , 2 , 2 , 4 , 32 , 32 , 32};

const char character6b[] = { 31 , 7 , 14 , 6 , 1 , 32 , 32 , 32};

const char character7b[] = { 15 , 7 , 19 , 15 , 32 , 16 , 32 , 32};

const char character8b[] = { 16 , 24 , 12 , 4 , 2 , 1 , 32 , 32};

Page 27: Os Display LCD Alfanumericos

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

pos_char1,char num) {

char i;

if (num == 1){

LCD8_Cmd(64);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8[i]);

LCD8_Cmd(LCD_RETURN_HOME);

lcd8_chr(pos_row, pos_char, 0);

LCD8_Chr_cp(1);

LCD8_Chr_cp(2);

LCD8_Chr_cp(3);

lcd8_chr(pos_row1, pos_char1, 4);

LCD8_Chr_cp(5);

LCD8_Chr_cp(6);

LCD8_Chr_cp(7);

}

if (num == 2){

LCD8_Cmd(64);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7a[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8a[i]);

LCD8_Cmd(LCD_RETURN_HOME);

lcd8_chr(pos_row, pos_char, 0);

LCD8_Chr_cp(1);

LCD8_Chr_cp(2);

LCD8_Chr_cp(3);

lcd8_chr(pos_row1, pos_char1, 4);

LCD8_Chr_cp(5);

LCD8_Chr_cp(6);

LCD8_Chr_cp(7);

}

if (num == 3){

LCD8_Cmd(64);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7b[i]);

for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8b[i]);

LCD8_Cmd(LCD_RETURN_HOME);

lcd8_chr(pos_row, pos_char, 0);

LCD8_Chr_cp(1);

LCD8_Chr_cp(2);

Page 28: Os Display LCD Alfanumericos

LCD8_Chr_cp(3);

lcd8_chr(pos_row1, pos_char1, 4);

LCD8_Chr_cp(5);

LCD8_Chr_cp(6);

LCD8_Chr_cp(7);

}

}

void main() {

unsigned char texto[10];

trisd = 0; //configura todos os pinos do portd como saída

trise = 0; //configura todos os pinos do porte como saida

ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //

lcd8_cmd(lcd_clear); //apaga display LCD

lcd8_cmd(lcd_cursor_off); //desliga cursor

while(1){

escreve (1,1,2,1,3);

delay_ms(100);

escreve (1,1,2,1,2);

delay_ms(100);

escreve (1,1,2,1,1);

delay_ms(100);

}

}

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programação

em C

Microgenios © 1998 - 2008. Todos os direitos reservados. É proibido cópia parcial ou

integral desse material sem prévio aviso. Maiores informações:

[email protected]