Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
N5110.h
00001 #ifndef N5110_H 00002 #define N5110_H 00003 00004 #include "mbed.h" 00005 00006 // Command Bytes - taken from Chris Yan's library 00007 // More information can be found in the display datasheet 00008 // H = 0 - Basic instructions 00009 #define CMD_DC_CLEAR_DISPLAY 0x08 00010 #define CMD_DC_NORMAL_MODE 0x0C 00011 #define CMD_DC_FILL_DISPLAY 0x09 00012 #define CMD_DC_INVERT_VIDEO 0x0D 00013 #define CMD_FS_HORIZONTAL_MODE 0x00 00014 #define CMD_FS_VERTICAL_MODE 0x02 00015 #define CMD_FS_BASIC_MODE 0x00 00016 #define CMD_FS_EXTENDED_MODE 0x01 00017 #define CMD_FS_ACTIVE_MODE 0x00 00018 #define CMD_FS_POWER_DOWN_MODE 0x04 00019 // H = 1 - Extended instructions 00020 #define CMD_TC_TEMP_0 0x04 00021 #define CMD_TC_TEMP_1 0x05 00022 #define CMD_TC_TEMP_2 0x06 00023 #define CMD_TC_TEMP_3 0x07 00024 #define CMD_BI_MUX_24 0x15 00025 #define CMD_BI_MUX_48 0x13 00026 #define CMD_BI_MUX_100 0x10 00027 #define CMD_VOP_6V06 0xB2 00028 #define CMD_VOP_7V38 0xC8 00029 00030 // number of pixels on display 00031 #define WIDTH 84 00032 #define HEIGHT 48 00033 #define BANKS 6 00034 00035 /// Fill types for 2D shapes 00036 enum FillType { 00037 FILL_TRANSPARENT, ///< Transparent with outline 00038 FILL_BLACK, ///< Filled black 00039 FILL_WHITE, ///< Filled white (no outline) 00040 }; 00041 00042 /** N5110 Class 00043 @brief Library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed. 00044 @brief The display is powered from a GPIO pin meaning it can be controlled via software. The LED backlight is also software-controllable (via PWM pin). 00045 @brief Can print characters and strings to the display using the included 5x7 font. 00046 @brief The library also implements a screen buffer so that individual pixels on the display (84 x 48) can be set, cleared and read. 00047 @brief The library can print primitive shapes (lines, circles, rectangles) 00048 @brief Acknowledgements to Chris Yan's Nokia_5110 Library. 00049 00050 @brief Revision 1.3 00051 00052 @author Craig A. Evans 00053 @date 7th February 2017 00054 00055 @code 00056 00057 #include "mbed.h" 00058 #include "N5110.h" 00059 00060 // VCC,SCE,RST,D/C,MOSI,SCLK,LED 00061 //N5110 lcd(p7,p8,p9,p10,p11,p13,p21); // LPC1768 - pwr from GPIO 00062 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3 00063 00064 int main() 00065 { 00066 // first need to initialise display 00067 lcd.init(); 00068 00069 while(1) { 00070 00071 // these are default settings so not strictly needed 00072 lcd.normalMode(); // normal colour mode 00073 lcd.setBrightness(0.5); // put LED backlight on 50% 00074 00075 lcd.clear(); // clear buffer at start of every loop 00076 // can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display) 00077 lcd.printString("Hello, World!",0,0); 00078 00079 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) 00080 // so can display a string of a maximum 14 characters in length 00081 // or create formatted strings - ensure they aren't more than 14 characters long 00082 int temperature = 27; 00083 int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer 00084 // it is important the format specifier ensures the length will fit in the buffer 00085 if (length <= 14) // if string will fit on display (assuming printing at x=0) 00086 lcd.printString(buffer,0,1); // display on screen 00087 00088 float pressure = 1012.3; // same idea with floats 00089 length = sprintf(buffer,"P = %.2f mb",pressure); 00090 if (length <= 14) 00091 lcd.printString(buffer,0,2); 00092 00093 // can also print individual characters at specified place 00094 lcd.printChar('X',5,3); 00095 00096 // draw a line across the display at y = 40 pixels (origin top-left) 00097 for (int i = 0; i < WIDTH; i++) { 00098 lcd.setPixel(i,40); 00099 } 00100 // need to refresh display after setting pixels or writing strings 00101 lcd.refresh(); 00102 wait(5.0); 00103 00104 // can check status of pixel using getPixel(x,y); 00105 lcd.clear(); // clear buffer 00106 lcd.setPixel(2,2); // set random pixel in buffer 00107 lcd.refresh(); 00108 wait(1.0); 00109 00110 int pixel_to_test = lcd.getPixel(2,2); 00111 00112 printf("2,2 Pixel value = %i\n",pixel_to_test); 00113 00114 if ( pixel_to_test ) { 00115 lcd.printString("2,2 is set",0,4); 00116 } 00117 00118 // this one shouldn't be set 00119 pixel_to_test = lcd.getPixel(3,3); 00120 00121 printf("3,3 Pixel value = %i\n",pixel_to_test); 00122 00123 if ( pixel_to_test == 0 ) { 00124 lcd.printString("3,3 is clear",0,5); 00125 } 00126 00127 lcd.refresh(); 00128 wait(4.0); 00129 00130 lcd.clear(); // clear buffer 00131 lcd.inverseMode(); // invert colours 00132 lcd.setBrightness(1.0); // put LED backlight on full 00133 00134 float array[84]; 00135 00136 for (int i = 0; i < 84; i++) { 00137 array[i] = 0.5 + 0.5*sin(i*2*3.14/84); 00138 } 00139 00140 // can also plot graphs - 84 elements only 00141 // values must be in range 0.0 - 1.0 00142 lcd.plotArray(array); 00143 lcd.refresh(); 00144 wait(5.0); 00145 00146 lcd.clear(); 00147 lcd.normalMode(); // normal colour mode back 00148 lcd.setBrightness(0.5); // put LED backlight on 50% 00149 00150 // example of drawing lines 00151 for (int x = 0; x < WIDTH ; x+=10) { 00152 // x0,y0,x1,y1,type 0-white,1-black,2-dotted 00153 lcd.drawLine(0,0,x,HEIGHT,2); 00154 } 00155 lcd.refresh(); // refresh after drawing shapes 00156 wait(5.0); 00157 00158 00159 lcd.clear(); 00160 // example of how to draw circles 00161 lcd.drawCircle(WIDTH/2,HEIGHT/2,20,FILL_BLACK); // x,y,radius,black fill 00162 lcd.drawCircle(WIDTH/2,HEIGHT/2,10,FILL_WHITE); // x,y,radius,white fill 00163 lcd.drawCircle(WIDTH/2,HEIGHT/2,30,FILL_TRANSPARENT); // x,y,radius,transparent with outline 00164 lcd.refresh(); // refresh after drawing shapes 00165 wait(5.0); 00166 00167 lcd.clear(); 00168 // example of how to draw rectangles 00169 // origin x,y,width,height,type 00170 lcd.drawRect(10,10,50,30,FILL_BLACK); // filled black rectangle 00171 lcd.drawRect(15,15,20,10,FILL_WHITE); // filled white rectange (no outline) 00172 lcd.drawRect(2,2,70,40, FILL_TRANSPARENT); // transparent, just outline 00173 lcd.refresh(); // refresh after drawing shapes 00174 wait(5.0); 00175 } 00176 } 00177 00178 @endcode 00179 */ 00180 class N5110 00181 { 00182 private: 00183 // objects 00184 SPI *_spi; 00185 PwmOut *_led; 00186 DigitalOut *_pwr; 00187 DigitalOut *_sce; 00188 DigitalOut *_rst; 00189 DigitalOut *_dc; 00190 00191 // variables 00192 unsigned char buffer[84][6]; // screen buffer - the 6 is for the banks - each one is 8 bits; 00193 00194 public: 00195 /** Create a N5110 object connected to the specified pins 00196 * 00197 * @param pwr Pin connected to Vcc on the LCD display (pin 1) 00198 * @param sce Pin connected to chip enable (pin 3) 00199 * @param rst Pin connected to reset (pin 4) 00200 * @param dc Pin connected to data/command select (pin 5) 00201 * @param mosi Pin connected to data input (MOSI) (pin 6) 00202 * @param sclk Pin connected to serial clock (SCLK) (pin 7) 00203 * @param led Pin connected to LED backlight (must be PWM) (pin 8) 00204 * 00205 */ 00206 N5110(PinName const pwrPin, 00207 PinName const scePin, 00208 PinName const rstPin, 00209 PinName const dcPin, 00210 PinName const mosiPin, 00211 PinName const sclkPin, 00212 PinName const ledPin); 00213 00214 /** Create a N5110 object connected to the specified pins (Vcc to +3V3) 00215 * 00216 * @param sce Pin connected to chip enable (pin 3) 00217 * @param rst Pin connected to reset (pin 4) 00218 * @param dc Pin connected to data/command select (pin 5) 00219 * @param mosi Pin connected to data input (MOSI) (pin 6) 00220 * @param sclk Pin connected to serial clock (SCLK) (pin 7) 00221 * @param led Pin connected to LED backlight (must be PWM) (pin 8) 00222 * 00223 */ 00224 N5110(PinName const scePin, 00225 PinName const rstPin, 00226 PinName const dcPin, 00227 PinName const mosiPin, 00228 PinName const sclkPin, 00229 PinName const ledPin); 00230 00231 /** 00232 * Free allocated memory when object goes out of scope 00233 */ 00234 ~N5110(); 00235 00236 /** Initialise display 00237 * 00238 * Powers up the display and turns on backlight (50% brightness default). 00239 * Sets the display up in horizontal addressing mode and with normal video mode. 00240 */ 00241 void init(); 00242 00243 /** Turn off 00244 * 00245 * Powers down the display and turns of the backlight. 00246 * Needs to be reinitialised before being re-used. 00247 */ 00248 void turnOff(); 00249 00250 /** Clear 00251 * 00252 * Clears the screen buffer. 00253 */ 00254 void clear(); 00255 00256 /** Turn on normal video mode (default) 00257 * Black on white 00258 */ 00259 void normalMode(); 00260 00261 /** Turn on inverse video mode (default) 00262 * White on black 00263 */ 00264 void inverseMode(); 00265 00266 /** Set Brightness 00267 * 00268 * Sets brightness of LED backlight. 00269 * @param brightness - float in range 0.0 to 1.0 00270 */ 00271 void setBrightness(float const brightness); 00272 00273 /** Print String 00274 * 00275 * Prints a string of characters to the screen buffer. String is cut-off after the 83rd pixel. 00276 * @param x - the column number (0 to 83) 00277 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row 00278 */ 00279 void printString(char const *str, 00280 unsigned int const x, 00281 unsigned int const y); 00282 00283 /** Print Character 00284 * 00285 * Sends a character to the screen buffer. Printed at the specified location. Character is cut-off after the 83rd pixel. 00286 * @param c - the character to print. Can print ASCII as so printChar('C'). 00287 * @param x - the column number (0 to 83) 00288 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row 00289 */ 00290 void printChar(char const c, 00291 unsigned int const x, 00292 unsigned int const y); 00293 00294 /** Set a Pixel 00295 * 00296 * This function sets a pixel in the screen buffer. 00297 * @param x - the x co-ordinate of the pixel (0 to 83) 00298 * @param y - the y co-ordinate of the pixel (0 to 47) 00299 */ 00300 void setPixel(unsigned int const x, 00301 unsigned int const y); 00302 00303 /** Clear a Pixel 00304 * 00305 * This function clears pixel in the screen buffer 00306 * @param x - the x co-ordinate of the pixel (0 to 83) 00307 * @param y - the y co-ordinate of the pixel (0 to 47) 00308 */ 00309 void clearPixel(unsigned int const x, 00310 unsigned int const y); 00311 00312 /** Get a Pixel 00313 * 00314 * This function gets the status of a pixel in the screen buffer. 00315 * @param x - the x co-ordinate of the pixel (0 to 83) 00316 * @param y - the y co-ordinate of the pixel (0 to 47) 00317 * @returns 00318 * 0 - pixel is clear 00319 * 1 - pixel is set 00320 */ 00321 int getPixel(unsigned int const x, 00322 unsigned int const y) const; 00323 00324 /** Refresh display 00325 * 00326 * This functions sends the screen buffer to the display. 00327 */ 00328 void refresh(); 00329 00330 /** Randomise buffer 00331 * 00332 * This function fills the buffer with random data. Can be used to test the display. 00333 * A call to refresh() must be made to update the display to reflect the change in pixels. 00334 * The seed is not set and so the generated pattern will probably be the same each time. 00335 * TODO: Randomise the seed - maybe using the noise on the AnalogIn pins. 00336 */ 00337 void randomiseBuffer(); 00338 00339 /** Plot Array 00340 * 00341 * This function plots a one-dimensional array in the buffer. 00342 * @param array[] - y values of the plot. Values should be normalised in the range 0.0 to 1.0. First 84 plotted. 00343 */ 00344 void plotArray(float const array[]); 00345 00346 /** Draw Circle 00347 * 00348 * This function draws a circle at the specified origin with specified radius in the screen buffer 00349 * Uses the midpoint circle algorithm. 00350 * @see http://en.wikipedia.org/wiki/Midpoint_circle_algorithm 00351 * @param x0 - x-coordinate of centre 00352 * @param y0 - y-coordinate of centre 00353 * @param radius - radius of circle in pixels 00354 * @param fill - fill-type for the shape 00355 */ 00356 void drawCircle(unsigned int const x0, 00357 unsigned int const y0, 00358 unsigned int const radius, 00359 FillType const fill); 00360 00361 /** Draw Line 00362 * 00363 * This function draws a line between the specified points using linear interpolation. 00364 * @param x0 - x-coordinate of first point 00365 * @param y0 - y-coordinate of first point 00366 * @param x1 - x-coordinate of last point 00367 * @param y1 - y-coordinate of last point 00368 * @param type - 0 white,1 black,2 dotted 00369 */ 00370 void drawLine(unsigned int const x0, 00371 unsigned int const y0, 00372 unsigned int const x1, 00373 unsigned int const y1, 00374 unsigned int const type); 00375 00376 /** Draw Rectangle 00377 * 00378 * This function draws a rectangle. 00379 * @param x0 - x-coordinate of origin (top-left) 00380 * @param y0 - y-coordinate of origin (top-left) 00381 * @param width - width of rectangle 00382 * @param height - height of rectangle 00383 * @param fill - fill-type for the shape 00384 */ 00385 void drawRect(unsigned int const x0, 00386 unsigned int const y0, 00387 unsigned int const width, 00388 unsigned int const height, 00389 FillType const fill); 00390 00391 private: 00392 // methods 00393 void setXYAddress(unsigned int const x, 00394 unsigned int const y); 00395 void initSPI(); 00396 void turnOn(); 00397 void reset(); 00398 void clearRAM(); 00399 void sendCommand(unsigned char command); 00400 void sendData(unsigned char data); 00401 }; 00402 00403 const unsigned char font5x7[480] = { 00404 0x00, 0x00, 0x00, 0x00, 0x00,// (space) 00405 0x00, 0x00, 0x5F, 0x00, 0x00,// ! 00406 0x00, 0x07, 0x00, 0x07, 0x00,// " 00407 0x14, 0x7F, 0x14, 0x7F, 0x14,// # 00408 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 00409 0x23, 0x13, 0x08, 0x64, 0x62,// % 00410 0x36, 0x49, 0x55, 0x22, 0x50,// & 00411 0x00, 0x05, 0x03, 0x00, 0x00,// ' 00412 0x00, 0x1C, 0x22, 0x41, 0x00,// ( 00413 0x00, 0x41, 0x22, 0x1C, 0x00,// ) 00414 0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 00415 0x08, 0x08, 0x3E, 0x08, 0x08,// + 00416 0x00, 0x50, 0x30, 0x00, 0x00,// , 00417 0x08, 0x08, 0x08, 0x08, 0x08,// - 00418 0x00, 0x60, 0x60, 0x00, 0x00,// . 00419 0x20, 0x10, 0x08, 0x04, 0x02,// / 00420 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 00421 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 00422 0x42, 0x61, 0x51, 0x49, 0x46,// 2 00423 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 00424 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 00425 0x27, 0x45, 0x45, 0x45, 0x39,// 5 00426 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 00427 0x01, 0x71, 0x09, 0x05, 0x03,// 7 00428 0x36, 0x49, 0x49, 0x49, 0x36,// 8 00429 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 00430 0x00, 0x36, 0x36, 0x00, 0x00,// : 00431 0x00, 0x56, 0x36, 0x00, 0x00,// ; 00432 0x00, 0x08, 0x14, 0x22, 0x41,// < 00433 0x14, 0x14, 0x14, 0x14, 0x14,// = 00434 0x41, 0x22, 0x14, 0x08, 0x00,// > 00435 0x02, 0x01, 0x51, 0x09, 0x06,// ? 00436 0x32, 0x49, 0x79, 0x41, 0x3E,// @ 00437 0x7E, 0x11, 0x11, 0x11, 0x7E,// A 00438 0x7F, 0x49, 0x49, 0x49, 0x36,// B 00439 0x3E, 0x41, 0x41, 0x41, 0x22,// C 00440 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 00441 0x7F, 0x49, 0x49, 0x49, 0x41,// E 00442 0x7F, 0x09, 0x09, 0x01, 0x01,// F 00443 0x3E, 0x41, 0x41, 0x51, 0x32,// G 00444 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 00445 0x00, 0x41, 0x7F, 0x41, 0x00,// I 00446 0x20, 0x40, 0x41, 0x3F, 0x01,// J 00447 0x7F, 0x08, 0x14, 0x22, 0x41,// K 00448 0x7F, 0x40, 0x40, 0x40, 0x40,// L 00449 0x7F, 0x02, 0x04, 0x02, 0x7F,// M 00450 0x7F, 0x04, 0x08, 0x10, 0x7F,// N 00451 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 00452 0x7F, 0x09, 0x09, 0x09, 0x06,// P 00453 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 00454 0x7F, 0x09, 0x19, 0x29, 0x46,// R 00455 0x46, 0x49, 0x49, 0x49, 0x31,// S 00456 0x01, 0x01, 0x7F, 0x01, 0x01,// T 00457 0x3F, 0x40, 0x40, 0x40, 0x3F,// U 00458 0x1F, 0x20, 0x40, 0x20, 0x1F,// V 00459 0x7F, 0x20, 0x18, 0x20, 0x7F,// W 00460 0x63, 0x14, 0x08, 0x14, 0x63,// X 00461 0x03, 0x04, 0x78, 0x04, 0x03,// Y 00462 0x61, 0x51, 0x49, 0x45, 0x43,// Z 00463 0x00, 0x00, 0x7F, 0x41, 0x41,// [ 00464 0x02, 0x04, 0x08, 0x10, 0x20,// "\" 00465 0x41, 0x41, 0x7F, 0x00, 0x00,// ] 00466 0x04, 0x02, 0x01, 0x02, 0x04,// ^ 00467 0x40, 0x40, 0x40, 0x40, 0x40,// _ 00468 0x00, 0x01, 0x02, 0x04, 0x00,// ` 00469 0x20, 0x54, 0x54, 0x54, 0x78,// a 00470 0x7F, 0x48, 0x44, 0x44, 0x38,// b 00471 0x38, 0x44, 0x44, 0x44, 0x20,// c 00472 0x38, 0x44, 0x44, 0x48, 0x7F,// d 00473 0x38, 0x54, 0x54, 0x54, 0x18,// e 00474 0x08, 0x7E, 0x09, 0x01, 0x02,// f 00475 0x08, 0x14, 0x54, 0x54, 0x3C,// g 00476 0x7F, 0x08, 0x04, 0x04, 0x78,// h 00477 0x00, 0x44, 0x7D, 0x40, 0x00,// i 00478 0x20, 0x40, 0x44, 0x3D, 0x00,// j 00479 0x00, 0x7F, 0x10, 0x28, 0x44,// k 00480 0x00, 0x41, 0x7F, 0x40, 0x00,// l 00481 0x7C, 0x04, 0x18, 0x04, 0x78,// m 00482 0x7C, 0x08, 0x04, 0x04, 0x78,// n 00483 0x38, 0x44, 0x44, 0x44, 0x38,// o 00484 0x7C, 0x14, 0x14, 0x14, 0x08,// p 00485 0x08, 0x14, 0x14, 0x18, 0x7C,// q 00486 0x7C, 0x08, 0x04, 0x04, 0x08,// r 00487 0x48, 0x54, 0x54, 0x54, 0x20,// s 00488 0x04, 0x3F, 0x44, 0x40, 0x20,// t 00489 0x3C, 0x40, 0x40, 0x20, 0x7C,// u 00490 0x1C, 0x20, 0x40, 0x20, 0x1C,// v 00491 0x3C, 0x40, 0x30, 0x40, 0x3C,// w 00492 0x44, 0x28, 0x10, 0x28, 0x44,// x 00493 0x0C, 0x50, 0x50, 0x50, 0x3C,// y 00494 0x44, 0x64, 0x54, 0x4C, 0x44,// z 00495 0x00, 0x08, 0x36, 0x41, 0x00,// { 00496 0x00, 0x00, 0x7F, 0x00, 0x00,// | 00497 0x00, 0x41, 0x36, 0x08, 0x00,// } 00498 0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 00499 0x08, 0x1C, 0x2A, 0x08, 0x08 // <- 00500 }; 00501 00502 #endif
Generated on Wed Jul 13 2022 13:02:18 by
