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
    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.print("Push the buttons"); // print a simple message

// initialize the digital pin as an output.
pinMode(led, OUTPUT);


void loop()
  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;

    case btnLEFT:
        lcd.print("LEFT ");
        button_count = 3;

    case btnUP:
        lcd.print("UP ");
        button_count = 4;

    case btnDOWN:
        lcd.print("DOWN ");
        button_count = 5;

    case btnSELECT:
        button_count = 6;

    case btnNONE:
        lcd.print("NONE ");
        button_count = 1;


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.