3 Wires LCD HEF4094B
Este esquema é totalmente baseado no da página http://www.arduino.cc/playground/Code/LCD3wires e bastante simples, desta forma 'poupamos' muitos pinos do Arduino, pois com apenas 3 pinos podemos controlar um LCD de 1 ou 2 linhas.
Utilizando o Shift Register HEF4094B temos o seguinte esquema:
A library está disponível em http://arduino.cc/playground/uploads/Code/LCD3WireLibrary.zip e podemos usar o exemplo que vem com a mesma:
// Example use of LCD3Wire library
// Almost a carbon-copy of LCD4BitExample.pde
#include <LCD3Wire.h>
// Arduino pins
#define LCD_LINES 2 // number of lines in your display
#define DOUT_PIN 11 // Dout pin
#define STR_PIN 12 // Strobe pin
#define CLK_PIN 10 // Clock pin
#define LED_PIN 13 // we'll use the debug LED to output a heartbeat
//create object to control an LCD.
LCD3Wire lcd = LCD3Wire(LCD_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
//some messages to display on the LCD
char msgs[6][15] = {"apple", "banana", "pineapple", "mango", "watermelon", "pear"};
int NUM_MSGS = 6;
void setup() {
lcd.init();
//optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
//lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!)
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH); //light the debug LED
//pick a random message from the array
int pick = random(NUM_MSGS);
char* msg = msgs[pick];
lcd.clear();
lcd.printIn(msg);
delay(1000);
digitalWrite(LED_PIN, LOW);
//print some dots individually
for (int i=0; i<3; i++){
lcd.print('.');
delay(100);
}
//print something on the display's second line.
if(LCD_LINES>1){
lcd.cursorTo(2, 0); //line=2, x=0.
lcd.printIn("Score: 6/7");
delay(1000);
}
//scroll entire display 20 chars to left, delaying 50ms each inc
lcd.leftScroll(20, 50);
}
Resultado:
Para termos suporte a LCDs 20x4:
Com a ajuda do fórum do Arduino (na página http://arduino.cc/forum/index.php/topic,10539.0.html), podemos facilmente adaptar a library para usarmos um LCD 20x4.
Basta alterar o método "cursorTo" na library para:
void LCD3Wire::cursorTo(int line_num, int x){
//first, put cursor home
commandWrite(CMD_HOME);
//if we are on a 1-line display, set line_num to 1st line, regardless of given
if (lcd_lines==1){
line_num = 1;
}
//offset 40 chars in if second line requested
if (line_num == 2){
x += 40;
}
// add the following code for 4 line display
if (line_num == 3) { // In fact, line 3 is an extension of the line 1 (beyond the 20 first characters)
x += 20;
}
if (line_num == 4) { // Line 4 is an extension of line 2
x += 60;
}
//advance the cursor to the right according to position. (second line starts at position 40).
for (int i=0; i<x; i++) {
commandWrite(0x14);
}
}
No exemplo podemos adaptar da seguinte forma:
// Example use of LCD3Wire library
// Almost a carbon-copy of LCD4BitExample.pde
#include <LCD3Wire.h>
// Arduino pins
#define LCD_LINES 4 // number of lines in your display
#define DOUT_PIN 11 // Dout pin
#define STR_PIN 12 // Strobe pin
#define CLK_PIN 10 // Clock pin
#define LED_PIN 13 // we'll use the debug LED to output a heartbeat
//create object to control an LCD.
LCD3Wire lcd = LCD3Wire(LCD_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
//some messages to display on the LCD
char msgs[6][15] = {"Arduino", "LCD 20X4", "Testing", "GrcByte", "Almamater", "LCD Test"};
int NUM_MSGS = 6;
void setup() {
lcd.init();
//optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
//lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!)
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH); //light the debug LED
//pick a random message from the array
int pick = random(NUM_MSGS);
char* msg = msgs[pick];
lcd.clear();
lcd.printIn(msg);
delay(1000);
digitalWrite(LED_PIN, LOW);
//print some dots individually
for (int i=0; i<3; i++){
lcd.print('.');
delay(100);
}
//print something on the display's second line.
if(LCD_LINES==1){
lcd.cursorTo(1, 0); //line=2, x=0.
lcd.printIn("Score: 6/7");
delay(1000);
}
if(LCD_LINES==2){
lcd.cursorTo(2, 0); //line=2, x=0.
lcd.printIn("Score: 6/7");
delay(1000);
}
if(LCD_LINES==3){
lcd.cursorTo(3, 0); //line=2, x=0.
lcd.printIn("Score: 6/7");
delay(1000);
}
if(LCD_LINES==4){
lcd.cursorTo(2, 0); //line=2, x=0.
lcd.printIn("Linha 2");
delay(2000);
lcd.cursorTo(3, 0); //line=3, x=0.
lcd.printIn("Linha 3");
delay(2000);
lcd.cursorTo(4, 0); //line=4, x=0.
lcd.printIn("Linha 4 - Yeahhhh!!");
delay(2000);
}
//scroll entire display 20 chars to left, delaying 50ms each inc
lcd.leftScroll(20, 50);
}
Download: Library Modificada
Resultado: