Yang Zhenye 201199680
Dependencies: mbed
Diff: N5110/N5110.h
- Revision:
- 5:fcad75e9b9e1
- Parent:
- 0:ac2868313b41
diff -r eb8dca1dc341 -r fcad75e9b9e1 N5110/N5110.h --- 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