132 lines
6.1 KiB
C++
Executable File
132 lines
6.1 KiB
C++
Executable File
/*
|
|
7-17-2011
|
|
Spark Fun Electronics 2011
|
|
Nathan Seidle
|
|
|
|
This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).
|
|
|
|
This code writes a series of images and text to the Nokia 5110 84x48 graphic LCD:
|
|
http://www.sparkfun.com/products/10168
|
|
|
|
Do not drive the backlight with 5V. It will smoke. However, the backlight on the LCD seems to be
|
|
happy with direct drive from the 3.3V regulator.
|
|
|
|
Although the PCD8544 controller datasheet recommends 3.3V, the graphic Nokia 5110 LCD can run at 3.3V or 5V.
|
|
No resistors needed on the signal lines.
|
|
|
|
You will need 5 signal lines to connect to the LCD, 3.3 or 5V for power, 3.3V for LED backlight, and 1 for ground.
|
|
*/
|
|
|
|
#define PIN_SCE 7 //Pin 3 on LCD
|
|
#define PIN_RESET 6 //Pin 4 on LCD
|
|
#define PIN_DC 5 //Pin 5 on LCD
|
|
#define PIN_SDIN 4 //Pin 6 on LCD
|
|
#define PIN_SCLK 3 //Pin 7 on LCD
|
|
|
|
//The DC pin tells the LCD if we are sending a command or data
|
|
#define LCD_COMMAND 0
|
|
#define LCD_DATA 1
|
|
|
|
//You may find a different size screen, but this one is 84 by 48 pixels
|
|
#define LCD_X 84
|
|
#define LCD_Y 48
|
|
|
|
//This is awesome in bitmap form
|
|
char awesome[] = {
|
|
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, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x1C,
|
|
0x0C, 0x0C, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
|
|
0x07, 0x07, 0x0E, 0x06, 0x1C, 0x1C, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0x80, 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, 0xE0, 0xF0, 0x3C, 0xCE, 0x67, 0x33, 0x18, 0x08,
|
|
0x08, 0xC8, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
|
0x70, 0x38, 0x18, 0x18, 0x08, 0x08, 0x08, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x01, 0x07,
|
|
0x0F, 0x3C, 0xF8, 0xE0, 0x80, 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, 0xFC, 0xFF, 0x0F, 0x00, 0x0C, 0x7F,
|
|
0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x63,
|
|
0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 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, 0x3F, 0xFF,
|
|
0xF0, 0x00, 0x00, 0x00, 0x08, 0x08, 0xFC, 0x8C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
|
|
0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
|
|
0x0C, 0x0C, 0x0C, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 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, 0x07, 0x0F, 0x3C, 0x70, 0xE0, 0x80, 0x00, 0x07, 0x0C, 0x38, 0x60, 0xC0,
|
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0,
|
|
0xF0, 0xE0, 0xC0, 0x80, 0xC0, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x3C, 0x1F, 0x07,
|
|
0x01, 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, 0x01, 0x03, 0x06,
|
|
0x0E, 0x1C, 0x18, 0x38, 0x31, 0x73, 0x62, 0x66, 0x64, 0xC7, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
|
|
0xC7, 0xC7, 0xC7, 0x67, 0x63, 0x63, 0x71, 0x30, 0x38, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x01,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
void setup(void) {
|
|
LCDInit(); //Init the LCD
|
|
LCDClear();
|
|
LCDBitmap(awesome);
|
|
}
|
|
|
|
void gotoXY(int x, int y) {
|
|
LCDWrite(0, 0x80 | x); // Column.
|
|
LCDWrite(0, 0x40 | y); // Row. ?
|
|
}
|
|
|
|
//This takes a large array of bits and sends them to the LCD
|
|
void LCDBitmap(char my_array[]){
|
|
for (int index = 0 ; index < (LCD_X * LCD_Y / 8 ) ; index++)
|
|
LCDWrite(LCD_DATA, my_array[index]);
|
|
}
|
|
|
|
//Clears the LCD by writing zeros to the entire screen
|
|
void LCDClear(void) {
|
|
for (int index = 0 ; index < (LCD_X * LCD_Y / 8 ) ; index++)
|
|
LCDWrite(LCD_DATA, 0x00);
|
|
|
|
gotoXY(0, 0); //After we clear the display, return to the home position
|
|
}
|
|
|
|
//This sends the magical commands to the PCD8544
|
|
void LCDInit(void) {
|
|
|
|
//Configure control pins
|
|
pinMode(PIN_SCE, OUTPUT);
|
|
pinMode(PIN_RESET, OUTPUT);
|
|
pinMode(PIN_DC, OUTPUT);
|
|
pinMode(PIN_SDIN, OUTPUT);
|
|
pinMode(PIN_SCLK, OUTPUT);
|
|
|
|
//Reset the LCD to a known state
|
|
digitalWrite(PIN_RESET, LOW);
|
|
digitalWrite(PIN_RESET, HIGH);
|
|
|
|
LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
|
|
LCDWrite(LCD_COMMAND, 0xBF); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
|
|
LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
|
|
LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14
|
|
|
|
LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
|
|
LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse
|
|
}
|
|
|
|
//There are two memory banks in the LCD, data/RAM and commands. This
|
|
//function sets the DC pin high or low depending, and then sends
|
|
//the data byte
|
|
void LCDWrite(byte data_or_command, byte data) {
|
|
digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command
|
|
|
|
//Send the data
|
|
digitalWrite(PIN_SCE, LOW);
|
|
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
|
|
digitalWrite(PIN_SCE, HIGH);
|
|
}
|
|
|
|
void loop() {
|
|
}
|