This includes all known improvements from other people's spins on the Nokia library, including Alistair Popple's fix to the very poor contrast on newer LCD 6100 displays.

Fork of NokiaLCD by Iftekhar Choudhury

Files at this revision

API Documentation at this revision

Comitter:
plskeggs
Date:
Sun Jan 26 23:10:31 2014 +0000
Parent:
3:ea0c085881f3
Commit message:
Works with a Sparkfun LCD 6100. Includes all changes from other people's spins of the original Nokia library, including the latest from Alistar Popple that fixes the very poor contrast issue.

Changed in this revision

NokiaLCD.cpp Show annotated file Show diff for this revision Revisions of this file
NokiaLCD.h Show annotated file Show diff for this revision Revisions of this file
--- a/NokiaLCD.cpp	Tue Mar 05 18:52:17 2013 +0000
+++ b/NokiaLCD.cpp	Sun Jan 26 23:10:31 2014 +0000
@@ -10,9 +10,9 @@
 #define NOKIALCD_COLS 16
 #define NOKIALCD_WIDTH 130
 #define NOKIALCD_HEIGHT 132
-#define NOKIALCD_FREQUENCY 5000000
+#define NOKIALCD_FREQUENCY 1000000
 
-NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type)
+NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type, int contrast)
         : _spi(mosi, NC, sclk)
         , _rst(rst)
         , _cs(cs) {
@@ -23,11 +23,13 @@
     _column = 0;
     _foreground = 0x00FFFFFF;
     _background = 0x00000000;
+    _rows = NOKIALCD_ROWS;
+    _columns = NOKIALCD_COLS;
 
-    reset();
+    //reset(contrast);
 }
 
