Ligando Display LCD 16×2 ao PIC 16F628A 18

Para ligarmos um display LCD 16×2 ao PIC, precisamos antes de mais nada saber como programar pic e entender um pouco sobre a forma como esse tipo de display trabalha. Um dos tipos mais comuns de controlador utilizados em displays LCD é o HD44780, que pode ser ligado ao microcontrolador usando-se 4 ou 8 fios, e que vai determinar a velocidade de comunicação entre eles.

Não podemos simplesmente enviar dados à um LCD sem uma sequencia lógica. Antes de utilizá-lo, é necessário o envio de comandos que preparam o display para receber caracteres. Vamos tomar como exemplo o display LCD 16×2 com controlador HD44780, disponível aqui na FILIPEFLOP :

Esse tipo de display tem 16 pinos : 3 pinos de alimentação, 3 de controle, 8 de dados e 2 para acionar o backlight (ou luz de fundo), que você pode ver em detalhes na imagem abaixo :

Os pinos de controle do display LCD 16×2 são o RS, o R/W e o E.

O pino RS tem a função de mostrar ao display que tipo de dados estamos transmitindo. Em nível baixo (0), os dados são tratados como comandos, e em nível alto (1), os dados são tratados como caracteres. O pino R/W (Read/Write) é utilizado para determinar se estamos lendo ou transmitindo dados para o display. Já o pino ENABLE é utilizado para determinar o início da transferência de dados entre o microcontrolador e o display.

Os pinos de dados D0 a D7 formam o barramento de dados. O mais comum é utilizarmos apenas 4 pinos para comunicação com o microcontrolador, mas nada impede que em aplicações mais elaboradas sejam utilizados todos os 8 pinos. Essa é uma das funções do envio de comandos que preparam o display, pois é nesse momento que determinamos se vamos usar 4 ou 8 pinos para comunicação.

No Arduino temos várias bibliotecas prontas que fazem todo esse trabalho pesado. No caso do PIC, podemos agrupar os comandos também em um arquivo texto e criar uma biblioteca própria. Esse é o método que vamos utilizar nesse post, contando com a ajuda das rotinas de comando do display disponibilizadas no blog do Marcelo Maciel.

Para controle do display LCD 16×2 vamos utilizar o microcontrolador PIC16F628A, e o programa desenvolvido para uso no software MPLab. Os detalhes para configuração e utilização do MPLab você encontra no artigo Programando PIC16F628A para piscar um led, aqui mesmo no blog.

Crie no MPLab a estrutura básica do projeto, e na mesma pasta do projeto crie um arquivo texto com o nome de lcd.h. Dentro desse arquivo, copie o seguinte código :

A estrutura da pasta do projeto vai ficar mais ou menos assim :

No MPLab, coloque o código abaixo, que chama as rotinas contidas no arquivo lcd.h para inicializar o display, apagar a tela, enviar caracteres, etc. No circuito vamos usar um cristal de 16Mhz, mas você pode utilizar, por exemplo um de 20Mhz. Para isso, altere a linha com o comando #use delay(clock=16000000) no início do programa:

Grave o programa utilizando o software MicroBRN, ou outro de sua preferência, e teste o microcontrolador ligando-o ao display seguindo a tabela e circuito mostrados abaixo :

Além disso, ligue o pino 5 do PIC ao GND e o pino 14 ao 5v. O cristal deve ser ligado aos pinos 15 e 16 do PIC.

A alimentação do circuito é de 5v e o potenciômetro é de 10 K, utilizado para controle do contraste do display LCD 16×2. Se necessário, coloque um resistor no pino 15 ou 16 para reduzir a intensidade da luz de fundo.

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota aos posts (estrelas no início ou no final do artigo) e visite nossa loja FILIPEFLOP !

Posts Relacionados

18 Comentários

  1. Ola amigo bom noite. será que teria como você me enviar por e-mail o arquivo deste programa. pois não consegui fazer.
    Estou precisando pois quero fazer um robo e pretendo usar o pic16f628a e um display 16×2.

    att: Mateus

  2. Essa biblioteca possibilita, assim como outras, um comando para mostrar o estado ou o valor de uma variável? se sim, qual o comando?

  3. Meus parabéns!
    Seus posts são de grande ajuda para muita gente, eu como iniciante em PIC tenho esclarecido
    muitas dúvidas com os seus artigos.

    Que Deus te dê muita sabedoria e você continue compartilhando conosco.

    1. Valeu Gunter ! Abraço.

      Adilson – Equipe FILIPEFLOP

  4. Boa tarde!
    Uma dúvida, a segunda parte da programação, eu tenho que colocar logo abaixo da primeira?

    1. Boa noite Marlon,

      Não. A primeira parte você coloca em um arquivo texto, o lcd.h. A segunda parte você vai utilizar dentro do MPLab, para chamar as rotinas que foram inseridas nesse arquivo texto.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  5. Ola. Boa tarde
    Gentileza informar se Voce grava um PIC para meu projeto. Caso positivo como fazer para enviar.

  6. Esta biblioteca serve para qualquer PIC da familia 16?? mais especificamente o 16f877A?

  7. Boa noite,

    Tentei fazer o projeto mas não funcionou… no display acendem todos os quadrados da linha inferior, somente isso. Tem alguma ideia do que pode ser?

    1. Ajuste o pot do Vee

  8. olá, eu gostaria de saber até que distância consigo ligar o display do PIC? Exemplo posso ligar o LCD há 5 metros do PIC? A ideia é fazer esta ligação através de um cabo de rede.

    1. Boa tarde Rafael,

      Não temos essa informação. Só testando mesmo.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  9. quantos sao de i/o como os pinos sao divididos

  10. como é possivel configurar os pinos de i/o

  11. posso utilizar o pic 16f877a ?

  12. O que faz a função bit_test()? é do proprio pic?
    Estou tentando utilizar essa biblioteca com um microcontrolador da freescale.

  13. Como faço para escrever uma string maior que o numero de posições do LCD, de forma que uma frase com 30 caracteres por exemplo, possa aparecer uma parte na linha de cima (16 colunas) e o restante na linha de baixo (14 colunas) ??

  14. Olá, gostaria de saber como envio uma variável GLOBAL do tipo STRING para o LCD?.
    Atualmente uso para enviar uma variável do tipo INTEIRO para o lcd a seguinte instrução: printf(LCD_texto,”fHora: %2u:%2u:%2u”,hora,min,seg); //Escrevo
    Funciona, mas String não estou conseguindo.
    Poderia me ajudar?
    Muito obrigado!!
    Marcio Leandro

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *