ÍNDICE DE CONTEÚDO
Neste sketch será apresentado o funcionamento do display LCD compatível com HD44780 em modo de 4 bits utilizando as saídas do circuito integrado registrador de deslocamento.
Link para a simulação aqui.
Para configurar o LCD é necessário antes saber o que significa cada terminal.
- GND e VCC são os pinos de alimentação;
- VO regula o contraste;
- RS seleciona entre entrada de comandos ou dados;
- RW configura para leitura ou escrita (0V para escrita);
- E habilita a captura de dados (clock);
- DB0 até DB7 são os pinos de dados;
- LED + e LED – são a alimentação do backlight.
Para comunicação utilizando apenas 4 das 8 portas de dados do display, as portas de DB4 até DB7 serão conectadas às portas Q4 até Q7 do registrador de deslocamento. RS e E conectadas às portas digitais do microcontrolador.
Esta tabela será utilizada para configuração do dispositivo e pode ser encontrada no seu datasheet.
Ao inicializar o LCD, ele estará inicialmente operando no modo 8 bits. É necessário primeiro, utilizando a linha Config. da tabela, enviar os 4 bits mais significativos para chaveá-lo para o modo 4 bits, são eles 0b0100, em hexadecimal 0x02.
Código
Como discutido anteriormente, os valores a serem passados para os terminais de dados do display serão os bits mais significativos do registrador de deslocamento, tornando, então, necessárias funções que direcionem os dados para esses bits. São elas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void lcdCmd(unsigned char cmd){ digitalWrite(RS, LOW); // RS = 0 para envio de comandos serialWrite(cmd); // Escreve os 4 bits mais significativos nas porta DB7 a DB4 digitalWrite(E, HIGH); // Pulso de clock para capturar os dados delayMicroseconds(40); digitalWrite(E, LOW); delayMicroseconds(40); serialWrite(cmd<<4); // Escreve os 4 bits menos significativos nas porta DB7 a DB4 digitalWrite(E, HIGH);// Pulso de clock para capturar os dados delayMicrosseconds(40); digitalWrite(E, LOW); delayMicrosseconds(40); } void lcdData(unsigned char data){ digitalWrite(RS, HIGH); // RS = 1 para envio de dados serialWrite(data); // Escreve os 4 bits mais significativos nas porta DB7 a DB4 digitalWrite(E, HIGH); // Pulso de clock para capturar os dados delay(2); digitalWrite(E, LOW); delay(2); serialWrite(data<<4); // Escreve os 4 bits menos significativos nas porta DB7 a DB4 digitalWrite(E, HIGH); // Pulso de clock para capturar os dados delay(2); digitalWrite(E, LOW); delay(2); digitalWrite(RS, LOW); //Retorna RS para nível baixo } |
Uma vez chaveado para o modo de 4 bits, o display espera dois blocos de 4 bits de dados serem recebidos para executar o comando equivalente. A função lcdCmd(unsigned char data) coloca o terminal RS em nível baixo, caracterizando um comando, e faz com que os 8 bits (unsigned char data) referentes ao comando sejam divididos em duas parcelas de 4 bits e sejam transmitidos separadamente através do circuito integrado registrador de deslocamento, sendo o primeiro pacote os 4 bits mais significativos e o segundo pacote os 4 bits menos significativos. A função lcdData(unsigned char data) funciona da mesma maneira, porém coloca o terminal RS em nível alto, caracterizando um dado, o qual será impresso de acordo com a tabela ASCII.
Após definido o modo de comunicação entre o microcontrolador e o LCD, é necessário configurá-lo para dar início ao seu funcionamento. Isso é feito na função a seguir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#define E 6 #define RS 7 void lcdInit(){ delay(10); //Garante que o display foi ligado pinMode(RS, OUTPUT); // Configura os pinos como saída pinMode(E, OUTPUT); digitalWrite(RS, LOW); // Inicializa com nível baixo digitalWrite(E, LOW); lcdCmd(0x02); // Chaveia para o modo 4 bits lcdCmd(0x28); // 4 bits, 2 linhas, 5x8 lcdCmd(0x06); // modo incremental lcdCmd(0x0F); // display, cursor e blinking ON lcdCmd(0x03); // zera contadores internos lcdCmd(0x01); // limpar display lcdCmd(0x80); // posição inicial } |
A função lcdInit() realiza as configurações necessárias enviando os comandos de acordo com a tabela mostrada anteriormente. Uma vez que todas as funções para manuseio do display foram definidas, é possível, agora, nas funções principais, fazer o teste das mesmas.
Os displays compatíveis com o HD44780 permitem a criação de 8 caracteres personalizados no formato binário e matricial de 8×5, armazenados a partir do endereço 0x40.
Para gerar uma imagem, podem ser seguidos os seguintes passos:
- Criar uma imagem binária com o desenho desejado;
- Segmentar a imagem em retângulos de 8×5;
- Transcrever cada linha em binário/hexadecimal;
- Gerar o código-fonte.
No exemplo da simulação foi usado o logo da Universidade Federal de Itajubá.
1 – Criar uma imagem binária com o desenho desejado
2 – Segmentar a imagem em retângulos de 8×5
3 – Transcrever cada linha em binário/hexadecimal
4 – Gerar o código fonte
Obs.: Os caracteres gravados são impressos a partir do número 0, ou seja, o primeiro caractere é impresso utilizando o comando lcdData(0), o segundo lcdData(1), e assim sucessivamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#define DS 8 #define EN 10 #define CLK 11 #define RS 7 #define E 6 void setup (){ serialInit(); lcdInit(); char unifei [] = { //Valores relativos ao logo da UNIFEI 0x01, 0x03, 0x03, 0x0E, 0x1C, 0x18, 0x08, 0x08, 0x11, 0x1F, 0x00, 0x01, 0x1F, 0x12, 0x14, 0x1F, 0x10, 0x18, 0x18, 0x0E, 0x07, 0x03, 0x02, 0x02, 0x08, 0x18, 0x1C, 0x0E, 0x03, 0x03, 0x01, 0x00, 0x12, 0x14, 0x1F, 0x08, 0x00, 0x1F, 0x11, 0x00, 0x02, 0x03, 0x07, 0x0E, 0x18, 0x18, 0x10, 0x00 }; lcdCmd(0x40); //Configura para a primeira posição na memória for(char i=0; i<48; i++){ lcdData(unifei[i]); //Grava cada uma das linhas em ordem } lcdCmd(0x81); //segunda coluna, primeira linha lcdData(0); lcdData(1); lcdData(2); lcdCmd(0xC1); //segunda coluna, segunda linha lcdData(3); lcdData(4); lcdData(5); lcdCmd(0x88); //nona coluna, primeira linha lcdData('P'); lcdData('Q'); lcdData('D'); lcdData('B'); lcdCmd(0xC7); //oitava coluna, segunda linha lcdData('U'); lcdData('N'); lcdData('I'); lcdData('F'); lcdData('E'); lcdData('I'); lcdCmd(0x0C); //Cursor desligado } void loop (){ } |
Conclusão
Apesar de uma notável lentidão nas simulações com o aumento da complexidade dos circuitos, a plataforma Tinkercad mostrou-se uma poderosa ferramenta de simulação de circuitos digitais e analógicos, com impressionantes resultados quando analisado o poder de processamento necessário para reproduzir o funcionamento de diversos dispositivos, tais como o microcontrolador Arduino UNO R3, o circuito integrado 74HC595, o display LCD HD44780, sensores e componentes analógicos, LEDs, displays de 7 segmentos e infinitas outras possibilidades. Isso torna o Tinkercad uma ótima ferramenta para aqueles que não possuem os componentes em mãos, para os entusiastas e para todos que desejam aprender programação embarcada.
Todos os códigos podem ser acessados em meu GitHub.
Saiba mais
Medindo temperatura e umidade com Arduino UNO utilizando Si7021 e LCD
Meus parabéns pelo trabalho. E é suado mas ainda vale a pena.
Sucesso a você
Abraço
link correto https://www.tinkercad.com/things/6JlFVXc4MlI-lcd#/
Foi corrigido, muito obrigado.