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