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:09:15 2014 +0000
Revision:
3:f90dd1042d17
Parent:
2:e93021cfb0a9
Child:
5:6ea180eef702
Added documentation.

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 3:f90dd1042d17 139 if (x < 0)
eencae 3:f90dd1042d17 140 x=0;
eencae 3:f90dd1042d17 141 if (y < 0)
eencae 3:f90dd1042d17 142 y=0;
eencae 0:d563e74f0ae9 143
eencae 3:f90dd1042d17 144 sendCommand(0x80 | x); // send addresses to display with relevant mask
eencae 0:d563e74f0ae9 145 sendCommand(0x40 | y);
eencae 0:d563e74f0ae9 146 }
eencae 0:d563e74f0ae9 147
eencae 0:d563e74f0ae9 148 void N5110::setPixel(int x, int y)
eencae 0:d563e74f0ae9 149 {
eencae 0:d563e74f0ae9 150 // calculate bank and shift 1 to required position
eencae 0:d563e74f0ae9 151 buffer[x][y/8] |= (1 << y%8);
eencae 0:d563e74f0ae9 152 }
eencae 0:d563e74f0ae9 153
eencae 0:d563e74f0ae9 154 void N5110::clearPixel(int x, int y)
eencae 0:d563e74f0ae9 155 {
eencae 0:d563e74f0ae9 156 // calculate bank and shift 1 to required position (using bit clear)
eencae 0:d563e74f0ae9 157 buffer[x][y/8] &= ~(1 << y%8);
eencae 0:d563e74f0ae9 158 }
eencae 0:d563e74f0ae9 159
eencae 0:d563e74f0ae9 160 unsigned char N5110::getPixel(int x, int y)
eencae 0:d563e74f0ae9 161 {
eencae 0:d563e74f0ae9 162 // return relevant bank and mask required bit
eencae 0:d563e74f0ae9 163 return buffer[x][y/8] & (1 << y%8);
eencae 0:d563e74f0ae9 164
eencae 0:d563e74f0ae9 165 }
eencae 0:d563e74f0ae9 166
eencae 0:d563e74f0ae9 167 void N5110::refreshDisplay()
eencae 0:d563e74f0ae9 168 {
eencae 0:d563e74f0ae9 169
eencae 0:d563e74f0ae9 170 int i,j;
eencae 0:d563e74f0ae9 171 sce->write(0); //set CE low to begin frame
eencae 0:d563e74f0ae9 172
eencae 0:d563e74f0ae9 173 for(j = 0; j < 6; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 0:d563e74f0ae9 174 for(i = 0; i < 84; i++) {
eencae 0:d563e74f0ae9 175 spi->write(buffer[i][j]); // send buffer
eencae 0:d563e74f0ae9 176 }
eencae 0:d563e74f0ae9 177 }
eencae 0:d563e74f0ae9 178 sce->write(1); // set CE high to end frame
eencae 0:d563e74f0ae9 179
eencae 0:d563e74f0ae9 180 }
eencae 0:d563e74f0ae9 181
eencae 0:d563e74f0ae9 182 void N5110::randomiseBuffer()
eencae 0:d563e74f0ae9 183 {
eencae 0:d563e74f0ae9 184
eencae 0:d563e74f0ae9 185 int i,j;
eencae 0:d563e74f0ae9 186
eencae 0:d563e74f0ae9 187 for(j = 0; j < 6; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 0:d563e74f0ae9 188 for(i = 0; i < 84; i++) {
eencae 0:d563e74f0ae9 189 buffer[i][j] = rand()%256; // generate random byte
eencae 0:d563e74f0ae9 190 }
eencae 0:d563e74f0ae9 191 }
eencae 0:d563e74f0ae9 192
eencae 0:d563e74f0ae9 193 }
eencae 0:d563e74f0ae9 194
eencae 0:d563e74f0ae9 195 // function to print 5x7 font
eencae 0:d563e74f0ae9 196 void N5110::printChar(char c)
eencae 0:d563e74f0ae9 197 {
eencae 0:d563e74f0ae9 198
eencae 0:d563e74f0ae9 199 // loop through 5 columns
eencae 0:d563e74f0ae9 200 for (int j = 0; j < 5 ; j++ ) {
eencae 0:d563e74f0ae9 201 sendData(font5x7[(c - 32)*5 + j]);
eencae 0:d563e74f0ae9 202 // array is offset by 32 relative to ASCII, each character is 5 pixels wide
eencae 0:d563e74f0ae9 203 }
eencae 1:df68f34cd32d 204
eencae 1:df68f34cd32d 205 sendData(0); // send an empty byte to introduce space between characters
eencae 0:d563e74f0ae9 206
eencae 0:d563e74f0ae9 207 }
eencae 0:d563e74f0ae9 208
eencae 0:d563e74f0ae9 209 // function to print string at specified position
eencae 0:d563e74f0ae9 210 void N5110::printString(const char * str,int x,int y)
eencae 0:d563e74f0ae9 211 {
eencae 0:d563e74f0ae9 212 int n = 0 ; // counter for number of characters in string
eencae 0:d563e74f0ae9 213 // loop through string and print character
eencae 0:d563e74f0ae9 214 while(*str) {
eencae 0:d563e74f0ae9 215
eencae 0:d563e74f0ae9 216 setXYAddress(x+6*n,y); // leave 1 pixel (6 = 5 + 1) between each character
eencae 0:d563e74f0ae9 217 printChar(*str);
eencae 0:d563e74f0ae9 218 str++; // go to next character in string
eencae 0:d563e74f0ae9 219 n++; // increment index
eencae 0:d563e74f0ae9 220 }
eencae 0:d563e74f0ae9 221
eencae 0:d563e74f0ae9 222 }
eencae 0:d563e74f0ae9 223
eencae 0:d563e74f0ae9 224 void N5110::clear()
eencae 0:d563e74f0ae9 225 {
eencae 0:d563e74f0ae9 226 clearBuffer();
eencae 0:d563e74f0ae9 227 refreshDisplay();
eencae 0:d563e74f0ae9 228 }
eencae 0:d563e74f0ae9 229
eencae 0:d563e74f0ae9 230 void N5110::clearBuffer()
eencae 0:d563e74f0ae9 231 {
eencae 0:d563e74f0ae9 232 int i,j;
eencae 0:d563e74f0ae9 233 for (i=0; i<84; i++) {
eencae 0:d563e74f0ae9 234 for (j=0; j<6; j++) {
eencae 0:d563e74f0ae9 235 buffer[i][j]=0;
eencae 0:d563e74f0ae9 236 }
eencae 0:d563e74f0ae9 237 }
eencae 0:d563e74f0ae9 238 }