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