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.