Yang Zhenye 201199680

Dependencies:   mbed

Revision:
5:fcad75e9b9e1
Parent:
0:ac2868313b41
--- a/N5110/N5110.h	Wed May 13 14:55:07 2020 +0000
+++ b/N5110/N5110.h	Thu May 14 14:13:03 2020 +0000
@@ -1,44 +1,20 @@
 #ifndef N5110_H
 #define N5110_H
-
+ 
 #include "mbed.h"
-
-// Command Bytes - taken from Chris Yan's library
-// More information can be found in the display datasheet
-// H = 0 - Basic instructions
-#define CMD_DC_CLEAR_DISPLAY   0x08
-#define CMD_DC_NORMAL_MODE     0x0C
-#define CMD_DC_FILL_DISPLAY    0x09
-#define CMD_DC_INVERT_VIDEO    0x0D
-#define CMD_FS_HORIZONTAL_MODE 0x00
-#define CMD_FS_VERTICAL_MODE   0x02
-#define CMD_FS_BASIC_MODE      0x00
-#define CMD_FS_EXTENDED_MODE   0x01
-#define CMD_FS_ACTIVE_MODE     0x00
-#define CMD_FS_POWER_DOWN_MODE 0x04
-// H = 1 - Extended instructions
-#define CMD_TC_TEMP_0          0x04
-#define CMD_TC_TEMP_1          0x05
-#define CMD_TC_TEMP_2          0x06
-#define CMD_TC_TEMP_3          0x07
-#define CMD_BI_MUX_24          0x15
-#define CMD_BI_MUX_48          0x13
-#define CMD_BI_MUX_100         0x10
-#define CMD_VOP_6V06           0xB2
-#define CMD_VOP_7V38           0xC8
-
+ 
 // number of pixels on display
 #define WIDTH 84
 #define HEIGHT 48
 #define BANKS 6
-
+ 
 /// Fill types for 2D shapes
 enum FillType {
     FILL_TRANSPARENT, ///< Transparent with outline
     FILL_BLACK,       ///< Filled black
     FILL_WHITE,       ///< Filled white (no outline)
 };
