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:
34:626b873e6362
Parent:
30:11986573659e
Parent:
29:5bc91bd44c77
--- a/N5110.cpp	Wed Feb 08 19:50:56 2017 +0000
+++ b/N5110.cpp	Wed Mar 01 14:41:31 2017 +0000
@@ -4,29 +4,40 @@
 // overloaded constructor includes power pin - LCD Vcc connected to GPIO pin
 // this constructor works fine with LPC1768 - enough current sourced from GPIO
 // to power LCD. Doesn't work well with K64F.
-N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
+N5110::N5110(PinName const pwrPin,
+             PinName const scePin,
+             PinName const rstPin,
+             PinName const dcPin,
+             PinName const mosiPin,
+             PinName const sclkPin,
+             PinName const ledPin)
 {
-    spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
     // set up pins as required
-    led = new PwmOut(ledPin);
-    pwr = new DigitalOut(pwrPin);
-    sce = new DigitalOut(scePin);
-    rst = new DigitalOut(rstPin);
-    dc = new DigitalOut(dcPin);
+    _spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
+    _led = new PwmOut(ledPin);
+    _pwr = new DigitalOut(pwrPin);
+    _sce = new DigitalOut(scePin);
+    _rst = new DigitalOut(rstPin);
+    _dc = new DigitalOut(dcPin);
 }
 
 // overloaded constructor does not include power pin - LCD Vcc must be tied to +3V3
 // Best to use this with K64F as the GPIO hasn't sufficient output current to reliably
 // drive the LCD.
