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

Fork of N5110 by Craig Evans

Revision:
34:626b873e6362
Parent:
30:11986573659e
Parent:
29:5bc91bd44c77
diff -r 11986573659e -r 626b873e6362 N5110.cpp
--- 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