-
+ 
 /** N5110 Class
 @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).
@@ -46,36 +22,59 @@
 @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.3
-
+ 
 @author Craig A. Evans
 @date   7th February 2017
-
+ 
 @code
-
+ 
 #include "mbed.h"
 #include "N5110.h"
-
+ 
+//      rows,cols
+int sprite[8][5] =   {
+    { 0,0,1,0,0 },
+    { 0,1,1,1,0 },
+    { 0,0,1,0,0 },
+    { 0,1,1,1,0 },
+    { 1,1,1,1,1 },
+    { 1,1,1,1,1 },
+    { 1,1,0,1,1 },
+    { 1,1,0,1,1 },
+};
+ 
 //    VCC,SCE,RST,D/C,MOSI,SCLK,LED
 //N5110 lcd(p7,p8,p9,p10,p11,p13,p21);  // LPC1768 - pwr from GPIO
-N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);  // K64F - pwr from 3V3
-
+N5110 lcd(p8,p9,p10,p11,p13,p21);  // LPC1768 - powered from +3V3 - JP1 in 2/3 position
+//N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);  // K64F - pwr from 3V3
+ 
 int main()
 {
     // first need to initialise display
     lcd.init();
-
+    
+    // change set contrast in range 0.0 to 1.0
+    // 0.4 appears to be a good starting point
+    lcd.setContrast(0.4);
+ 
     while(1) {
-
+ 
         // these are default settings so not strictly needed
         lcd.normalMode();      // normal colour mode
         lcd.setBrightness(0.5); // put LED backlight on 50%
-
+ 
+        lcd.clear();
+        // x origin, y origin, rows, cols, sprite
+        lcd.drawSprite(20,6,8,5,(int *)sprite);
+        lcd.refresh();
+        wait(5.0);
+ 
         lcd.clear(); // clear buffer at start of every loop
         // can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
         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
@@ -84,69 +83,67 @@
         // it is important the format specifier ensures the length will fit in the buffer
         if (length <= 14)  // if string will fit on display (assuming printing at x=0)
             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 at specified place
         lcd.printChar('X',5,3);
-
+ 
         // 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,true);
         }
         // need to refresh display after setting pixels or writing strings
         lcd.refresh();
         wait(5.0);
-
+ 
         // can check status of pixel using getPixel(x,y);
         lcd.clear();  // clear buffer
-        lcd.setPixel(2,2);  // set random pixel in buffer
+        lcd.setPixel(2,2,true);  // set random pixel in buffer
         lcd.refresh();
         wait(1.0);
-
+ 
         int pixel_to_test = lcd.getPixel(2,2);
-
-        printf("2,2 Pixel value = %i\n",pixel_to_test);
-
+ 
         if ( pixel_to_test ) {
             lcd.printString("2,2 is set",0,4);
         }
-
+ 
         // this one shouldn't be set
+        lcd.setPixel(3,3,false);  // clear random pixel in buffer
+        lcd.refresh();
         pixel_to_test = lcd.getPixel(3,3);
-
-        printf("3,3 Pixel value = %i\n",pixel_to_test);
-
+ 
         if ( pixel_to_test == 0 ) {
             lcd.printString("3,3 is clear",0,5);
         }
-
+ 
         lcd.refresh();
         wait(4.0);
-
+ 
         lcd.clear();            // clear buffer
         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);
         }
-
+ 
         // can also plot graphs - 84 elements only
         // values must be in range 0.0 - 1.0
         lcd.plotArray(array);
         lcd.refresh();
         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
@@ -154,8 +151,8 @@
         }
         lcd.refresh();  // refresh after drawing shapes
         wait(5.0);
-
-
+ 
+ 
         lcd.clear();
         // example of how to draw circles
         lcd.drawCircle(WIDTH/2,HEIGHT/2,20,FILL_BLACK);  // x,y,radius,black fill
@@ -163,18 +160,20 @@
         lcd.drawCircle(WIDTH/2,HEIGHT/2,30,FILL_TRANSPARENT);  // x,y,radius,transparent with outline
         lcd.refresh();  // refresh after drawing shapes
         wait(5.0);
-
+ 
         lcd.clear();
         // example of how to draw rectangles
         //          origin x,y,width,height,type
         lcd.drawRect(10,10,50,30,FILL_BLACK);  // filled black rectangle
         lcd.drawRect(15,15,20,10,FILL_WHITE);  // filled white rectange (no outline)
-        lcd.drawRect(2,2,70,40,  FILL_TRANSPARENT);    // transparent, just outline
+        lcd.drawRect(2,2,70,40,FILL_TRANSPARENT);    // transparent, just outline
         lcd.refresh();  // refresh after drawing shapes
         wait(5.0);
+ 
     }
 }
-
+ 
+ 
 @endcode
 */
 class N5110
@@ -187,10 +186,10 @@
     DigitalOut  *_sce;
     DigitalOut  *_rst;
     DigitalOut  *_dc;
-
+ 
 // variables
     unsigned char buffer[84][6];  // screen buffer - the 6 is for the banks - each one is 8 bits;
-
+ 
 public:
     /** Create a N5110 object connected to the specified pins
     *
@@ -210,7 +209,7 @@
           PinName const mosiPin,
           PinName const sclkPin,
           PinName const ledPin);
-
+ 
     /** Create a N5110 object connected to the specified pins (Vcc to +3V3)
     *
     * @param sce  Pin connected to chip enable (pin 3)
@@ -227,49 +226,54 @@
           PinName const mosiPin,
           PinName const sclkPin,
           PinName const ledPin);
-
+ 
     /**
      * Free allocated memory when object goes out of scope
      */
     ~N5110();
-
+ 
     /** 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();
-
+ 
     /** Clear
     *
     *   Clears the screen buffer.
     */
     void clear();
