Graphic LCD4884 Shield For Arduino

From LinkSprite Playgound
Jump to: navigation, search

Description

1-131.jpg

1-132.jpg

This LCD4884 Shield provides 48x48 display. If your project need more information to display, this LCD shield can apparently meet your needs. It is able to display English, Chines, even images. It also integrates a 5 DOF joystick. The shield has 6 Digital IO and 5 Analog IO.

Note:The Arduino in the image is NOT included.

Specification

  • Power Supply: 5V
  • SPI Interface (using Arduino Digital Pin 2,3,4,5,6)
  • One Reset button
  • One 5 degree joystick (using Arduino Analog Pin 0)
  • Backlit control (Arduino DIO Pin 7)


PinOut

1-133.png

Sample Code

 /*
 Modified by Amy
 version 0.4 
 Description:
 Update the library and sketch to compatible with IDE V1.0 and earlier
 Improve the key detection function to be compatible with the Arduino Leonardo
 Improve the waitOK function
 Move the bit map array to the main code

 Any suggestions are welcome.
 E-mail: Lauran.pan@gmail.com
 Editor     : Amy from DFRobot
 Date       : 20.12.2012 
 */

 #include "LCD4884.h" 
 /*------------------------------------------------------------------------------
 ; DFrobot bitmap - size 48x24 pixels, black/white image
 ------------------------------------------------------------------------------*/
 unsigned char DFrobot_bmp[]= 
 {
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x01,0x39,0x39,0x39,0x39,0x39,0x39,
 0x01,0x01,0xFF,0xFF,0x01,0x01,0xC9,0xC9,0xC9,0xC9,0xC9,0xC9,0xFF,0xFF,0xFF,0xFF,
 0xFF,0x19,0x19,0x19,0x19,0xFF,0xE6,0x00,0x7C,0xFE,0xFF,0xFF,0x83,0x01,0x01,0x01,
 0x83,0xC6,0x7C,0x00,0x00,0xFF,0xFF,0xFF,0x19,0x19,0x19,0x99,0xFF,0xFE,0x00,0x38,
 0xFE,0xFF,0xFF,0xC3,0x81,0x01,0x01,0x83,0x87,0xFE,0x3C,0x00,0x01,0x01,0xFF,0xFF,
 0xFF,0xFF,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x02,
 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,
 0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,
 0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,
 0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00
 };
 /******************************************************************************/ 
 /*------------------------------------------------------------------------------
 ; DFrobot chinese - size 12x12  
 ------------------------------------------------------------------------------*/
 unsigned char DFrobot_chinese[]=
 {
 0x84,0x64,0xFF,0x24,0x44,0xFE,0x02,0x02,0xFF,0x02,0x00,0x00,0x01,0x00,0x07,0x04,
 0x02,0x01,0x00,0x00,0x07,0x04,0x07,0x00,
  
 0xA0,0xAF,0xA9,0xE9,0xAF,0x30,0xAF,0xA9,0xF9,0xAF,0xA0,0x00,0x00,0x07,0x04,0x04,
 0x07,0x00,0x07,0x04,0x04,0x07,0x00,0x00,
  
 0x00,0x00,0x00,0x80,0x60,0x1F,0x60,0x80,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,
 0x00,0x00,0x00,0x01,0x02,0x04,0x04,0x00,
  
 0x22,0x12,0x0A,0xBF,0x6A,0x52,0x4A,0x7F,0xCA,0x12,0x22,0x00,0x04,0x05,0x05,0x04,
 0x05,0x02,0x02,0x01,0x00,0x00,0x00,0x00,
  
 0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x03,0x02,0x00,0x00,0x04,0x04,0x04,0x04,
 0x04,0x07,0x04,0x04,0x04,0x04,0x04,0x00,
  
 0x00,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x06,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 };
 /******************************************************************************/ 
 //keypad debounce parameter
 #define DEBOUNCE_MAX 15
 #define DEBOUNCE_ON  10
 #define DEBOUNCE_OFF 3  
 #define NUM_KEYS 5 
 #define NUM_MENU_ITEM   4 
 // joystick number
 #define LEFT_KEY 0
 #define CENTER_KEY 1
 #define DOWN_KEY 2
 #define RIGHT_KEY 3
 #define UP_KEY 4 
 // menu starting points 
 #define MENU_X  10      // 0-83
 #define MENU_Y  1       // 0-5
 int  adc_key_val[5] ={
 50, 200, 400, 600, 800 }; 
 // debounce counters
 byte button_count[NUM_KEYS];
 // button status - pressed/released
 byte button_status[NUM_KEYS];
 // button on flags for user program 
 byte button_flag[NUM_KEYS];
 // menu definition
 char menu_items[NUM_MENU_ITEM][12]={
 "TEMPERATURE",
 "CHAR MAP",
 "BITMAP",
 "ABOUT"  
 };= 
 void (*menu_funcs[NUM_MENU_ITEM])(void) = {
 temperature,
 charmap,
 bitmap,
 about
 }; 
 char current_menu_item; 
 void setup()
 { 
 // reset button arrays
 for(byte i=0; i<NUM_KEYS; i++){
   button_count[i]=0;
   button_status[i]=0;
   button_flag[i]=0;
 }

 lcd.LCD_init();
 lcd.LCD_clear();

 //menu initialization
 init_MENU();
 current_menu_item = 0;    

 lcd.backlight(ON);//Turn on the backlight
 //lcd.backlight(OFF); // Turn off the backlight  
} 
unsigned long buttonFlasher = 0; 
 /* loop */ 
