Já faz um tempinho que eu escrevi um post sobre o display gráfico LCD 128×64 com controlador ST7920, usando a comunicação serial com o Arduino (leia aqui).

Display Gráfico LCD 128x64

Algumas pessoas me perguntaram como ligar esse mesmo display em modo 8 bits, e agora eu resolvi testar isso. Vamos à ligação.

Ligando display 128×64 LCD no Arduino Uno

Na ligação do display ao Arduino, existem duas diferenças básicas. Uma delas (óbvia), é que eu vou precisar de mais 8 fios para ligação do display ao Arduino, já que agora estou utilizando os pinos de dados de D0 a D7.

A outra é que o pino 15 (PSB), será ligado agora ao Vcc, indicando que a comunicação será paralela:

  • pino 15 (PSB) = LOW = > Comunicação Serial
  • pino 15 (PSB) = HIGH =>  Comunicação Paralela

Com essas alterações, vou montar então o circuito com os pinos de 2 a 5 do Arduino sendo utilizados para o controle do display (RS, RW, Enable e Reset), e os pinos de 6 a 13 como pinos de dados (D0 a D7).

Circuito Arduino Uno LCD 128x64

Lembrando que o potenciômetro utilizado no circuito serve para ajuste do contraste. Usei um de 10K ohms mas você pode utilizar outros valores sem problemas.

Programa e biblioteca u8glib

O programa usa a biblioteca u8glib (download), a mesma que eu usei para  controlar o display na comunicação serial.

Para efeito de testes, deixei no programa as duas linhas de configuração. Se desejar usar a comunicação serial, utilize esta linha:

U8GLIB_ST7920_128X64_1X u8g(2, 3, 4 ,5); 

e para a comunicação paralela, use esta:

U8GLIB_ST7920_128X64_1X u8g(6, 7, 8, 9, 10, 11, 12, 13, 2, 4, 3, 5);

Basta selecionar o tipo de comunicação e não esquecer de alterar o pino 15 para LOW ou HIGH, conforme mostrei acima.

//Programa : Teste Display LCD 128x64 em modo 8 bits
//Autor : Arduino e Cia

#include "U8glib.h"  

//Utilize a linha abaixo para utilizar a comunicacao serial
//(Enable, RW, RS, RESET)
//U8GLIB_ST7920_128X64_1X u8g(2, 3, 4 ,5); 

//Utilize a linha abaixo para utilizar a comunicacao paralela (8 bits)
//(d0, d1, d2, d3, d4, d5, d6, d7, en, di, rw, reset)
U8GLIB_ST7920_128X64_1X u8g(6, 7, 8, 9, 10, 11, 12, 13, 2, 4, 3, 5);

int display = 1;  
   
void u8g_prepare() 
{  
  u8g.setFont(u8g_font_6x10);  
  u8g.setFontRefHeightExtendedText();  
  u8g.setDefaultForegroundColor();  
  u8g.setFontPosTop();  
}  
   
void u8g_Tela1()  //Tela 1 - Arduino e Cia - Retangulos  
{
  u8g.setFont(u8g_font_unifont);  
  u8g.drawStr( 11, 35, "Arduino e Cia");  
  u8g.drawStr( 12, 35, "Arduino e Cia");  
  u8g.drawFrame(0,0,128,64);  
  u8g.drawFrame(2,2,124,60);   
}  
   
void u8g_Tela2() //Tela 2 - Linhas horizontais e verticais
{
  for (int i = 0; i<127 ; i=i+2)
  {
    u8g.drawLine(i,0,i,64); 
  }
  for (int c = 0; c<64 ; c=c+2)
  {
    u8g.drawLine(0,c,128,c); 
  }
}  

void u8g_Tela3() //Tela 3 - Arduino e Cia - Retangulo preenchido  
{
  u8g.setFont(u8g_font_unifont);  
  u8g.drawBox(0,0,128,64);  
  u8g.drawBox(2,2,124,60);   
  u8g.setColorIndex(0);  
  u8g.drawStr( 11, 35, "Arduino e Cia");  
  u8g.drawStr( 12, 35, "Arduino e Cia");  
  u8g.drawFrame(2,2,124,60);  
}   
   
void draw() //Rotina Desenho  
{
  u8g_prepare();  
  switch(display) //Carrega a tela correspondente  
  {
   case 1:  
    u8g_Tela1();  
    break;  
   case 2:  
    u8g_Tela2();  
    break;  
   case 3:  
    u8g_Tela3();  
    break;  
  }  
}  
   
void setup() 
{  
  // assign default color value  
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )   
   u8g.setColorIndex(255);   // white  
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )  
   u8g.setColorIndex(1);     // max intensity  
  else if ( u8g.getMode() == U8G_MODE_BW )  
   u8g.setColorIndex(1);     // pixel on  
}  
   
void loop() 
{  
  //Loop carregamento telas
  for (display =1; display < 4; display++) //Carrega as telas de 1 a 7  
  {  
    u8g.firstPage();   
    do 
    {  
    draw();  
    } 
    while( u8g.nextPage() );  
    delay(3000);  //Pausa de 3 segundos e reinicia o processo  
  }  
}     

Com relação à performance, não notei grande diferença, talvez até pelo programa, que não exige muito do display. Em todo caso, acredito que uma ligação desse tipo de display em modo paralelo só vale a pena caso o seu projeto realmente necessite desse tipo de configuração.

4.9/5 - (7 votes)