-
+ 
+    /** Set screen constrast
+    *   @param constrast - float in range 0.0 to 1.0 (0.40 to 0.60 is usually a good value)
+    */
+    void setContrast(float contrast);
+    
     /** 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 const brightness);
-
+ 
     /** Print String
     *
     *   Prints a string of characters to the screen buffer. String is cut-off after the 83rd pixel.
@@ -279,7 +283,7 @@
     void printString(char const         *str,
                      unsigned int const  x,
                      unsigned int const  y);
-
+ 
     /** Print Character
     *
     *   Sends a character to the screen buffer.  Printed at the specified location. Character is cut-off after the 83rd pixel.
@@ -290,25 +294,35 @@
     void printChar(char const         c,
                    unsigned int const x,
                    unsigned int const y);
-
-    /** Set a Pixel
+ 
+    /**
+    * @brief Set a Pixel
     *
-    *   This function sets a pixel in the screen buffer.
-    *   @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 x     The x co-ordinate of the pixel (0 to 83)
+    * @param y     The y co-ordinate of the pixel (0 to 47)
+    * @param state The state of the pixel [true=black (default), false=white]
+    *
+    * @details This function sets the state of a pixel in the screen buffer.
+    *          The third parameter can be omitted,
     */
     void setPixel(unsigned int const x,
-                  unsigned int const y);
-
-    /** Clear a Pixel
+                  unsigned int const y,
+                  bool const         state = true);
+ 
+    /**
+    *  @brief Clear a Pixel
     *
-    *   This function clears pixel in the screen buffer
     *   @param  x - the x co-ordinate of the pixel (0 to 83)
     *   @param  y - the y co-ordinate of the pixel (0 to 47)
+    *
+    *   @details This function clears pixel in the screen buffer
+    *
+    *   @deprecated Use setPixel(x, y, false) instead
     */
     void clearPixel(unsigned int const x,
-                    unsigned int const y);
-
+                    unsigned int const y)
+    __attribute__((deprecated("Use setPixel(x,y,false) instead")));
+ 
     /** Get a Pixel
     *
     *   This function gets the status of a pixel in the screen buffer.
@@ -320,13 +334,13 @@
     */
     int getPixel(unsigned int const x,
                  unsigned int const y) const;
-
+ 
     /** Refresh display
     *
     *   This functions sends the screen buffer to the display.
     */
     void refresh();
-
+ 
     /** Randomise buffer
     *
     *   This function fills the buffer with random data.  Can be used to test the display.
@@ -335,14 +349,14 @@
     *   TODO: Randomise the seed - maybe using the noise on the AnalogIn pins.
     */
     void randomiseBuffer();
-
+ 
     /** Plot Array
     *
     *   This function plots a one-dimensional array in the buffer.
     *   @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 const array[]);
-
+ 
     /** Draw Circle
     *
     *   This function draws a circle at the specified origin with specified radius in the screen buffer
@@ -357,7 +371,7 @@
                     unsigned int const y0,
                     unsigned int const radius,
                     FillType const     fill);
-
+ 
     /** Draw Line
     *
     *   This function draws a line between the specified points using linear interpolation.
@@ -372,7 +386,7 @@
                   unsigned int const x1,
                   unsigned int const y1,
                   unsigned int const type);
-
+ 
     /** Draw Rectangle
     *
     *   This function draws a rectangle.
@@ -387,7 +401,23 @@
                   unsigned int const width,
                   unsigned int const height,
                   FillType const     fill);
-
+ 
+    /** Draw Sprite
+    *
+    *   This function draws a sprite as defined in a 2D array
+    *   @param  x0 - x-coordinate of origin (top-left)
+    *   @param  y0 - y-coordinate of origin (top-left)
+    *   @param  nrows - number of rows in sprite
+    *   @param  ncols - number of columns in sprite
+    *   @param  sprite - 2D array representing the sprite
+    */
+    void drawSprite(int x0,
+                    int y0,
+                    int nrows,
+                    int ncols,
+                    int *sprite);
+ 
+ 
 private:
 // methods
     void setXYAddress(unsigned int const x,
@@ -398,8 +428,10 @@
     void clearRAM();
     void sendCommand(unsigned char command);
     void sendData(unsigned char data);
+    void setTempCoefficient(char tc);  // 0 to 3
+    void setBias(char bias);  // 0 to 7
 };
-
+ 
 const unsigned char font5x7[480] = {
     0x00, 0x00, 0x00, 0x00, 0x00,// (space)
     0x00, 0x00, 0x5F, 0x00, 0x00,// !
@@ -498,5 +530,6 @@
     0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
     0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
 };
-
-#endif
\ No newline at end of file
+ 
+#endif
+            
\ No newline at end of file