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