Library for interfacing to Nokia 5110 LCD display (as found on the SparkFun website).

Dependents:   LV7_LCDtest LV7_Grupa5_Tim003_Zadatak1 lv7_Grupa5_Tim008_zad1 LV7_PAI_Grupa5_tim10_Zadatak1 ... more

This library is designed to make it easy to interface an mbed with a Nokia 5110 LCD display.

These can be found at Sparkfun (https://www.sparkfun.com/products/10168) and Adafruit (http://www.adafruit.com/product/338).

The library uses the SPI peripheral on the mbed which means it is much faster sending data to the display than other libraries available on other platforms that use software SPI.

The library can print strings as well as controlling individual pixels, meaning that both text and primitive graphics can be displayed.

Committer:
eencae
Date:
Sun Jan 26 20:18:45 2014 +0000
Revision:
5:6ea180eef702
Parent:
3:f90dd1042d17
Child:
6:adb79338d40f
Updated docs.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 5:6ea180eef702 1 /**
eencae 5:6ea180eef702 2 @file N5110.cpp
eencae 5:6ea180eef702 3
eencae 5:6ea180eef702 4 @brief Member functions implementations
eencae 5:6ea180eef702 5
eencae 5:6ea180eef702 6 */
eencae 0:d563e74f0ae9 7 #include "mbed.h"
eencae 0:d563e74f0ae9 8 #include "N5110.h"
eencae 0:d563e74f0ae9 9
eencae 2:e93021cfb0a9 10
eencae 1:df68f34cd32d 11 N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
eencae 0:d563e74f0ae9 12 {
eencae 0:d563e74f0ae9 13
eencae 0:d563e74f0ae9 14 spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
eencae 0:d563e74f0ae9 15 initSPI();
eencae 0:d563e74f0ae9 16
eencae 0:d563e74f0ae9 17 led = new PwmOut(ledPin);
eencae 0:d563e74f0ae9 18 pwr = new DigitalOut(pwrPin);
eencae 0:d563e74f0ae9 19 sce = new DigitalOut(scePin);
eencae 0:d563e74f0ae9 20 rst = new DigitalOut(rstPin);
eencae 0:d563e74f0ae9 21 dc = new DigitalOut(dcPin);
eencae 0:d563e74f0ae9 22
eencae 0:d563e74f0ae9 23 }
eencae 0:d563e74f0ae9 24
eencae 2:e93021cfb0a9 25
eencae 0:d563e74f0ae9 26 void N5110::init()
eencae 0:d563e74f0ae9 27 {
eencae 0:d563e74f0ae9 28 turnOn(); // power up
eencae 1:df68f34cd32d 29 reset(); // reset LCD - must be done within 100 ms
eencae 0:d563e74f0ae9 30
eencae 0:d563e74f0ae9 31 // function set - extended
eencae 0:d563e74f0ae9 32 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
eencae 0:d563e74f0ae9 33
eencae 1:df68f34cd32d 34 sendCommand(CMD_VOP_7V38); // operating voltage - these values are from Chris Yan's Library
eencae 0:d563e74f0ae9 35 sendCommand(CMD_TC_TEMP_2); // temperature control
eencae 0:d563e74f0ae9 36 sendCommand(CMD_BI_MUX_48); // bias
eencae 0:d563e74f0ae9 37
eencae 0:d563e74f0ae9 38 // function set - basic
eencae 0:d563e74f0ae9 39 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
eencae 1:df68f34cd32d 40 normalMode(); // normal video mode by default
eencae 0:d563e74f0ae9 41 sendCommand(CMD_DC_NORMAL_MODE); // black on white
eencae 1:df68f34cd32d 42 //sendCommand(CMD_DC_INVERT_VIDEO); // white on black
eencae 0:d563e74f0ae9 43
eencae 0:d563e74f0ae9 44 // RAM is undefined at power-up so clear
eencae 0:d563e74f0ae9 45 clearRAM();
eencae 0:d563e74f0ae9 46
eencae 0:d563e74f0ae9 47 }
eencae 1:df68f34cd32d 48
eencae 1:df68f34cd32d 49 // sets normal video mode (black on white)
eencae 1:df68f34cd32d 50 void N5110::normalMode() {
eencae 1:df68f34cd32d 51 sendCommand(CMD_DC_NORMAL_MODE);
eencae 1:df68f34cd32d 52
eencae 1:df68f34cd32d 53 }
eencae 1:df68f34cd32d 54
eencae 1:df68f34cd32d 55 // sets normal video mode (white on black)
eencae 1:df68f34cd32d 56 void N5110::inverseMode() {
eencae 1:df68f34cd32d 57 sendCommand(CMD_DC_INVERT_VIDEO);
eencae 1:df68f34cd32d 58 }
eencae 0:d563e74f0ae9 59
eencae 0:d563e74f0ae9 60 // function to power up the LCD and backlight
eencae 0:d563e74f0ae9 61 void N5110::turnOn()
eencae 0:d563e74f0ae9 62 {
eencae 0:d563e74f0ae9 63 // set brightness of LED - 0.0 to 1.0 - default is 50%
eencae 0:d563e74f0ae9 64 setBrightness(0.5);
eencae 0:d563e74f0ae9 65 pwr->write(1); // apply power
eencae 0:d563e74f0ae9 66 }
eencae 0:d563e74f0ae9 67
eencae 0:d563e74f0ae9 68 // function to power down LCD
eencae 0:d563e74f0ae9 69 void N5110::turnOff()
eencae 0:d563e74f0ae9 70 {
eencae 0:d563e74f0ae9 71
eencae 0:d563e74f0ae9 72 setBrightness(0.0); // turn backlight off
eencae 0:d563e74f0ae9 73 clearRAM(); // clear RAM to ensure specified current consumption
eencae 0:d563e74f0ae9 74 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
eencae 0:d563e74f0ae9 75 sendCommand(CMD_DC_CLEAR_DISPLAY);
eencae 0:d563e74f0ae9 76 sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
eencae 0:d563e74f0ae9 77 pwr->write(0);
eencae 0:d563e74f0ae9 78
eencae 0:d563e74f0ae9 79 }
eencae 0:d563e74f0ae9 80
eencae 0:d563e74f0ae9 81 // function to change LED backlight brightness
eencae 0:d563e74f0ae9 82 void N5110::setBrightness(float brightness)
eencae 0:d563e74f0ae9 83 {
eencae 0:d563e74f0ae9 84 // check whether brightness is within range
eencae 0:d563e74f0ae9 85 if (brightness < 0.0)
eencae 0:d563e74f0ae9 86 brightness = 0.0;
eencae 0:d563e74f0ae9 87 if (brightness > 1.0)
eencae 0:d563e74f0ae9 88 brightness = 1.0;
eencae 0:d563e74f0ae9 89 // set PWM duty cycle
eencae 0:d563e74f0ae9 90 led->write(brightness);
eencae 0:d563e74f0ae9 91 }
eencae 0:d563e74f0ae9 92
eencae 0:d563e74f0ae9 93
eencae 0:d563e74f0ae9 94 // pulse the active low reset line
eencae 0:d563e74f0ae9 95 void N5110::reset()
eencae 0:d563e74f0ae9 96 {
eencae 0:d563e74f0ae9 97 rst->write(0); // reset the LCD
eencae 0:d563e74f0ae9 98 rst->write(1);
eencae 0:d563e74f0ae9 99 }
eencae 0:d563e74f0ae9 100
eencae 0:d563e74f0ae9 101 // function to initialise SPI peripheral
eencae 0:d563e74f0ae9 102 void N5110::initSPI()
eencae 0:d563e74f0ae9 103 {
eencae 0:d563e74f0ae9 104 spi->format(8,1); // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
eencae 0:d563e74f0ae9 105 spi->frequency(4000000); // maximum of screen is 4 MHz
eencae 0:d563e74f0ae9 106 }
eencae 0:d563e74f0ae9 107
eencae 0:d563e74f0ae9 108 void N5110::sendCommand(unsigned char command)
eencae 0:d563e74f0ae9 109 {
eencae 0:d563e74f0ae9 110 dc->write(0); // set DC low for command
eencae 0:d563e74f0ae9 111 sce->write(0); // set CE low to begin frame
eencae 0:d563e74f0ae9 112 spi->write(command); // send command
eencae 0:d563e74f0ae9 113 dc->write(1); // turn back to data by default
eencae 0:d563e74f0ae9 114 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
eencae 0:d563e74f0ae9 115
eencae 0:d563e74f0ae9 116 }
eencae 0:d563e74f0ae9 117
eencae 0:d563e74f0ae9 118 void N5110::sendData(unsigned char data)
eencae 0:d563e74f0ae9 119 {
eencae 0:d563e74f0ae9 120 sce->write(0); // set CE low to begin frame
eencae 0:d563e74f0ae9 121 spi->write(data);
eencae 0:d563e74f0ae9 122 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
eencae 0:d563e74f0ae9 123 }
eencae 0:d563e74f0ae9 124
eencae 0:d563e74f0ae9 125 // this function writes 0 to the 504 bytes to clear the RAM
eencae 0:d563e74f0ae9 126 void N5110::clearRAM()
eencae 0:d563e74f0ae9 127 {
eencae 0:d563e74f0ae9 128 int i;
eencae 0:d563e74f0ae9 129 sce->write(0); //set CE low to begin frame
eencae 0:d563e74f0ae9 130 for(i = 0; i < 504; i++) { // 48 x 84 bits = 504 bytes
eencae 0:d563e74f0ae9 131 spi->write(0x00); // send 0's
eencae 0:d563e74f0ae9 132 }
eencae 0:d563e74f0ae9 133 sce->write(1); // set CE high to end frame
eencae 0:d563e74f0ae9 134
eencae 0:d563e74f0ae9 135 }
eencae 0:d563e74f0ae9 136
eencae 0:d563e74f0ae9 137 void N5110::setXYAddress(int x, int y)
eencae 0:d563e74f0ae9 138 {
eencae 0:d563e74f0ae9 139
eencae 0:d563e74f0ae9 140 // check whether address is in range
eencae 0:d563e74f0ae9 141 if (x > 83)
eencae 0:d563e74f0ae9 142 x=83;
eencae 0:d563e74f0ae9 143 if (y > 5)
eencae 0:d563e74f0ae9 144 y=5;
eencae 3:f90dd1042d17 145 if (x < 0)
eencae 3:f90dd1042d17 146 x=0;
eencae 3:f90dd1042d17 147 if (y < 0)
eencae 3:f90dd1042d17 148 y=0;
eencae 0:d563e74f0ae9 149
eencae 3:f90dd1042d17 150 sendCommand(0x80 | x); // send addresses to display with relevant mask
eencae 0:d563e74f0ae9 151 sendCommand(0x40 | y);
eencae 0:d563e74f0ae9 152 }
eencae 0:d563e74f0ae9 153
eencae 0:d563e74f0ae9 154 void N5110::setPixel(int x, int y)
eencae 0:d563e74f0ae9 155 {
eencae 0:d563e74f0ae9 156 // calculate bank and shift 1 to required position
eencae 0:d563e74f0ae9 157 buffer[x][y/8] |= (1 << y%8);
eencae 0:d563e74f0ae9 158 }
eencae 0:d563e74f0ae9 159
eencae 0:d563e74f0ae9 160 void N5110::clearPixel(int x, int y)
eencae 0:d563e74f0ae9 161 {
eencae 0:d563e74f0ae9 162 // calculate bank and shift 1 to required position (using bit clear)
eencae 0:d563e74f0ae9 163 buffer[x][y/8] &= ~(1 << y%8);
eencae 0:d563e74f0ae9 164 }
eencae 0:d563e74f0ae9 165
eencae 0:d563e74f0ae9 166 unsigned char N5110::getPixel(int x, int y)
eencae 0:d563e74f0ae9 167 {
eencae 0:d563e74f0ae9 168 // return relevant bank and mask required bit
eencae 0:d563e74f0ae9 169 return buffer[x][y/8] & (1 << y%8);
eencae 0:d563e74f0ae9 170
eencae 0:d563e74f0ae9 171 }
eencae 0:d563e74f0ae9 172
eencae 0:d563e74f0ae9 173 void N5110::refreshDisplay()
eencae 0:d563e74f0ae9 174 {
eencae 0:d563e74f0ae9 175
eencae 0:d563e74f0ae9 176 int i,j;
eencae 0:d563e74f0ae9 177 sce->write(0); //set CE low to begin frame
eencae 0:d563e74f0ae9 178
eencae 0:d563e74f0ae9 179 for(j = 0; j < 6; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 0:d563e74f0ae9 180 for(i = 0; i < 84; i++) {
eencae 0:d563e74f0ae9 181 spi->write(buffer[i][j]); // send buffer
eencae 0:d563e74f0ae9 182 }
eencae 0:d563e74f0ae9 183 }
eencae 0:d563e74f0ae9 184 sce->write(1); // set CE high to end frame
eencae 0:d563e74f0ae9 185
eencae 0:d563e74f0ae9 186 }
eencae 0:d563e74f0ae9 187
eencae 0:d563e74f0ae9 188 void N5110::randomiseBuffer()
eencae 0:d563e74f0ae9 189 {
eencae 0:d563e74f0ae9 190
eencae 0:d563e74f0ae9 191 int i,j;
eencae 0:d563e74f0ae9 192
eencae 0:d563e74f0ae9 193 for(j = 0; j < 6; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 0:d563e74f0ae9 194 for(i = 0; i < 84; i++) {
eencae 0:d563e74f0ae9 195 buffer[i][j] = rand()%256; // generate random byte
eencae 0:d563e74f0ae9 196 }
eencae 0:d563e74f0ae9 197 }
eencae 0:d563e74f0ae9 198
eencae 0:d563e74f0ae9 199 }
eencae 0:d563e74f0ae9 200
eencae 0:d563e74f0ae9 201 // function to print 5x7 font
eencae 0:d563e74f0ae9 202 void N5110::printChar(char c)
eencae 0:d563e74f0ae9 203 {
eencae 0:d563e74f0ae9 204
eencae 0:d563e74f0ae9 205 // loop through 5 columns
eencae 0:d563e74f0ae9 206 for (int j = 0; j < 5 ; j++ ) {
eencae 0:d563e74f0ae9 207 sendData(font5x7[(c - 32)*5 + j]);
eencae 0:d563e74f0ae9 208 // array is offset by 32 relative to ASCII, each character is 5 pixels wide
eencae 0:d563e74f0ae9 209 }
eencae 1:df68f34cd32d 210
eencae 1:df68f34cd32d 211 sendData(0); // send an empty byte to introduce space between characters
eencae 0:d563e74f0ae9 212
eencae 0:d563e74f0ae9 213 }
eencae 0:d563e74f0ae9 214
eencae 0:d563e74f0ae9 215 // function to print string at specified position
eencae 0:d563e74f0ae9 216 void N5110::printString(const char * str,int x,int y)
eencae 0:d563e74f0ae9 217 {
eencae 0:d563e74f0ae9 218 int n = 0 ; // counter for number of characters in string
eencae 0:d563e74f0ae9 219 // loop through string and print character
eencae 0:d563e74f0ae9 220 while(*str) {
eencae 0:d563e74f0ae9 221
eencae 0:d563e74f0ae9 222 setXYAddress(x+6*n,y); // leave 1 pixel (6 = 5 + 1) between each character
eencae 0:d563e74f0ae9 223 printChar(*str);
eencae 0:d563e74f0ae9 224 str++; // go to next character in string
eencae 0:d563e74f0ae9 225 n++; // increment index
eencae 0:d563e74f0ae9 226 }
eencae 0:d563e74f0ae9 227
eencae 0:d563e74f0ae9 228 }
eencae 0:d563e74f0ae9 229
eencae 0:d563e74f0ae9 230 void N5110::clear()
eencae 0:d563e74f0ae9 231 {
eencae 0:d563e74f0ae9 232 clearBuffer();
eencae 0:d563e74f0ae9 233 refreshDisplay();
eencae 0:d563e74f0ae9 234 }
eencae 0:d563e74f0ae9 235
eencae 0:d563e74f0ae9 236 void N5110::clearBuffer()
eencae 0:d563e74f0ae9 237 {
eencae 0:d563e74f0ae9 238 int i,j;
eencae 0:d563e74f0ae9 239 for (i=0; i<84; i++) {
eencae 0:d563e74f0ae9 240 for (j=0; j<6; j++) {
eencae 0:d563e74f0ae9 241 buffer[i][j]=0;
eencae 0:d563e74f0ae9 242 }
eencae 0:d563e74f0ae9 243 }
eencae 0:d563e74f0ae9 244 }