-void NokiaLCD::reset() {
+void NokiaLCD::reset(int contrast) {
 
     // setup the SPI interface and bring display out of reset
     _cs = 1;
@@ -43,7 +45,7 @@
     switch (_type) {
         case LCD6100:
             command(0xCA); // display control
-            data(0);
+            data(0xC);
             data(32);
             data(0);
             command(0xBB);
@@ -53,14 +55,14 @@
             command(0x20); // power control
             data(0x0F);
             command(0xA7); // invert display
-            command(0x81); // Voltage control
-            data(39);      // contrast setting: 0..63
-            data(3);       // resistance ratio
-            wait_ms(1);
-            command(0xBC);
+            command(0xBC); // data control
             data(0);
             data(1);
             data(4);
+            command(0x81); // Voltage control
+            data(contrast);// contrast setting: 0..63
+            data(3);       // 3 resistance ratio
+            wait_ms(10);    // allow power supply to stabilize
             command(0xAF);  // turn on the display
             break;
             
@@ -77,7 +79,7 @@
             data(0x0F);
             command(0xA7); // invert display
             command(0x81); // Voltage control
-            data(39);      // contrast setting: 0..63
+            data(contrast);// contrast setting: 0..63
             data(3);       // resistance ratio
             wait_ms(1);
             command(0xBC);
@@ -94,7 +96,7 @@
             command(0x36);  // madctl
             data(0x60);     // vertical RAM, flip x
             command(0x25);  // setcon
-            data(0x30);// contrast 0x30
+            data(contrast);// contrast 0x30
             wait_ms(2);
             command(0x29);//DISPON
             command(0x03);//BSTRON
@@ -337,6 +339,249 @@
     _cs = 1;
 }
 
+void NokiaLCD::circle(int x0, int y0, int r, int colour) {
+    int draw_x0, draw_y0;
+    int draw_x1, draw_y1;
+    int draw_x2, draw_y2;
+    int draw_x3, draw_y3;
+    int draw_x4, draw_y4;
+    int draw_x5, draw_y5;
+    int draw_x6, draw_y6;
+    int draw_x7, draw_y7;
+    int xx, yy;
+    int di;    
+ 
+    _cs = 0;
+    _window(x0, y0, 1, 1);
+ 
+    if(r == 0)          /* no radius */
+    {
+        return;
+    }
+ 
+    draw_x0 = draw_x1 = x0;
+    draw_y0 = draw_y1 = y0 + r;
+    if(draw_y0 < NOKIALCD_HEIGHT)
+    {
+        _window(draw_x0, draw_y0, 1, 1);
+        _putp(colour);     /* 90 degree */
+    }
+ 
+    draw_x2 = draw_x3 = x0;
+    draw_y2 = draw_y3 = y0 - r;
+    if(draw_y2 >= 0)
+    {
+        _window(draw_x2, draw_y2, 1, 1);
+        _putp(colour);    /* 270 degree */
+    }
+    
+    draw_x4 = draw_x6 = x0 + r;
+    draw_y4 = draw_y6 = y0;
+    if(draw_x4 < NOKIALCD_WIDTH)
+    {
+        _window(draw_x4, draw_y4, 1, 1);
+        _putp(colour);     /* 0 degree */
+    }    
+    
+    draw_x5 = draw_x7 = x0 - r;
+    draw_y5 = draw_y7 = y0;
+    if(draw_x5>=0)
+    {
+        _window(draw_x5, draw_y5, 1, 1);
+        _putp(colour);     /* 90 degree */     /* 180 degree */
+    }
+        
+    if(r == 1)
+    {
+        return;
+    }    
+    
+    di = 3 - 2*r;
+    xx = 0;
+    yy = r;
+    while(xx < yy)
+    {
+ 
+        if(di < 0)
+        {
+            di += 4*xx + 6;
+        }
+        else
+        {
+            di += 4*(xx - yy) + 10;
+            yy--;
+            draw_y0--;
+            draw_y1--;
+            draw_y2++;
+            draw_y3++;
+            draw_x4--;
+            draw_x5++;
+            draw_x6--;
+            draw_x7++;
+        }
+        xx++;
+        draw_x0++;
+        draw_x1--;
+        draw_x2++;
+        draw_x3--;
+        draw_y4++;
+        draw_y5++;
+        draw_y6--;
+        draw_y7--;
+ 
+        if( (draw_x0 <= NOKIALCD_WIDTH) && (draw_y0>=0) )
+        {
+            _window(draw_x0, draw_y0, 1, 1);
+            _putp(colour);
+        }
+ 
+        if( (draw_x1 >= 0) && (draw_y1 >= 0) )
+        {
+            _window(draw_x1, draw_y1, 1, 1);
+            _putp(colour);
+        }
+ 
+        if( (draw_x2 <= NOKIALCD_WIDTH) && (draw_y2 <= NOKIALCD_HEIGHT) )
+        {
+            _window(draw_x2, draw_y2, 1, 1);
+            _putp(colour);
+        }
+ 
+        if( (draw_x3 >=0 ) && (draw_y3 <= NOKIALCD_HEIGHT) )
+        {
+            _window(draw_x3, draw_y3, 1, 1);
+            _putp(colour);
+        }
+ 
+        if( (draw_x4 <= /*OLED_DISPLAY_HEIGHT*/NOKIALCD_WIDTH) && (draw_y4 >= 0) )
+        {
+            _window(draw_x4, draw_y4, 1, 1);
+            _putp(colour);
+        }
+ 
+        if( (draw_x5 >= 0) && (draw_y5 >= 0) )
+        {
+            _window(draw_x5, draw_y5, 1, 1);
+            _putp(colour);
+        }
+        if( (draw_x6 <= NOKIALCD_WIDTH) && (draw_y6 <= NOKIALCD_HEIGHT) )
+        {
+            _window(draw_x6, draw_y6, 1, 1);
+            _putp(colour);
+        }
+        if( (draw_x7 >= 0) && (draw_y7 <= NOKIALCD_HEIGHT) )
+        {
+            _window(draw_x7, draw_y7, 1, 1);
+            _putp(colour);
+        }
+    }
+    _cs = 1;
+    return;
+}
+ 
+void NokiaLCD::line(int x0, int y0, int x1, int y1, int colour) {
+    int   dx = 0, dy = 0;
+    int   dx_sym = 0, dy_sym = 0;
+    int   dx_x2 = 0, dy_x2 = 0;
+    int   di = 0;
+ 
+    _cs = 0;            // Chipselect the LCD. 
+ 
+    dx = x1-x0;
+    dy = y1-y0;
+ 
+ 
+    if(dx == 0)           /* vertical line */
+    {
+        for(int y=y0; y<y1; y++){
+            _window(x0, y, 1, 1);
+            _putp(colour);
+        }
+        return;
+    }
+ 
+    if(dx > 0)
+    {
+        dx_sym = 1;
+    }
+    else
+    {
+        dx_sym = -1;
+    }
+ 
+ 
+    if(dy == 0)           /* horizontal line */
+    {
+        for(int x=x0; x<x1; x++){
+            _window(x, y0, 1, 1);
+            _putp(colour);
+        }
+        return;
+    }
+ 
+ 
+    if(dy > 0)
+    {
+        dy_sym = 1;
+    }
+    else
+    {
+        dy_sym = -1;
+    }
+ 
+    dx = dx_sym*dx;
+    dy = dy_sym*dy;
+ 
+    dx_x2 = dx*2;
+    dy_x2 = dy*2;
+ 
+    if(dx >= dy)
+    {
+        di = dy_x2 - dx;
+        while(x0 != x1)
+        {
+ 
+            _window(x0, y0, 1, 1);
+            _putp(colour);
+            x0 += dx_sym;
+            if(di<0)
+            {
+                di += dy_x2;
+            }
+            else
+            {
+                di += dy_x2 - dx_x2;
+                y0 += dy_sym;
+            }
+        }
+        _window(x0, y0, 1, 1);
+        _putp(colour);
+    }
+    else
+    {
+        di = dx_x2 - dy;
+        while(y0 != y1)
+        {
+            _window(x0, y0, 1, 1);
+            _putp(colour);
+            y0 += dy_sym;
+            if(di < 0)
+            {
+                di += dx_x2;
+            }
+            else
+            {
+                di += dx_x2 - dy_x2;
+                x0 += dx_sym;
+            }
+        }
+        _window(x0, y0, 1, 1);
+        _putp(colour);
+    }
+    _cs = 1;
+    return;
+}
+
 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
     _cs = 0;
     _window(x, y, width, height);
--- a/NokiaLCD.h	Tue Mar 05 18:52:17 2013 +0000
+++ b/NokiaLCD.h	Sun Jan 26 23:10:31 2014 +0000
@@ -56,7 +56,7 @@
      * @param rst Reset (DigitalOut)
      * @param type The LCDType to select driver chip variants
      */
-    NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100);
+    NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100, int contrast = 39);
 
 #if DOXYGEN_ONLY
     /** Write a character to the LCD
@@ -100,6 +100,8 @@
      * @param colour 24-bit colour in format 0x00RRGGBB
      */    
     void fill(int x, int y, int width, int height, int colour);
+    void circle(int x0, int y0, int r, int colour);                 // Added this to create circles easy. 
+    void line(int x0, int y0, int x1, int y1, int colour);          // Added this to create lines easy. 
 
     void blit(int x, int y, int width, int height, const int* colour);
     void bitblit(int x, int y, int width, int height, const char* bitstream);
@@ -109,7 +111,7 @@
     int columns();
     int rows();
 
-    void reset();
+    void reset(int contrast);
 
     /** Set the foreground colour
      * 
@@ -122,7 +124,12 @@
      * @param c 24-bit colour
      */
     void background(int c);
-
+    
+    /** Move to the next line
+     *
+     */
+    void newline();
+    
 protected:
     virtual void _window(int x, int y, int width, int height);
     virtual void _putp(int colour);
@@ -130,7 +137,6 @@
     void command(int value);
     void data(int value);
 
-    void newline();
     virtual int _putc(int c);
     virtual int _getc() {
         return 0;