15 maio 2015

Display gráfico LCD 128x64 ST7920 em modo 8 bits (paralelo)

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

Display Gráfico LCD 128x64 ST7920 8 bits

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

Ligando display LCD 128x64 ao 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


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.

 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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//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.

14 comentários:

  1. Qual a diferença de ligar esse display em modo serial e em modo paralelo?
    Desculpe pela pergunta, mas sou iniciante.
    Obrigado

    ResponderExcluir
    Respostas
    1. Boa noite Carlos,

      Ligando em modo paralelo, você se comunica com o display utilizando 8 fios (8 bits), o que faz com que o microcontrolador e o display se comuniquem mais rapidamente do que no modo serial.

      Abraço !

      Excluir
  2. Amigo como poderia plotar gráfico com este LCD ? digo recebendo 128 valores de analogica e plotando isso ....poderia me ajudar ?...não conheço linguagem "c" a fundo ....

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Essa é uma boa sugestão de post... :-)

      Que tipo de dados você está pensando em plotar ?

      Abraço!

      Excluir
  3. Bom dia
    parabéns pelo artigo muito interessante e útil
    Eu tenho a necessidade de usar um monitor LCD com 12.864 controladores de st 7920.
    Para o tipo de projeto que eu preciso para usar o modo paralelo.
    Eu gostaria de pedir a configuração de pinos de conexão entre Arduino mega e exibição
    Com arduino tudo funciona bem, mas com Arduino mega não pode ver nada.
    Para usar o funzionamentoo U8GLIB biblioteca
    Obrigada pelo Conselho
    Gianni Gallo

    ResponderExcluir
    Respostas
    1. bom dia, esse programa funciona sim no arduino mega. pois estou utilizando o mesmo nele. da uma listra branca e depois de um tempo mostra o programa normal.

      Excluir
  4. Podia colocar o desenho esquemático!! do modo que está não estou conseguindo enxergar os nomes dos pinos no LCD!!

    ResponderExcluir
    Respostas
    1. tenho no proteus com KS0108 AMPIRE128X64 e LGM12641BS1R tu nao esquema de ligacao, biblioteca, codigo de exemplo, etc eu liguei como vi em outro site, usei todas as bibliotecas existentes e nenhuma exibiu dado nenhum no LCD!!

      Excluir
  5. Olá ..como faço para desenhar uma imagem ja convertida em bitmap 128x64 para o display ?

    ResponderExcluir
  6. alguem poderia me ajudar quero um programa para q o arduino funcione como timer da seguinte forma !

    canal 1 = ligar as xx:xx e desligar as xx:xx
    canal 2 = ligar as xx:xx e desligar as xx:xx

    quem poder me ajudar enviar email para janio.s@hotmail.com

    ResponderExcluir
  7. VC TERIA UM TUTORIAL LIGANDO ESSE LCD COM UMA PLACA UNO R3?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Esse tutorial já utiliza uma placa Uno.

      Abraço!

      Excluir
  8. Bom dia! Existe algum tutorial explicando como usar o display lcd sem usar switch/case? Alguma forma de fazer o desenho diretamente no void loop? Abraços!

    ResponderExcluir
    Respostas
    1. Boa noite,

      Não tenho nenhum tutorial sobre isso, mas é uma boa sugestão de post. Vou verificar se é possível.

      Abraço!

      Excluir