void loop()

{

 byte i;
 for(i=0; i<NUM_KEYS; i++){
   if(button_flag[i] !=0){

     button_flag[i]=0;  // reset button flag
     switch(i){

     case UP_KEY:
       // current item to normal display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
       current_menu_item -=1;
       if(current_menu_item <0)  current_menu_item = NUM_MENU_ITEM -1;
       // next item to highlight display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
       break;
     case DOWN_KEY:
       // current item to normal display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
       current_menu_item +=1;
       if(current_menu_item >(NUM_MENU_ITEM-1))  current_menu_item = 0;
       // next item to highlight display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
       break;
     case LEFT_KEY:
       init_MENU();
       current_menu_item = 0;
       break;   
     case CENTER_KEY:
       lcd.LCD_clear();
       (*menu_funcs[current_menu_item])();
       //(*menu_funcs[0])();        
       Serial.println("hello");
       lcd.LCD_clear();
       init_MENU();
       current_menu_item = 0;         
       break;  
     }

   }
 }
 if(millis() - buttonFlasher > 5){
   update_adc_key();
   buttonFlasher = millis();
  }    
 } 
 /* menu functions */ 
 void init_MENU(void){

 byte i;

 lcd.LCD_clear();

 lcd.LCD_write_string(MENU_X, MENU_Y, menu_items[0], MENU_HIGHLIGHT );

 for (i=1; i<NUM_MENU_ITEM; i++){
   lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_NORMAL);
 } 
} 
 // waiting for center key press
 void waitfor_OKkey(){
 byte i;
 byte key = 0xFE;
 for(byte i=0; i<NUM_KEYS; i++){
   button_count[i]=0;
   button_status[i]=0;
   button_flag[i]=0;
 }
 update_adc_key();
 while (key!= CENTER_KEY){
   for(i=0; i<NUM_KEYS; i++){
     if(button_flag[i] !=0){
       button_flag[i]=0;  // reset button flag
       if(i== CENTER_KEY) 
       {
         key=CENTER_KEY; 
       }
     }
     update_adc_key();
   }
 }
 } 
 void temperature()
{
  lcd.LCD_write_string_big(10, 1, "+12.30", MENU_NORMAL);
 lcd.LCD_write_string(78, 2, "C", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
} 
 void charmap(){
 char i,j;
 for(i=0; i<5; i++){
   for(j=0; j<14; j++){
     lcd.LCD_set_XY(j*6,i);
     lcd.LCD_write_char(i*14+j+32, MENU_NORMAL);
   }
 }


 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();   
} 
 void bitmap(){
 lcd.LCD_draw_bmp_pixel(0,0, DFrobot_bmp, 84,24);
 lcd.LCD_write_chinese(6,3, DFrobot_chinese,12,6,0,0);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
 } 
 void about(){
 lcd.LCD_write_string( 0, 1, "LCD4884 Shield", MENU_NORMAL);
 lcd.LCD_write_string( 0, 3, "www.DFrobot.cn", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey(); 
 } 
 // which includes DEBOUNCE ON/OFF mechanism, and continuous pressing detection
 // Convert ADC value to key number 
 char get_key(unsigned int input)

{

 char k;

 for (k = 0; k < NUM_KEYS; k++)
 {
   if (input < adc_key_val[k])
   {

     return k;
   }
 }

 if (k >= NUM_KEYS)
   k = -1;     // No valid key pressed

 return k;
 }

 void update_adc_key(){
 int adc_key_in;
 char key_in;
 byte i;

 adc_key_in = analogRead(0);
 key_in = get_key(adc_key_in);
 for(i=0; i<NUM_KEYS; i++)
 {
   if(key_in==i)  //one key is pressed 
   { 
     if(button_count[i]<DEBOUNCE_MAX)
     {
       button_count[i]++;
       if(button_count[i]>DEBOUNCE_ON)
       {
         if(button_status[i] == 0)
         {
           button_flag[i] = 1;
           button_status[i] = 1; //button debounced to 'pressed' status
         }

       }
     }

   }
   else // no button pressed
   {
     if (button_count[i] >0)
     {  
       button_flag[i] = 0; 
       button_count[i]--;
       if(button_count[i]<DEBOUNCE_OFF){
         button_status[i]=0;   //button debounced to 'released' status
       }
     }
   }
 }
 }

The sketch for displaying a variable value on the screen

 /*
Modified by Lauren
version 0.1
Any suggestions are welcome.
E-mail: Lauran.pan@gmail.com
Editor     : Lauren from DFRobot
Date       : 26.03.2012
* This is a sample sketch for displaying a variable value on the LCD4884
* This library and sample is compatible with the IDE V1.0 and earlier  
Connection  
Directly stack the LCD4884 shield on your Arduino board
 */
 #include "LCD4884.h" 
 #define MENU_X  10      // 0-83
 #define MENU_Y  1       // 0-5 
 int counter = 0;
 char string[10]; 
 void setup()
 {
 lcd.LCD_init();
 lcd.LCD_clear();

 //menu initialization
 init_MENU();
 }

 void init_MENU(void){

 byte i;
 lcd.LCD_clear();
 lcd.LCD_write_string(MENU_X, MENU_Y, "test screen", MENU_HIGHLIGHT );
 }
 void loop(){

 if(++counter < 1000){
   itoa(counter,string,10);
   lcd.LCD_write_string(MENU_X, MENU_Y + 1, string, MENU_NORMAL);
 }
 else  counter = 0,init_MENU();
 delay(10); 
 }
 Multi DS18B20 sensors display example
 /*
 Description: multiple DS18B20 sensors reading display sample
 Author: Amy
 Thanks for your sharing your LCD4884 application
 */ 
 #include <OneWire.h>                 //one wire sensor protocol library (V2.0) from http://www.pjrc.com/teensy/td_libs_OneWire.html 
 #include <DallasTemperature.h>       //dallas one wire temperature library (V3.6.0) from http://milesburton.com/index.php/Dallas_Temperature_Control_Library 
 #include <LCD4884.h>
 //-----menu starting points--------------------------------------------------------------
 #define MENU_X 10  // Horizontal position range available is 0-83 in pixels
 #define MENU_Y 1  // Vertical Lines - range available is 0-5 in lines of text
 //-----Menu Variables--------------------------------------------------------------
 int analogstatus;  //Normal/center-1000-1200, Up->700-800, Down-300-400, Left-<100, Right-500-600
 int page;  // value that determines what is displayed
 int maxpage;
 char buttonreadstring[10];
 char pagestring[10];
 //-----Temperature Variables--------------------------------------------------------------
 int temperature_sensor_bus=9;                 //hardwired DS18B20 bus 
 OneWire oneWire(temperature_sensor_bus);      //setup one wire and Dallas temperature sensor library 
 DallasTemperature sensors(&oneWire);
 float temp0;                                   //add more for additional sensors
 float temp1;
 char tempstring0[10];
 char tempstring1[10];
 int TEMPERATURE_PRECISION=9;                  //9 bit percision
 int numberOfDevices;                          // Number of temperature devices found
 DeviceAddress tempDeviceAddress;              // Temporarily store discovered device addresses
 //Setup********************************************************************************************************************************************** 
 void setup(){
 Serial.begin(9600);
 //--------------------Setup one-wire sensors ----------------------------------------
 sensors.begin(); // Start up the OneWire library
 delay(100);
 numberOfDevices = sensors.getDeviceCount();  // Get a count of sensors on the bus
 for(int xyz=0;xyz<numberOfDevices; xyz++)  // Loop through each device, print out address
 {
   if(sensors.getAddress(tempDeviceAddress, xyz))    // Search the wire for address
   {
     Serial.print("Found Sensor ");
     Serial.print(xyz, DEC);
     Serial.print(" with address: ");
     printAddress(tempDeviceAddress);
     Serial.println();
     Serial.print("Setting resolution to ");
     Serial.println(TEMPERATURE_PRECISION,DEC);
     delay(100);
     sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);  // set the sensor resolution
   }
 }
 sensors.requestTemperatures();            //issue global request for each temp sensor on network to return a temp
 if(sensors.getAddress(tempDeviceAddress, 0))temp0=(sensors.getTempC(tempDeviceAddress));
 if(sensors.getAddress(tempDeviceAddress, 1))temp1=(sensors.getTempC(tempDeviceAddress));
 //----Initialize, clear and backlight LCD SCREEN---------------------------------  
 lcd.LCD_init();
 lcd.LCD_clear();
 lcd.backlight(ON);//Turn on the backlight
 maxpage = 5;  //  Maximum number of pages to scroll through
 } //Setup End**********************************************************************************************************************************************
 void loop(){   //****Begin Loop*************************************************************************************************************************
 //-----Button Loop---------------------------------------------------------------- 
 analogstatus = analogRead(0);  //Read Analog Pin 0
 //int analogstatus;  //Normal-1000-1200, Up->700-800, Down-300-400, Left-0, Right-500-600, Center-100-200
 // if (analogstatus > 1000 && analogstatus < 1200){Page = 0;}  //Use if when buttons are left alone, it should return to page 0
 while (analogstatus > 500 && analogstatus < 600){
   if (page == maxpage - 1){
     page = 0; 
     break;
   }
   else {
     page = page++; 
     break;
   }
 }
 while (analogstatus < 100){
   if (page == 0){
     page = maxpage-1; 
     break;
   }
   else {
     page = page--; 
     break;
   }
 }  
 itoa(page,pagestring,10);
 itoa(analogstatus,buttonreadstring,10);
 //-----Button Loop END----------------------------------------------------------------   
 //WIP***************************************************************    
 //WIP***************************************************************  
 //WIP***************************************************************  
 //WIP***************************************************************    
 //WIP***************************************************************  
 //WIP*************************************************************** 
 //--------------Read temperatuere sensors---------------------------------------------- 
 sensors.requestTemperatures();            //issue global request for each temp sensor on network to return a temp
 if(sensors.getAddress(tempDeviceAddress, 0))temp0=(sensors.getTempF(tempDeviceAddress));
 if(sensors.getAddress(tempDeviceAddress, 1))temp1=(sensors.getTempF(tempDeviceAddress));
 //--------------Page Definitions---------------------------------------------- 
 itoa(temp0,tempstring0,10);
 itoa(temp1,tempstring1,10);
 if (page ==0){ 
   lcd.LCD_clear();
   lcd.LCD_write_string(5, 0, "Page 1" , MENU_HIGHLIGHT); 
   lcd.LCD_write_string(5, 1, "Temp 1: " , MENU_NORMAL);
   lcd.LCD_write_string(50, 1, tempstring0, MENU_NORMAL);
   lcd.LCD_write_string(70, 1, "F" , MENU_NORMAL); 
   lcd.LCD_write_string(5, 2, "Temp 2: " , MENU_NORMAL);
   lcd.LCD_write_string(50, 2, tempstring1, MENU_NORMAL);
   lcd.LCD_write_string(70, 2, "F" , MENU_NORMAL);  
 }
 if (page ==1){
   lcd.LCD_clear();
   lcd.LCD_write_string(5, 0, "Page 2" , MENU_HIGHLIGHT); 
   lcd.LCD_write_string(5, 1, "Temp 1: " , MENU_NORMAL);
   lcd.LCD_write_string(50, 1, tempstring0, MENU_NORMAL);
   lcd.LCD_write_string(70, 1, "F" , MENU_NORMAL); 
 }
 if (page ==2){
   lcd.LCD_clear();
   lcd.LCD_write_string(5, 0, "Page 3" , MENU_HIGHLIGHT); 
   lcd.LCD_write_string(5, 1, "Temp 2: " , MENU_NORMAL);
   lcd.LCD_write_string(50, 1, tempstring1, MENU_NORMAL);
   lcd.LCD_write_string(70, 1, "F" , MENU_NORMAL); 
 }
 if (page ==3){
   lcd.LCD_clear();
   lcd.LCD_write_string(5, 0, "Page 4" , MENU_HIGHLIGHT); 
 }
 if (page ==4){
   lcd.LCD_clear();
   lcd.LCD_write_string(5, 0, "Page 5" , MENU_HIGHLIGHT); 
 }
 //-----------Displayed on every page---------------------------------
 lcd.LCD_write_string(0, 4, buttonreadstring, MENU_NORMAL);
 lcd.LCD_write_string(0, 5, pagestring , MENU_NORMAL);
 //WIP***************************************************************    
 //WIP***************************************************************  
 //WIP***************************************************************  
 //WIP***************************************************************    
 //WIP***************************************************************  
 //WIP***************************************************************  
 }//Loop End********************************************************************************************************************************************************  
 // FUNCTIONS********************************************************************************************************************************************************   
 // function to print a devices address
 void printAddress(DeviceAddress deviceAddress)
 {
 for (uint8_t xyz = 0; xyz < 8; xyz++)
 {
   if (deviceAddress[xyz] < 16) Serial.print("0");
   Serial.print(deviceAddress[xyz], HEX);
 }
 }


Related project

Schematics