Library for interfacing to Nokia 5110 LCD display with Image Loader (as found on the SparkFun website).
Diff: N5110.h
- Revision:
- 17:780a542d5f8b
- Parent:
- 16:b37a3a260598
- Child:
- 18:1af393359298
--- a/N5110.h Tue Mar 10 19:33:55 2015 +0000 +++ b/N5110.h Tue Mar 17 12:56:03 2015 +0000 @@ -32,35 +32,36 @@ #define CMD_VOP_6V06 0xB2 #define CMD_VOP_7V38 0xC8 -// number of pixels on display +// number of pixels on display #define WIDTH 84 #define HEIGHT 48 +#define BANKS 6 #include "mbed.h" -/** +/** @brief Library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed. @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). -@brief Can print characters and strings to the display using the included 5x7 font. +@brief Can print characters and strings to the display using the included 5x7 font. @brief The library also implements a screen buffer so that individual pixels on the display (84 x 48) can be set, cleared and read. - +@brief The library can print primitive shapes (lines, circles, rectangles) @brief Acknowledgements to Chris Yan's Nokia_5110 Library. -@brief Revision 1.1 +@brief Revision 1.2 @author Craig A. Evans -@date March 2015 +@date 17th March 2015 * * Example: * @code - + #include "mbed.h" #include "N5110.h" // VCC,SCE,RST,D/C,MOSI,SCLK,LED N5110 lcd(p7,p8,p9,p10,p11,p13,p21); // Can also power (VCC) directly from VOUT (3.3 V) - -// Can give better performance due to current limitation from GPIO pin +// Can give better performance due to current limitation from GPIO pin int main() { @@ -69,63 +70,88 @@ while(1) { - char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) - // so can display a string of a maximum 14 characters in length - - lcd.clear(); // clear display // these are default settings so not strictly needed lcd.normalMode(); // normal colour mode - lcd.setBrightness(0.5); // put LED backlight on full - + lcd.setBrightness(0.5); // put LED backlight on 50% + // can directly print strings at specified co-ordinates lcd.printString("Hello, World!",0,0); + char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) + // so can display a string of a maximum 14 characters in length // or create formatted strings - ensure they aren't more than 14 characters long int temperature = 27; int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer // it is important the format specifier ensures the length will fit in the buffer if (length <= 14) // if string will fit on display lcd.printString(buffer,0,1); // display on screen - + float pressure = 1012.3; // same idea with floats length = sprintf(buffer,"P = %.2f mb",pressure); if (length <= 14) lcd.printString(buffer,0,2); - - // can also print individual characters + + // can also print individual characters at specified place lcd.printChar('X',5,3); - - // draw a line across the display at y = 40 pixels (origin top-left) + + // draw a line across the display at y = 40 pixels (origin top-left) for (int i = 0; i < WIDTH; i++) { - lcd.setPixel(i,40); + lcd.setPixel(i,40); } // need to refresh display after setting pixels - lcd.refresh(); - + lcd.refresh(); + // can also check status of pixels using getPixel(x,y) - + wait(5.0); - lcd.clear(); // clear display lcd.inverseMode(); // invert colours lcd.setBrightness(1.0); // put LED backlight on full - + float array[84]; - + for (int i = 0; i < 84; i++) { - array[i] = 0.5 + 0.5*sin(i*2*3.14/84); + array[i] = 0.5 + 0.5*sin(i*2*3.14/84); } - + // can also plot graphs - 84 elements only // values must be in range 0.0 - 1.0 lcd.plotArray(array); - - wait(5.0); + wait(5.0); + lcd.clear(); + lcd.normalMode(); // normal colour mode back + lcd.setBrightness(0.5); // put LED backlight on 50% + + // example of drawing lines + for (int x = 0; x < WIDTH ; x+=10) { + // x0,y0,x1,y1,type 0-white,1-black,2-dotted + lcd.drawLine(0,0,x,HEIGHT,2); + } + + wait(5.0); + lcd.clear(); + + // example of how to draw circles + lcd.drawCircle(WIDTH/2,HEIGHT/2,20,1); // x,y,radius,black fill + lcd.drawCircle(WIDTH/2,HEIGHT/2,10,2); // x,y,radius,white fill + lcd.drawCircle(WIDTH/2,HEIGHT/2,30,0); // x,y,radius,transparent with outline + + wait(5.0); + lcd.clear(); + + // example of how to draw rectangles + // origin x,y,width,height,type + lcd.drawRect(10,10,50,30,1); // filled black rectangle + lcd.drawRect(15,15,20,10,2); // filled white rectange (no outline) + lcd.drawRect(2,2,70,40,0); // transparent, just outline + + wait(5.0); + lcd.clear(); } } - + * @endcode */ class N5110 @@ -140,56 +166,56 @@ * @param dc Pin connected to data/command select (pin 5) * @param mosi Pin connected to data input (MOSI) (pin 6) * @param sclk Pin connected to serial clock (SCLK) (pin 7) - * @param led Pin connected to LED backlight (must be PWM) (pin 8) - * + * @param led Pin connected to LED backlight (must be PWM) (pin 8) + * */ N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin); - + /** Initialise display * * Powers up the display and turns on backlight (50% brightness default). * Sets the display up in horizontal addressing mode and with normal video mode. */ void init(); - + /** Turn off * * Powers down the display and turns of the backlight. * Needs to be reinitialised before being re-used. */ void turnOff(); - + /** Clears * * Clears the screen. */ void clear(); - + /** Turn on normal video mode (default) * Black on white */ void normalMode(); - + /** Turn on inverse video mode (default) * White on black */ void inverseMode(); - + /** Set Brightness * * Sets brightness of LED backlight. * @param brightness - float in range 0.0 to 1.0 */ void setBrightness(float brightness); - + /** Print String * - * Prints a string of characters to the display. + * Prints a string of characters to the display. * @param x - the column number (0 to 83) * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row */ void printString(const char * str,int x,int y); - + /** Print Character * * Sends a character to the display. Printed at the specified location @@ -198,60 +224,93 @@ * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row */ void printChar(char c,int x,int y); - + /** Set a Pixel * * This function sets a pixel in the display. A call to refresh() must be made * to update the display to reflect the change in pixels. * @param x - the x co-ordinate of the pixel (0 to 83) - * @param y - the y co-ordinate of the pixel (0 to 47) + * @param y - the y co-ordinate of the pixel (0 to 47) */ void setPixel(int x, int y); - + /** Clear a Pixel * * This function clears pixel in the display. A call to refresh() must be made * to update the display to reflect the change in pixels. * @param x - the x co-ordinate of the pixel (0 to 83) - * @param y - the y co-ordinate of the pixel (0 to 47) + * @param y - the y co-ordinate of the pixel (0 to 47) */ void clearPixel(int x, int y); - + /** Get a Pixel * * This function gets the status of a pixel in the display. * @param x - the x co-ordinate of the pixel (0 to 83) - * @param y - the y co-ordinate of the pixel (0 to 47) - * @returns + * @param y - the y co-ordinate of the pixel (0 to 47) + * @returns * 0 - pixel is clear * non-zero - pixel is set */ int getPixel(int x, int y); - + /** Refresh display * * This functions refreshes the display to reflect the current data in the buffer. - */ + */ void refresh(); - + /** Randomise buffer * - * This function fills the buffer with random data. Can be used to test the display. + * This function fills the buffer with random data. Can be used to test the display. * A call to refresh() must be made to update the display to reflect the change in pixels. * The seed is not set and so the generated pattern will probably be the same each time. * TODO: Randomise the seed - maybe using the noise on the AnalogIn pins. */ void randomiseBuffer(); - + /** Plot Array * - * This function plots a one-dimensional array on the display. The values in the array - * correspond to the y values of the plot and these are plotted along the x-axis (one - * value per pixel along the x-axis of the display. This means only the first 84 values are - * plotted. y values in the array should be normalised in the range 0.0 to 1.0. + * This function plots a one-dimensional array on the display. + * @param array[] - y values of the plot. Values should be normalised in the range 0.0 to 1.0. First 84 plotted. */ void plotArray(float array[]); + /** Draw Circle + * + * This function draws a circle at the specified origin with specified radius to the display. + * Uses the midpoint circle algorithm. + * @see http://en.wikipedia.org/wiki/Midpoint_circle_algorithm + * @param x0 - x-coordinate of centre + * @param y0 - y-coordinate of centre + * @param radius - radius of circle in pixels + * @param fill - 0 transparent (w/outline), 1 filled black, 2 filled white (wo/outline) + */ + void drawCircle(int x0,int y0,int radius,int fill); + + /** Draw Line + * + * This function draws a line between the specified points using linear interpolation. + * @param x0 - x-coordinate of first point + * @param y0 - y-coordinate of first point + * @param x1 - x-coordinate of last point + * @param y1 - y-coordinate of last point + * @param type - 0 white,1 black,2 dotted + */ + void drawLine(int x0,int y0,int x1,int y1,int type); + + /** Draw Rectangle + * + * This function draws a rectangle. + * @param x0 - x-coordinate of origin (top-left) + * @param y0 - y-coordinate of origin (top-left) + * @param width - width of rectangle + * @param height - height of rectangle + * @param fill - 0 transparent (w/outline), 1 filled black, 2 filled white (wo/outline) + */ + void drawRect(int x0,int y0,int width,int height,int fill); + + private: void setXYAddress(int x, int y);