Display gráfico LCD 128×64 ST7920 em modo 8 bits (paralelo)
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).
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).
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.
Qual a diferença de ligar esse display em modo serial e em modo paralelo?
Desculpe pela pergunta, mas sou iniciante.
Obrigado
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 !
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 ….
Boa tarde,
Essa é uma boa sugestão de post… 🙂
Que tipo de dados você está pensando em plotar ?
Abraço!
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
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.
Podia colocar o desenho esquemático!! do modo que está não estou conseguindo enxergar os nomes dos pinos no LCD!!
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!!
Olá ..como faço para desenhar uma imagem ja convertida em bitmap 128×64 para o display ?
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 [email protected]
VC TERIA UM TUTORIAL LIGANDO ESSE LCD COM UMA PLACA UNO R3?
Bom dia,
Esse tutorial já utiliza uma placa Uno.
Abraço!
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!
Boa noite,
Não tenho nenhum tutorial sobre isso, mas é uma boa sugestão de post. Vou verificar se é possível.
Abraço!
thank you perfect work it
Hey!
Glad to help you! 🙂
Best regards!
Adilson
Amigo, vc já utilizou LCD LG 192×64?
Boa noite,
Ainda não. 🙂
Abraço!
good times a lot of nice work.
I am a beginner and my work is useful to me.
the file U8GLIB I need to save it to arduino editor?.
which way is done can you explain to me.
you can give me a link.
thank you.
Oi!!!
tenho um display WG12864A-YYH-V#N e os pinos 14 e 15 são diferentes. Não consegui achar um exemplo e respectiva library!!!
Sabe se consigo usar esse exemplo?
Boa noite,
Eu precisaria ver esse modelo, se é compatível… vc sabe qual o chip controlador? Tem um link de onde vc comprou?
Abraço!
Adilson
Hello
I will just start on a logo, after a delay, come on my program,
i am using u8glib and st7920, could you explain to me how to please.
email:[email protected]