Since the DUE works on 3.3 volts has anyone successfully modified a 5V 16x2 LCD shield to work with Arduino DUE? I'm thinking 3.3V will be seen as a logic "1" by the 5V LCD shield and there are no 5V outputs that feed back to the 3.3V due if the R/~W line on the LCD is simply grounded.
Would love to hear anyone's opinion on this.
Thanks, Charlie
-
Is the R/W line broken out, or always connected to ground? During startup the pins are floating, which the lcd might interpret as a HIGH, outputting 5V to the data pins. You could add an external pull-down resistor to that pin, just to be safe. Other than that, you are totally correct. No problem.Gerben– Gerben04/07/2015 18:54:04Commented Apr 7, 2015 at 18:54
1 Answer 1
I understand this is an 8yo thread, however my answer might still help someone. I connected an unmodified no-brand LCD Shield to an Arduino DUE and it works perfectly - the only thing I had to change was the analog thresholds to identify the buttons. Just upload the sketch and read out the real values on the display then enter the averages between adjacent buttons in read_LCD_buttons function.
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>
/*******************************************************
This program will test the LCD panel and the buttons
Mark Bramwell, July 2010
********************************************************/
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
if (adc_key_in < 90) return btnRIGHT;
if (adc_key_in < 297) return btnUP;
if (adc_key_in < 533) return btnDOWN;
if (adc_key_in < 814) return btnLEFT;
if (adc_key_in < 1000) return btnSELECT;
return btnNONE; // when all others fail, return this...
}
int button_count=1;
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
int i;
void setup()
{
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print("Push the buttons"); // print a simple message
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
void loop()
{
delay(100);
lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
lcd.print(" ");
lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
lcd.print(analogRead(0)); // display A0 analog input to calibrate values
lcd.setCursor(0,1); // move to the begining of the second line
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
lcd.print("RIGHT ");
button_count = 2;
break;
case btnLEFT:
lcd.print("LEFT ");
button_count = 3;
break;
case btnUP:
lcd.print("UP ");
button_count = 4;
break;
case btnDOWN:
lcd.print("DOWN ");
button_count = 5;
break;
case btnSELECT:
lcd.print("SELECT");
button_count = 6;
break;
case btnNONE:
lcd.print("NONE ");
button_count = 1;
break;
}
}