HOME PROJETOS PROGRAMAÇÃO |
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 | A1 | A0 | WRITE | READ | ADDRESS |
---|---|---|---|---|---|
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 |
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.
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.
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 |
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: 13 de Sep de 2024 |