H P S P I N E l e t r ô n i c a D i g i t a l e P r o g r a m a ç ã o d e M i c r o c o n t r o l a d o r e s P I C |
HOME PROJETOS PROGRAMAÇÃO |
Vamos aprender como conectar ao PIC um LCD alfanumérico padrão HD44780 da HITACHI.
Os LCDs alfanuméricos podem variar quanto ao número de linhas e o número de colunas mas isso realmente não importa porque eles seguem um padrão, no caso o HD44780 da HITACHI, que veremos aqui.
Ao adiquirir um LCD alfanumérico, tente obter, também, o data sheet do dispositivo pois, apesar de seguirem o padrão e todos eles possuirem 16 pinos, a ordem dos mesmos pode variar de dispositivo para dispositivo.
A tabela a baixo mostra a pinagem mais comum de um LCD HITACHI HD44780
Pino | Função | Nível | Descrição | 1 | Vss | - | 0v | Alimentação | 2 | Vdd | - | 5v | 3 | Vl | - | - | 4 | RS | H/L | H: Entrada de dado L: Entrada de comando |
5 | R/W | H/L | H: Leitura de dado L: Gravação de dado |
6 | E | H, H->L | Sinal de habilitação | 7 | D0 | H/L | BUS de dados | 8 | D1 | H/L | 9 | D2 | H/L | 10 | D3 | H/L | 11 | D4 | H/L | 12 | D5 | H/L | 13 | D6 | H/L | 14 | D7 | H/L | 15 | A | - | Anodo do LED do backlight | 16 | K | - | Catodo do LED do backlight |
---|
Abaixo temos o esquema elétrico das conexões do LCD ao microcontrolador. Você pode baixar o projeto Eagle deste esquema elétrico na sessão Downloads.
![]() |
Para controlar o envio de dados e comandos ao LCD foi desenvolvida uma subrotina, chamada "lcdhd44780.asm" com diversas funções como configuração do LCD, apagamento, posicionamento do cursor e envio de caracteres ao LCD, entre outras. Essa subrotina foi escrita de maneira a tornar independente a escolha do microcontrolador PIC, tendo sido testada com os chips das famílias 16F e 18F sem apresentar problemas.
A subrotina "lcdhd44780.asm"" com as funções de controle, os módulos auxiliares e todas as macro instruções necessárias para a operação do LCD se encontram na pasta "lcd44780 do arquivo lcdhd44780_mplab_project.zip que deve ser baixado e descompactado no seu HD. Após o download desse arquivo, abra o projeto no MPLAB.
#include "lcdhd44780.asm" ; subrotina de controle do LCD #include "delay_ms.inc" ; subrotina de retardo em milisegundos #include "delay_us.inc" ; subrotina de retardo em microsegundos |
#define _PARALLEL_LCD ; LCD com conexoes normais LCD_R0 RES 1 ; registrador de trabalho 0 LCD_R1 RES 1 ; registrador de trabalho 1 LCD_R2 RES 1 ; registrador de trabalho 2 LCD_COMMAND RES 1 ; buffer de comando LCD_TRIS_port equ TRISB ; registrador de controle de LCD_port LCD_port equ PORTB ; nome da porta de dados do LDC (PORTA, PORTB,GPIO, etc) LCD_TRIS_cntl equ TRISA ; registrador de controle de LCD_cntl LCD_cntl equ PORTA ; nome da porta de controle (PORTA, PORTB,GPIO, etc) LCD_EN equ 1 ; bit ENABLE/DISABLE na porta de controle LCD_RS equ 0 ; bit RS na porta de controle |
Este exemplo mostra como enviar o caracter "X" para a coluna "8" da linha "1" do LCD usando funções da subrotina "lcdhd44780.asm"".
call SR_4BITS ; inicializa o LCD call SR_LCDRESET ; garante que o LCD esta limpo movlw 1 ; linha 1 call SR_SETLINE ; estabelece a linha movlw 8 ; coluna 8 call SR_SETCOL ; estabelece a coluna call SR_setcursor ; posiciona o cursor em (1,8) movlw "X" ; W = "X" call SR_SENDW ; envia "X" para a posicao (1,8) |
Este exemplo mostra como enviar o caracter "X" para a coluna "8" da linha "1" do LCD fazendo o posicionamento com a macro "SET_CURSOR"".
call SR_4BITS ; inicializa o LCD call SR_LCDRESET ; garante que o LCD esta limpo SET_CURSOR .1, .8, "i" ; posiciona na coluna 8 da linha 1 movlw "X" ; W = "X" call SR_SENDW ; envia "X" para a posicao (1,8) |
Todas as funções são compatíveis com microcontroladores das famílias 16F e 18F.
As seguintes funções são fornecidas pela subrotina lcdsr44780:
SR_4BITS | Inicializa o LCD |
SR_LCDRESET | Limpa e reposiciona o LCD |
SR_LCDCLEAR | Limpa o LCD |
SR_SENDW | Envia o valor de W ao LCD |
SR_SENDCHR | Envia ao LCD o caracter do registrador LCD_COMMAND |
SR_SENDCMD | Envia ao LCD o comando do registrador LCD_COMMAND |
SR_CURSORHOME | Posiciona o cursor do LCD na linha 1 coluna 1 |
SR_SETCURSOR | Posiciona o cursor na linha e coluna especificada |
SR_LINESET | Posiciona o cursor no início de uma linha |
A função SR_4BITS inicializa o LCD no modo 4 bits. Essa função deve ser chamada no início do programa antes que se possa enviar dados ao LCD.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD . . |
A função SR_LCDRESET limpa o LCD e posiciona o cursor na linha 1 e coluna 1.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDRESET ; reposiciona o LCD . |
A função SR_LCDCLEAR apaga todas as linhas do LCD.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDCLEAR ; garante que o LCD esta limpo . . |
A função SR_SENDW envia o caracter contido no registrador W para ser exibido na posição atual da tela do LCD.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDCLEAR ; garante que o LCD esta limpo movlw "A" ; W = "A" call SR_SENDW ; envia "A" ao LCD . |
A função SR_SENDCHR coloca o LCD em modo de recepção de dados e envia o caracter contido no registrador LCD_COMMAND para ser exibido na posição atual da tela.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDCLEAR ; garante que o LCD esta limpo movlw "A" ; caracter "A" movwf LCD_COMMAND ; move "A" para o buffer call SR_SENDCHR ; envia "A" ao LCD . |
A função SR_SENDCMD coloca o LCD em "modo de comando" e envia o comando contido no registrador LCD_COMMAND para o LCD executar. Os comandos aceitos fazem parte do firmware do LCD e devem ser consultados nos data sheets dos respectivos dispositivos.
inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDCLEAR ; garante que o LCD esta limpo movlw b'00101111' ; configura interface de 4 bits andwf LCD_COMMAND,f ; move o commmando para o buffer call SR_SENDCMD ; envia o comando . |
A função SR_CURSORHOME posiciona o cursor na primeira linha e primeira coluna do LCD mas não apaga o seu conteúdo.
. inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_CURSORHOME ; posiciona na linha 1, coluna 1 . |
A função SR_SETCURSOR Posiciona o cursor numa determinada linha e coluna do LCD.
O registrador SR_1 deve conter o número da linha e o registrador SR_2 o número da coluna que devem ser compatíveis com o LCD, cujos endereços serão fornecidos pela macro LCD_LINES que deve ser emitida uma única vez para gerar a respectiva tabela de endereços de linhas e colunas.
A função SR_SETCURSOR pode ser chamada pela macro SET_CURSOR que facilita a programação permitindo que os valores de linha e coluna sejam escritos diretamente na macro.
. LCD_LINES 0216 ; macro p/ gerar enderecos linha/coluna p/ LCD 2x16 . . inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDRESET ; reposiciona o LCD movlw .1 ; liha 1 movwf SR_1 ; carrega registrador de linha movlw .5 ; coluna 5 movwf SR_2 ; carrega registrador de coluna call SR_SETCURSOR ; posiciona o cursor . . |
A função SR_LINESET posiciona o cursor do LCD no início de uma linha, isto é, na primeira coluna da linha especificada no registrador W.
Esta rotina exige que a macro LCD_LINES seja emitida no início do programa para gerar a tabela de enderecos das linhas para o LCD.
. LCD_LINES 0216 ; macro p/ gerar enderecos linha/coluna p/ LCD 2x16 . . inicio movlw 7 movwf CMCON . . call SR_4BITS ; inicializa LCD call SR_LCDRESET ; reposiciona o LCD movlw .2 ; linha 2 call SR_LINESET ; posiciona no inicio da linha 2 . |
Para facilitar a programação, algumas macros foram desenvolvidas para fazer interface com as funções da subrotina lcdsr44780:
FAMILIAS | Identifica o microcontrolador |
LCD_LINES | Gera tabela de endereços de linhas e colunas para o LCD |
SET_CURSOR | Posiciona o cursor do LCD numa linha e coluna especificada |
SR_4MVC | Envia uma string ao LCD |
De tudo o que foi visto acima, podemos resumir nos seguintes passos o que o programador deve seguir para usar as funções da subrotina lcdhd44780:
1 - Montar o hardware conforme esquema fornecido. |
2 - Incluir no programa os registradores e símbolos requeridos pela subrotina. |
3 - Incluir no programa o código da subrotina e as subrotinas de delay exigidas. |
4 - Fazer uma chamada à função SR_4BITS para inicializar o LCD. |
5 - Limpar o LCD com a função SR_LCDRESET ou SR_LCDCLEAR. |
6 - Posicionar o cursor do LCD com a função SR_SETCURSOR. |
7 - Enviar dados ou comandos ao LCD com as funções SR_SENDW e SR_SENDCMD. |
Um exemplo completo de uso do LCD com a subrotina lcdhd44780 é fornecido aqui para o PIC16F628A.
Baixe o projeto na sessão Downloads e descompacte o arquivo .zip no seu HD.
Será gerada a pasta lcd44780. Entre na nessa pasta e, em seguida, clique duas vezes no arquivo lcd44780.mcp para visualizar o projeto no MPLAB.
Todas a subrotinas, macros e arquivos auxiliares, referenciados pelas diretivas #include dentro do programa fonte em assembler, estão dentro da pasta lcd44780.
Você também pode gravar o arquivo lcd44780.hex diretamente no seu microcontrolador.
O programa do exemplo foi testado e funciona corretamente, por isso, se o seu circuito foi montado corretamente, o LCD deverá apresentar, na primeira linha, a mensagem "Visite-nos em" e, na segunda linha, a mensagem "hpspin.com.br". Se isso não acontecer, revise o circuito e tente novamente.
Projeto MPLAB do programa exemplo lcdhd44780_mplab_project.zip
Projeto EAGLE do esquema elétrico lcdhd44780_eagle_project.zip
Lembre-se que a alteração do conteúdo das macros ou subrotinas podem causar resultados imprevisíveis quando não catastróficos.
Índice dos circuitos |
![]() |
H P S P I N Desde 04 de Março de 2010 Atualização: 01 de May de 2025 |
![]() |