O módulo LCD é a unidade de saída mais comum em uma placa microcontroladora. É muito eficaz, pois pode exibir mensagens, valores, relógio, etc. Tipos especiais de drivers de LCD são usados para acionar o LCD. Dois ou mais ICs de driver desse tipo, juntamente com a tela LCD, formam módulos LCD encontrados em sistemas embarcados. Os caracteres exibidos nos módulos LCD são, na verdade, armazenados nos locais de memória interna desses controladores. Eles são armazenados de forma que se assemelham exatamente à tabela ASCII. Sempre que os microcontroladores enviam um valor ASCII, os controladores LCD exibem o caracter ASCII que foi armazenado correspondente a esse valor.
Os módulos LCD podem exibir não apenas caracteres ASCII, mas também caracteres personalizados. O usuário pode armazenar a matriz de pixels correspondente ao caractere personalizado em um módulo LCD. O caractere personalizado armazenado pode ser exibido enviando o valor correspondente ao módulo LCD.
O módulo LCD possui dois ou mais ICs de driver de vídeo que armazenam o padrão de caracteres a ser exibido. Sempre que um valor ASCII é enviado ao módulo LCD, o controlador carrega o array de caracteres correspondente e o exibe na tela LCD. Para exibir cada caractere, a tela LCD usa uma matriz de 8*5 pixels na tela. Na memória interna todos os pixels a serem ativados para um determinado caractere são armazenados como 1 e os demais são mantidos como 0. Um exemplo de caractere armazenado na memória EPROM interna do controlador LCD comum HD44780 é mostrado na imagem a seguir;
Fig. 2: Padrão de caracteres armazenado na memória EPROM do controlador LCD HD44780
A imagem mostrada acima é o padrão de caracteres armazenado na memória interna do controlador LCD. O valor ASCII para a letra 'b' em binário é 0b01100010 e portanto o padrão é armazenado no local da memória com o mesmo endereço. Portanto, quando o microcontrolador envia o valor ASCII do caractere 'b', o controlador LCD carrega o padrão de caractere do mesmo local com o endereço igual a esse valor ASCII. A memória onde os caracteres padrão são armazenados é chamada de ROM gerador de caracteres (CGROM). O usuário não pode gravar nesses locais, pois se trata de memória somente leitura (ROM). O controlador LCD possui outro bloco de memória que é uma memória de leitura e gravação com 64 bytes (8*8) de armazenamento por local onde o usuário pode armazenar seus caracteres personalizados. O usuário pode gravar 64 caracteres personalizados nesta memória, conhecida como Character Generator RAM (CGRAM).
Neste projeto é utilizada a placa Arduino pro-mini que é então programada com o auxílio do Arduino IDE versão 1.0.3 no sistema operacional Windows. A imagem da placa Arduino pro-mini e do Arduino IDE é mostrada a seguir;
Fig. 3: Placa Arduino Pro-Mini típica
Fig. 4: Janela do software Arduino IDE
Outro hardware que pode realizar a conversão de USB para TTL é usado para carregar o programa na placa Arduino.
5: Placa conversora USB para TTL externa para programação Arduino e comunicação serial
Presume-se que o leitor tenha passado pelo projeto como começar com o arduino e fiz todas as coisas discutidas nele. É preciso descobrir o caractere personalizado que precisa ser exibido na tela LCD. Os caracteres personalizados exibidos neste projeto são mostrados na imagem a seguir e a seção a seguir explica como descobrir o padrão de caracteres necessário para cada caractere personalizado.
Fig. 6: Caracteres personalizados criados no projeto no LCD usando a configuração do circuito Arduino na placa de ensaio
O LCD usa um bloco de 8*8 pixels para exibir cada caractere e, portanto, é necessário assumir uma matriz 8*5 e desenhar o caractere personalizado necessário e descobrir o padrão de bits necessário. Pode-se trabalhar com a ajuda da matriz de pixels e da matriz binária, conforme mostrado na imagem a seguir.
Fig. 7: Pixel 8 * 5 e matriz binária para meio ciclo positivo para caracteres personalizados
Existem oito linhas R0 a R7 e oito colunas C0 a C7. Os valores em todas as linhas e colunas agora são zero, pois todos os pixels estão desativados. Todos os pixels que precisam ser ativados devem receber o valor 1 e o restante deve ser mantido como 0. Agora leia o padrão binário e escreva o mesmo no CGRAM para gerar o caractere personalizado. É aconselhável armazenar o padrão de caracteres em uma matriz de caracteres para que seja fácil de usar com o código C. A matriz de pixels e a matriz binária do primeiro caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 8: 8*5 pixels e matriz binária para o primeiro caractere personalizado
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b11111
};
A matriz de pixels e a matriz binária do segundo caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 9: 8*5 pixels e matriz binária para segundo caractere personalizado usando Arduino
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do terceiro caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 10: Pixel e array binário para terceiro caractere personalizado usando Arduino
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b11111,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do quarto caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 11: Pixel e matriz binária para o quarto caractere personalizado
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b00000,
0b00000,
0b11111,
0b11111,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do quinto caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 12: Pixel e matriz binária para o quinto caractere personalizado
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b00000,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do sexto caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 13: Pixel e matriz binária para o sexto caractere personalizado
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b00000,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do sétimo caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 14: Pixel e matriz binária para o sétimo caractere personalizado usando Arduino
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b00000,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
A matriz de pixels e a matriz binária do oitavo caractere personalizado exibido no projeto são mostradas na imagem a seguir;
Fig. 15: Pixel e matriz binária para o oitavo caractere personalizado usando Arduino
A matriz de caracteres de 8 bytes para o caractere personalizado mostrado acima pode ser definida no código conforme fornecido abaixo;
{
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
O Arduino IDE possui uma biblioteca chamada
O código escrito para este projeto possui uma função lcd.createChar que ajuda a criar caracteres personalizados em uma tela LCD. Os detalhes da função lcd.createChar são discutidos na seção a seguir.
lcd.createChar
A função lcd.createChar pode ser usada para escrever um caractere personalizado no local necessário no CGRAM. A função possui dois parâmetros nos quais o primeiro parâmetro é o local na memória CGRAM onde o array de caracteres correspondente ao caractere personalizado precisa ser armazenado e o segundo parâmetro é o próprio array de caracteres. Por exemplo, se houver uma matriz de caracteres personalizada chamada 'cc' e ela precisar ser armazenada no 5º localização do CGRAM pode-se usar a seguinte afirmação;
lcd.createChar(5, cc);
A instrução acima grava a matriz de caracteres no 5º localização do CGRAM do controlador LCD de onde ele pode ser exibido chamando a função lcd.write discutida nos projetos em como conectar o LCD ao PCe como fazer um display LCD de rolagem.
lcd.write(5);
Código-fonte do projeto
### /*================================= EG LABS ======================================= Receive a character through the serial port of the PC and display the same cahracter in a 16*2 LCD in scrolling manner along with glowing an LED each time The circuit: * LED attached from pin 5 to ground through a 1K resistor LCD: * LCD RS pin to digital pin 12 * LCD Enable pin to digital pin 11 * LCD D4 pin to digital pin 5 * LCD D5 pin to digital pin 4 * LCD D6 pin to digital pin 3 * LCD D7 pin to digital pin 2 * LCD R/W pin to ground * 10K resistor: * ends to +5V and ground * wiper to LCD pin 3 * LED anode attached to digital output 6 * LED cathode attached to ground through a 1K resistor //================================= EG LABS =======================================*/ // include the library code: #include// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //----------------- store the custom characters in arrays ---------------------// byte cc1(8) = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111 }; byte cc2(8) = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111 }; byte cc3(8) = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111 }; byte cc4(8) = { 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111 }; byte cc5(8) = { 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; byte cc6(8) = { 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; byte cc7(8) = { 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; byte cc8(8) = { 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; //----------------- store the custom characters in arrays ---------------------// // give the LED pin a name: int led = 6; void setup { //---- create custom characters ----// lcd.createChar(1, cc1); lcd.createChar(2, cc2); lcd.createChar(3, cc3); lcd.createChar(4, cc4); lcd.createChar(5, cc5); lcd.createChar(6, cc6); lcd.createChar(7, cc7); lcd.createChar(8, cc8); //---- create custom characters ----// // initialize the led pin as an output. pinMode(led, OUTPUT); // set up the lcd's number of columns and rows: lcd.begin(16, 2); } void loop { lcd.print("EG LABS "); lcd.write(1); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(2); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(3); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(4); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(5); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(6); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(7); //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.write(8); // dispaly custom character //---- blink LED -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); //---- blink LED -----// lcd.clear ; } ###
Diagramas de circuito
Diagrama de Circuito-Criando Caracteres Personalizados-LCD-Usando-Arduino | ![]() |
Componentes do Projeto
- Arduino ProMini
- LCD
- LIDERADO
- Resistor
Vídeo do projeto