HOME      PROJETOS      PROGRAMAÇÃO     




Driver para LCD I2C

Este projeto apresenta um driver de LCD para a família PIC18F, usando o módulo MSSP do microcontrolador configurado como Master no modo I2C. O LCD é acoplado ao expansor de I/O PCF8574T, também de Bus I2C.

O objetivo do projeto é fornecer um driver para LCD I2C em linguagem assembler, capaz de liberar o programador do esforço de construir um controlador para esse dispositivo e deixá-lo se concentrar na resolução do seu problema.

Os LCDs são dispositivos essenciais na exibição de dados quando se usa microcontroladores porém eles utilizam uma boa parte dos pinos de I/O que poderiam ser usados para outras finalidades. LCDs como os HD44780, quando usados em modo 4 bits por exemplo, poderiam usar até 7 pinos do microcontrolador. Para evitar esse desperdicio de recursos existem dispositivos como o PCF8574T que permitem usar apenas 2 pino do microcontrolador para fazer a comunicação com LCDs.

O PCF8574T é um dispositivo de expansão de I/O para microcontroladores que possui um Bus I2C (SDA e SCL) e uma porta bidirecional de 8 bits.

Nosso projeto usou um shield adiquirido no mercado, com o LCD e o PCF8574T já montados. Isso vai poupar todo o trabalho de montagem do LCD e do PCF8574T no PCB. Com esse shield podemos, inclusive, controlar o acendimento do back-light do LCD pois sua placa já possui um transistor necessário para essa finalidade que pode ser acionado pelo pino P3 do PCF8574T. A foto ao lado mostra o LCD com o PCF8574T adiquirido onde apenas 4 pinos são necessários para sua operação: dois pinos de alimentação (5V e GND) e dois pinos de comunicação do Bus I2C (SDA e SCL). O Bus I2C deve ter resistores Pull Up de 4K7 pois os testes realizados sem esses resistores não funcionaram.

Apenas a título de informação, o endereço I2C de 7 bits do PCF8574T é fixado na fábrica em 0x27 mas outros modelos podem usar endereços que variam entre 0x20 e 0x27. O endereço do chip usado neste projeto é 0x27.

O LCD e o PCF8574T também podem ser adiquiridos separadamente e montados na placa do projeto. Isso requer alguns resistores externos e, se desejar controlar o back-light do LCD, um transistor também será necessário. Aqueles que optarem por montar o circuito na placa do projeto podem se basear no esquema elétrico abaixo. Notar que o Bus I2C deve ter resistores Pull Up de 4K7.

ESQUEMA ELÉTRICO

Notar que as únicas conexões de hardware com o microcontrolador são as do Bus I2c, isto é, as conexões dos pinos SDA e SCL do PIC com os pinos SDA e SCL do PCF8574T.

Além disso, o PCF8574T possui ainda os pino 1, 2 e 3 (A0, A1 e A2) que não estão representados no esquema. Embora o endereço de fábrica seja 0x27, esses pinos são usados para a configuração manual do endereço do dispositivo no Bus I2C. No caso do Shield esse endereço é 0x27. A tabela abaixo mostra os endereços possíveis.

A2 A1A0WRITEREADADDRESS
 0   0   0   0x40   0x41   0x20 
 0   0   1   0x42   0x43   0x21 
 0   1   0   0x44   0x45   0x22 
 0   1   1   0x45   0x47   0x23 
 1   0   0   0x46   0x49   0x24 
 1   0   1   0x4A   0x4B   0x25 
 1   1   0   0x4C   0x4D   0x26 
 1   1   1   0x4E   0x4F   0x27 



DOWNLOAD DO DRIVER

Após adiquirir o Shield de LCD I2C ou montar o circuito acima, baixe no seu computador o "Projeto do Driver", descomprima o arquivo e abra o projeto no MPLAB. Na pasta do projeto encontra-se o arquivo "lcdi2c.hex" que pode ser gravado diretamente num microcontrolador PIC18F4520. Nessa pasta encontra-se, também, o programa "lcdi2c.asm" que pode ser alterado para testar suas necessidades particulares.




COMO USAR O DRIVER

O driver, cujo arquivo "lcdi2c_services.inc" se encontra na pasta "Includes" do projeto, fornece várias funções de controle e macro instruções que facilitam a programação em um nível razoavelmente alto, isto é, o programador não precisa se preocupar com detalhes do protocolo I2C nem saber como funciona o LCD. Por exemplo, para apagar o LCD basta apenas chamar a função "CALL   lcdClear" e, para enviar uma mensagem ao LCD, usar a macro instrução LCDI2C_WRITE   "Bom dia!!!". Podemos, por exemplo, posicionar o cursor facilmente na linha 2 e coluna 5 do LCD usando a macro instrução SETI2C_CURSOR .2, .5, "i".

Para usar o driver, copie a pasta "Includes" para dentro da pasta do seu projeto e observe o programa abaixo. Ele servirá de exemplo para desenvolver seus próprios programas.

A pasta Includes contem todos os módulos necessários para o funcionamento do driver, tais como módulo de Delay e módulo de controle do Bus I2C de baixo nível.

Notar que todas as macro instruções são escritas em letras maiúsculas.

O programa exemplo, "lcdi2c.asm", que vem no projeto, roda um teste de várias funções do driver. Para executá-lo basta gravar no PIC18F4520 o arquivo "lcdi2c.hex".

Este projeto funciona com um microcontrolador PIC18F4520 com clock a cristal externo de 20MHZ (Fosc) e não foi testado para outras frequências de clock.

O projeto pode, também, ser adaptado facilmente para vários microcontroladores da família 18F como PIC18F4620, PIC18F4550 e, teoricamente, qualquer outro que possua o módulo MSSP. Para isso, modifique os parâmetros de especificação do microcontrolador no fonte do programa:

list p=18F4520 #include <p18F4520.inc>


No caso de adaptação para outro microcontrolador, deve-se, também, prestar atenção na localização dos pinos SDA e SCL que podem variar para cada microcontrolador. No caso do PIC18F4550, as portas SDA e SCL se encontram nos pinos 33 e 34 respectivamente e, no PIC18F4520 estão nos pinos 23 e 18 respectivamente.




TABELA DE FUNÇÕES FORNECIDAS PELO DRIVER

NOME F U N Ç Ã O PARÂMETROS
 lcdClear   Apaga o LCD  Não há
 lcdCursorHome   Move o cursor para a posição (1,1) do LCD  Não há
 lcdCursorOn   Torna o cursor visível  Não há
 lcdCursorOff   Torna o cursor invisível  Não há
 lcdCursorBlink   Torna o cursor piscante  Não há
 lcdCursorNoBlink   Torna o cursor estático  Não há
 lcdBackOn   Acende o Back-Light do LCD  Não há
 lcdBackOff   Apaga o Back-Light do LCD  Não há
 lcdDisplayOn   Habilita o LCD  Não há
 lcdDisplayOff   Desabilita o LCD  Não há
 lcdSetCgram   Estabelece endereço na CGRAM  W contem o endereço
 lcdShiftRigth   Desloca o display N posições para a direita  W contem o número de posições
 lcdShiftLeft   Desloca o display N posições para a esquerda  W contem o número de posições
 lcdPrint   Envia N caracteres de uma string na RAM  W contem o tamanho da string
FSR0 aponta inicio da string



TABELA DE MACRO INSTRUÇÕES

MACRO D E S C R I Ç Ã O
 LCDI2C_CONFIG 

Esta macro faz a configuração inicial do LCD I2C deixando-o pronto para receber dados. LCDI2C_CONFIG device, linhas, colunas, modo, matriz, curmode, curtype device ............... endereço I2C do LCD (default 0x27) linhas ............... número de linhas do LCD colunas .............. número de colunas do LCD modo ................. modo de operação: 4 --> 4 bits ou 8 --> 8 bits matriz ............... dimensão da matriz de caracteres: 7 --> 5x7 ou 10 --> 5x10 curmode .............. modo do cursor: CURSOR_ON ou CURSOR_OFF curtype .............. cursor piscante --> BLINK ou não piscante --> NOBLINK EXEMPLO:   LCDI2C_CONFIG 0x27, .2, .16, .4, .10, CURSOR_OFF, NOBLINK

 SETI2C_CURSOR

Esta macro faz o posicionamento do cursor. SETI2C_CURSOR linha, coluna, tipo linha ................ número da linha coluna ............... número da coluna tipo ................. "i" --> linha e colunas estão inline na macro "r" ou "R" --> linha e coluna estão em registradores EXEMPLO:   SETI2C_CURSOR .2, .1 "i"

 LCDI2C_WRITE

Esta macro envia uma string ao LCD. LCDI2C_WRITE "st" "st".................. é uma string entre aspas EXEMPLO:   LCDI2C_WRITE "ISTO E UM TESTE"

 LCDI2C_PUT

Envia o caracter em W ao LCD. LCDI2C_PUT EXEMPLO:   movlw "Z" LCDI2C_PUT

 LCDI2C_PUTCHAR

Envia o caracter inline na macro ao LCD. LCDI2C_PUTCHAR "ch" "ch" ................. é um caracter entre aspas EXEMPLO:   LCDI2C_PUTCHAR "X"

 LCDI2C_PRINT

Mostra no LCD, uma sequência de caracteres residentes na RAM. LCDI2C_PRINT _address_, len _address_ ............ endereço do início da sequência na RAM len .................. tamanho da string (máximo 255) EXEMPLO:   LCDI2C_PRINT temperatura, .2





Índice dos circuitos




H P S P I N

Desde 04 de Março de 2010

Atualização: 16 de Apr de 2024