Library for interfacing to Nokia 5110 LCD display (as found on the SparkFun website).

Dependents:   LV7_LCDtest LV7_Grupa5_Tim003_Zadatak1 lv7_Grupa5_Tim008_zad1 LV7_PAI_Grupa5_tim10_Zadatak1 ... more

This library is designed to make it easy to interface an mbed with a Nokia 5110 LCD display.

These can be found at Sparkfun (https://www.sparkfun.com/products/10168) and Adafruit (http://www.adafruit.com/product/338).

The library uses the SPI peripheral on the mbed which means it is much faster sending data to the display than other libraries available on other platforms that use software SPI.

The library can print strings as well as controlling individual pixels, meaning that both text and primitive graphics can be displayed.

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);