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:06:58 2014 +0000
Revision:
2:e93021cfb0a9
Parent:
1:df68f34cd32d
Child:
3:f90dd1042d17
Added documentation and additional testing.

Who changed what in which revision?

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