Simple library for interfacing to Nokia 5110 LCD display (as found on the SparkFun website). Edited to include additional feaatures, such as 2d array loading, multiple screen buffers, and better backlight control

Dependencies:   N5110

Dependents:   Main_code_ver18

Fork of N5110 by Craig Evans

Committer:
eencae
Date:
Sun Jan 26 18:55:16 2014 +0000
Revision:
0:d563e74f0ae9
Child:
1:df68f34cd32d
Initial commit of library.; ; Testing and documentation to do.

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