-N5110::N5110(PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
+N5110::N5110(PinName const scePin,
+             PinName const rstPin,
+             PinName const dcPin,
+             PinName const mosiPin,
+             PinName const sclkPin,
+             PinName const ledPin)
 {
-    spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
     // set up pins as required
-    pwr = NULL;  // pwr not needed so null it to be safe
-    led = new PwmOut(ledPin);
-    sce = new DigitalOut(scePin);
-    rst = new DigitalOut(rstPin);
-    dc = new DigitalOut(dcPin);
+    _spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
+    _pwr = NULL;  // pwr not needed so null it to be safe
+    _led = new PwmOut(ledPin);
+    _sce = new DigitalOut(scePin);
+    _rst = new DigitalOut(rstPin);
+    _dc = new DigitalOut(dcPin);
 }
 
 // initialise function - powers up and sends the initialisation commands
@@ -69,8 +80,8 @@
 // function to power up the LCD and backlight - only works when using GPIO to power
 void N5110::turnOn()
 {
-    if (pwr != NULL) {
-        pwr->write(1);  // apply power
+    if (_pwr != NULL) {
+        _pwr->write(1);  // apply power
     }
 }
 
@@ -91,8 +102,8 @@
     wait_ms(10);
 
     // if we are powering the LCD using the GPIO then make it low to turn off
-    if (pwr != NULL) {
-        pwr->write(0);  // turn off power
+    if (_pwr != NULL) {
+        _pwr->write(0);  // turn off power
     }
 
 }
@@ -106,33 +117,32 @@
     if (brightness > 1.0f)
         brightness = 1.0f;
     // set PWM duty cycle
-    led->write(brightness);
+    _led->write(brightness);
 }
 
 
 // pulse the active low reset line
 void N5110::reset()
 {
-    rst->write(0);  // reset the LCD
-    rst->write(1);
+    _rst->write(0);  // reset the LCD
+    _rst->write(1);
 }
 
 // function to initialise SPI peripheral
 void N5110::initSPI()
 {
-    spi->format(8,1);    // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
-    spi->frequency(4000000);  // maximum of screen is 4 MHz
+    _spi->format(8,1);    // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
+    _spi->frequency(4000000);  // maximum of screen is 4 MHz
 }
 
 // send a command to the display
 void N5110::sendCommand(unsigned char command)
 {
-    dc->write(0);  // set DC low for command
-    sce->write(0); // set CE low to begin frame
-    spi->write(command);  // send command
-    dc->write(1);  // turn back to data by default
-    sce->write(1); // set CE high to end frame (expected for transmission of single byte)
-
+    _dc->write(0);  // set DC low for command
+    _sce->write(0); // set CE low to begin frame
+    _spi->write(command);  // send command
+    _dc->write(1);  // turn back to data by default
+    _sce->write(1); // set CE high to end frame (expected for transmission of single byte)
 }
 
 // send data to the display at the current XY address
@@ -140,26 +150,26 @@
 // be the default mode.
 void N5110::sendData(unsigned char data)
 {
-    sce->write(0);   // set CE low to begin frame
-    spi->write(data);
-    sce->write(1);  // set CE high to end frame (expected for transmission of single byte)
+    _sce->write(0);   // set CE low to begin frame
+    _spi->write(data);
+    _sce->write(1);  // set CE high to end frame (expected for transmission of single byte)
 }
 
 // this function writes 0 to the 504 bytes to clear the RAM
 void N5110::clearRAM()
 {
-    sce->write(0);  //set CE low to begin frame
+    _sce->write(0);  //set CE low to begin frame
     for(int i = 0; i < WIDTH * HEIGHT; i++) { // 48 x 84 bits = 504 bytes
-        spi->write(0x00);  // send 0's
+        _spi->write(0x00);  // send 0's
     }
-    sce->write(1); // set CE high to end frame
-
+    _sce->write(1); // set CE high to end frame
 }
 
 // function to set the XY address in RAM for subsequenct data write
-void N5110::setXYAddress(int x, int y)
+void N5110::setXYAddress(unsigned int const x,
+                         unsigned int const y)
 {
-    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+    if (x<WIDTH && y<HEIGHT) {  // check within range
         sendCommand(0x80 | x);  // send addresses to display with relevant mask
         sendCommand(0x40 | y);
     }
@@ -168,25 +178,28 @@
 // These functions are used to set, clear and get the value of pixels in the display
 // Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x).  The refresh()
 // function must be called after set and clear in order to update the display
-void N5110::setPixel(int x, int y)
+void N5110::setPixel(unsigned int const x,
+                     unsigned int const y)
 {
-    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+    if (x<WIDTH && y<HEIGHT) {  // check within range
         // calculate bank and shift 1 to required position in the data byte
         buffer[x][y/8] |= (1 << y%8);
     }
 }
 
-void N5110::clearPixel(int x, int y)
+void N5110::clearPixel(unsigned int const x,
+                       unsigned int const y)
 {
-    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+    if (x<WIDTH && y<HEIGHT) {  // check within range
         // calculate bank and shift 1 to required position (using bit clear)
         buffer[x][y/8] &= ~(1 << y%8);
     }
 }
 
-int N5110::getPixel(int x, int y)
+int N5110::getPixel(unsigned int const x,
+                    unsigned int const y) const
 {
-    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+    if (x<WIDTH && y<HEIGHT) {  // check within range
         // return relevant bank and mask required bit
 
         int pixel = (int) buffer[x][y/8] & (1 << y%8);
@@ -208,14 +221,14 @@
     // address auto increments after printing string, so buffer[0][0] will not coincide
     // with top-left pixel after priting string
 
-    sce->write(0);  //set CE low to begin frame
+    _sce->write(0);  //set CE low to begin frame
 
     for(int j = 0; j < BANKS; j++) {  // be careful to use correct order (j,i) for horizontal addressing
         for(int i = 0; i < WIDTH; i++) {
-            spi->write(buffer[i][j]);  // send buffer
+            _spi->write(buffer[i][j]);  // send buffer
         }
     }
-    sce->write(1); // set CE high to end frame
+    _sce->write(1); // set CE high to end frame
 
 }
 
@@ -233,9 +246,11 @@
 }
 
 // function to print 5x7 font
-void N5110::printChar(char c,int x,int y)
+void N5110::printChar(char const          c,
+                      unsigned int const  x,
+                      unsigned int const  y)
 {
-    if (y>=0 && y<BANKS) {  // check if printing in range of y banks
+    if (y<BANKS) {  // check if printing in range of y banks
 
         for (int i = 0; i < 5 ; i++ ) {
             int pixel_x = x+i;
@@ -244,14 +259,16 @@
             buffer[pixel_x][y] = font5x7[(c - 32)*5 + i];
             // array is offset by 32 relative to ASCII, each character is 5 pixels wide
         }
-        
+
     }
 }
 
 // function to print string at specified position
-void N5110::printString(const char * str,int x,int y)
+void N5110::printString(const char         *str,
+                        unsigned int const  x,
+                        unsigned int const  y)
 {
-    if (y>=0 && y<BANKS) {  // check if printing in range of y banks
+    if (y<BANKS) {  // check if printing in range of y banks
 
         int n = 0 ; // counter for number of characters in string
         // loop through string and print character
@@ -278,7 +295,7 @@
 }
 
 // function to plot array on display
-void N5110::plotArray(float array[])
+void N5110::plotArray(float const array[])
 {
     for (int i=0; i<WIDTH; i++) {  // loop through array
         // elements are normalised from 0.0 to 1.0, so multiply
@@ -290,7 +307,10 @@
 }
 
 // function to draw circle
-void N5110:: drawCircle(int x0,int y0,int radius,int fill)
+void N5110:: drawCircle(unsigned int const x0,
+                        unsigned int const y0,
+                        unsigned int const radius,
+                        unsigned int const fill)
 {
     // from http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
     int x = radius;
@@ -330,7 +350,11 @@
 
 }
 
-void N5110::drawLine(int x0,int y0,int x1,int y1,int type)
+void N5110::drawLine(unsigned int const x0,
+                     unsigned int const y0,
+                     unsigned int const x1,
+                     unsigned int const y1,
+                     unsigned int const type)
 {
     int y_range = y1-y0;  // calc range of y and x
     int x_range = x1-x0;
@@ -378,7 +402,11 @@
 
 }
 
-void N5110::drawRect(int x0,int y0,int width,int height,int fill)
+void N5110::drawRect(unsigned int const x0,
+                     unsigned int const y0,
+                     unsigned int const width,
+                     unsigned int const height,
+                     unsigned int const fill)
 {
     if (fill == 0) { // transparent, just outline
         drawLine(x0,y0,x0+(width-1),y0,1);  // top
@@ -391,4 +419,4 @@
             drawLine(x0,y,x0+(width-1),y,type);  // draw line across screen
         }
     }
-}
+}
\ No newline at end of file