DF Robot LCD keypad Arduino shield reference

September 19, 2014

Reference for a very cheap (3.99 € with free shipping) LCD keypad shield for Arduino bought from banggood (SKU: SKU083549).

Here goes the source code (adapted from this source, slightly improved with custom functions to switch light when pushing the Select button) :

//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 
 // my buttons when read are centered at these values: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 use this threshold
/* if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  
*/
 // For V1.0 comment the other threshold and use the one below:

 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;

 return btnNONE;  // when all others fail, return this...
}

#define LCDbacklight() pinMode(10, INPUT)    // turn on backlight
#define LCDnoBacklight() pinMode(10, OUTPUT) // turn off backlight

int lightUp     =  1;
int previousBtn = -1;

int switchLight()
{
 if(lightUp)
 {
  LCDnoBacklight();
 }
 else
 {
  LCDbacklight();
 }
 lightUp=(++lightUp)%2;
 return 0;
}

void setup()
{
 LCDbacklight();
 digitalWrite(10,LOW);          // when D10 is set to high it burns the arduino and shield, see http://forum.arduino.cc/index.php?topic=96747.msg725979#msg725979
 lcd.begin(16, 2);              // start the library
 lcd.setCursor(0,0);
 lcd.print("Push the buttons"); // print a simple message
}

void loop()
{
 lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 lcd.print(millis()/1000);      // display seconds elapsed since power-up

 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

 if(lcd_key == btnSELECT && previousBtn != btnSELECT)
 {
   switchLight();
 }
 previousBtn = lcd_key;

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
 }

}

And now animations! (with serial debugging example) WIP!

//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************

This program will show some animations on your LCD screen
Based on Mark Bramwell version, July 2010 http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_%28SKU:_DFR0009%29#Example_use_of_LiquidCrystal_library

********************************************************/

// 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
byte 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
byte read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.0 comment the other threshold and use the one below:
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
 return btnNONE;  // when all others fail, return this...
}

#define LCDbacklight() pinMode(10, INPUT)    // turn on backlight
#define LCDnoBacklight() pinMode(10, OUTPUT) // turn off backlight

boolean lightUp     =  true;
byte previousBtn = -1;
byte menu = 0;
byte menusNumber = 2;

void switchLight()
{
 if(lightUp)
 {
  LCDnoBacklight();
 }
 else
 {
  LCDbacklight();
 }
 lightUp=!lightUp;
 return;
}

byte X = 0;
byte Y = 0;
byte sizeX = 16;
byte sizeY = 2;

void chenillard()
{
   lcd.setCursor(X,Y);
   lcd.write(254); // clear char where cursor is
   if(Y == 0 && X <= sizeX)
   {
     X++;
   }
   if(X == sizeX && Y <= sizeY-1)
   {
     Y++;
   }

   if(X == 0 && Y > 0)
   {
     Y--;
   }
   else
   {
     if(Y == sizeY-1 && X >= 0)
     {
       X--;
     }
   }
   lcd.setCursor(X,Y);
   lcd.write(255); 
}

void randomStars()
{
  lcd.setCursor(X,Y);
  lcd.write(254);
  X=random(0, sizeX);
  Y=random(0, sizeY);
  lcd.setCursor(X,Y);
  lcd.write('*');
}

void setup()
{
 digitalWrite(10,LOW);          // when D10 is set to high it burns the arduino and shield, see http://forum.arduino.cc/index.php?topic=96747.msg725979#msg725979
 lcd.begin(sizeX, sizeY);              // start the library
 lcd.setCursor(0,0);
 lcd.print("Push up and down buttons"); // print a simple message
 delay(500);
 lcd.clear();

 randomSeed(analogRead(10));
 Serial.begin(9600);
}

void loop()
{
 lcd_key = read_LCD_buttons();  // read the buttons
 if(previousBtn != lcd_key)
 {

   //lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
   //lcd.print(millis()/1000);      // display seconds elapsed since power-up

   //lcd.setCursor(0,1);            // move to the begining of the second line

   switch (lcd_key)               // depending on which button was pushed, we perform an action
   {
     X=0;Y=0;
     case btnRIGHT:
       {
       //lcd.print("RIGHT ");
       break;
       }
     case btnLEFT:
       {
       //lcd.print("LEFT   ");
       break;
       }
     case btnUP:
       {
       lcd.clear();
       menu=(++menu)%menusNumber;
       break;
       }
     case btnDOWN:
       {
       lcd.clear();
       menu=(--menu)%menusNumber;
       break;
       }
     case btnSELECT:
       {
       switchLight();
       break;
       }
     case btnNONE:
       {
       break;
       }
   }
 }
 switch(menu)
 {
   case 0:
     {
     randomStars();
     break;
     }
   case 1:
     {
     chenillard();
     break;
     }
 }
 previousBtn = lcd_key;
 /*Serial.print('X=');*/Serial.println(X);
 /*Serial.print('Y=');*/Serial.println(Y);
 delay(200);
}