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
Revision 4:0a17a8a82c4c, committed 2014-01-26
- 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 |
diff -r ea0c085881f3 -r 0a17a8a82c4c NokiaLCD.cpp --- 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);
diff -r ea0c085881f3 -r 0a17a8a82c4c NokiaLCD.h --- 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;