UniGraphic-Fork for ST7920-LCD-controller and SH1106. Tested with 128x64 LCD with SPI and 128x64-OLED with IIC
Dependents: UniGraphic-St7920-Test AfficheurUTILECO
Fork of UniGraphic by
Fork of the UniGraphic-Library for monochrome LCDs with ST7920 controller and 128x64-IIC-OLED-Display with SH1106-Controller
Had to adapt LCD for following reasons:
- Give access to screenbuffer buffer[] to parent class
- pixel() and pixel_read() as they are hardware-dependent
- added reset-pin to IIC-Interface
GraphicDisplay:: sends buffer to LCD when auto_update is set to true.
Testprogram for ST7920 can be found here:
https://developer.mbed.org/users/charly/code/UniGraphic-St7920-Test/
Revision 35:b8d3f1e68000, committed 2017-05-21
- Comitter:
- charly
- Date:
- Sun May 21 20:50:09 2017 +0000
- Parent:
- 34:a9648877491f
- Child:
- 36:668396f861d2
- Commit message:
- buitify
Changed in this revision
--- a/Display/LCD.cpp Sat May 20 21:12:05 2017 +0000 +++ b/Display/LCD.cpp Sun May 21 20:50:09 2017 +0000 @@ -93,7 +93,6 @@ set_auto_up(true); tftID=0; // locate(0,0); - } LCD::LCD(proto_t displayproto, int Hz, int address, PinName sda, PinName scl, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char* name) : GraphicsDisplay(name), screensize_X(lcdsize_x), screensize_Y(lcdsize_y), _LCDPAGES(lcdsize_y>>3), _IC_X_SEGS(ic_x_segs), _IC_Y_COMS(ic_y_coms), _IC_PAGES(ic_y_coms>>3) @@ -290,14 +289,9 @@ // first check parameter if((x >= screensize_X) || (y >= screensize_Y)) return; - //if(color) buffer[(x + ((y>>3)*screensize_X))^1] &= ~(1 << (y&7)); // erase pixel - //else buffer[(x + ((y>>3)*screensize_X))^1] |= (1 << (y&7)); //Black=0000, set pixel - - //if(color) buffer[(x + y*16)] &= ~(1 << (7-(x&7))); // erase pixel - //else buffer[(x + y*16)] |= (1 << (7-(x&7))); //Black=0000, set pixel - - if (color) {buffer[(x>>3)+(y*16)]&= ~(1 << (7-(x&7)));} - else {buffer[(x>>3)+(y*16)]|= (1 << (7-(x&7)));} + + if (color) {buffer[(x>>3)+(y*_IC_X_SEGS>>4)]&= ~(1 << (7-(x&7)));} + else {buffer[(x>>3)+(y*_IC_X_SEGS>>4)]|= (1 << (7-(x&7)));} //buffer[0]=0xFF; //buffer[16]=0xAA; @@ -310,7 +304,8 @@ // first check parameter if((x >= screensize_X) || (y >= screensize_Y)) return 0; - if((buffer[(x + ((y>>3)*screensize_X))^1] & (1 << (y&7)))==0) return 0xFFFF ; // pixel not set, White + + if((buffer[(x>>3)+(y*_IC_X_SEGS>>4)] & (1 << (7-(x&7))))==0) return 0xFFFF ; // pixel not set, White else return 0; // pixel set, Black } void LCD::copy_to_lcd(void)
--- a/Graphics/GraphicsDisplay.cpp Sat May 20 21:12:05 2017 +0000 +++ b/Graphics/GraphicsDisplay.cpp Sun May 21 20:50:09 2017 +0000 @@ -465,7 +465,10 @@ } void GraphicsDisplay::set_auto_up(bool up) { - if(up) auto_up = true; + if(up) { + auto_up = true; + copy_to_lcd(); + } else auto_up = false; } bool GraphicsDisplay::get_auto_up(void)
--- a/Inits/ST7920.cpp Sat May 20 21:12:05 2017 +0000 +++ b/Inits/ST7920.cpp Sun May 21 20:50:09 2017 +0000 @@ -1,4 +1,5 @@ /* mbed UniGraphic library - Device specific class +* for ST7920 by Karl Zweimueller https://developer.mbed.org/users/charly/ * Copyright (c) 2015 Giuliano Dianda * Released under the MIT License: http://mbed.org/license/mit */ @@ -10,14 +11,9 @@ ////////////////////////////////////////////////////////////////////////////////// // display settings /////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// -//#define IC_X_SEGS 132 // ST7920 SEG has range 0-131 (131-0 if ADC=1), check your datasheet, important for the orientation -//#define IC_Y_COMS 64 // ST7920 COM has range 0-63 (63-0 if SHL=1), check your datasheet, important for the orientation -#define IC_X_SEGS 256 // ST7920 SEG has range 0-131 (131-0 if ADC=1), check your datasheet, important for the orientation -#define IC_Y_COMS 32 // ST7920 COM has range 0-63 (63-0 if SHL=1), check your datasheet, important for the orientation - -// put in constructor -//#define LCDSIZE_X 128 // display X pixels -//#define LCDSIZE_Y 64 // display Y pixels +#define IC_X_SEGS 256 // ST7920 SEG has range 64-256 +#define IC_Y_COMS 32 // ST7920 COM has 32 COMS fix +// see ST7920_v4.0 page 1/49 @@ -88,13 +84,16 @@ } -// reset and init the lcd controller +// init the lcd controller // init sequence is manufacturer specific void ST7920::init() { /* Start Initial Sequence ----------------------------------------------------*/ wait_ms(40); + // this is for a 128x64 LCD with SPI. + // parallel-mode not implemented! + //Function set [DL=1 8-bit interface; DL=0 4-bit interface; // RE=1: extended instruction; RE=0: basic instruction] // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 @@ -137,6 +136,7 @@ void ST7920::mirrorXY(mirror_t mode) { + //not supported by hardware } void ST7920::cls(void) @@ -149,6 +149,7 @@ memset(buffer,0x00,sizeX()*(sizeY()>>3)); // clear display buffer } +// write the full screenbuffer to the LCD GDRAM void ST7920::copy_to_lcd(void) { int i,j; @@ -164,13 +165,13 @@ wir(0x80); //write 16 Double-Bytes of data - //upper part + //upper part of Display for (j=0; j<8; j++) { wdr(buffer[(i*16) + (j*2)]); wdr(buffer[(i*16) + (j*2) +1]); //if (i==0) {wdr(0xAA); wdr(0xAA);}else {wdr(0x00); wdr(0x00);}; } - //lower part + //lower part of Display for (j=0; j<8; j++) { wdr(buffer[(i*16)+512 + (j*2)]); wdr(buffer[(i*16)+512 + (j*2) +1]); @@ -226,47 +227,58 @@ void ST7920::set_contrast(int o) { + //not supported by hardware } void ST7920::invert(unsigned char o) { + //not supported by hardware } void ST7920::wr_grambuf(unsigned short* data, unsigned int lenght) { + // not needed, not supported } void ST7920::wr_gram(unsigned short data) { + // not needed, not supported } void ST7920::wr_gram(unsigned short data, unsigned int count) { + // not needed, not supported } void ST7920::wr_data16(unsigned short data) { + // not needed, not supported } void ST7920::wr_cmd16(unsigned short cmd) { + // not needed, not supported } void ST7920::wr_cmd8(unsigned char cmd) { + // not needed, not supported } unsigned short ST7920::rd_gram(bool convert) { + // not needed, not supported return(0); } unsigned int ST7920::rd_reg_data32(unsigned char reg) { + // not needed, not supported return(0); } unsigned int ST7920::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd) { + // not needed, not supported return(0); } \ No newline at end of file
--- a/Inits/ST7920.h Sat May 20 21:12:05 2017 +0000 +++ b/Inits/ST7920.h Sun May 21 20:50:09 2017 +0000 @@ -5,6 +5,7 @@ #include "LCD.h" /** Class for ST7920 and similar display controllers +* for Controller-details see http://www.alldatasheet.com/datasheet-pdf/pdf/326219/SITRONIX/ST7920.html * to be copypasted and adapted for other controllers */ class ST7920 : public LCD @@ -21,8 +22,8 @@ * @param WR pin connected to SDI of display * @param RD pin connected to RS of display * @param name The name used by the parent class to access the interface - * @param LCDSIZE_X x size in pixel - optional - * @param LCDSIZE_Y y size in pixel - optional + * @param LCDSIZE_X x size in pixel + * @param LCDSIZE_Y y size in pixel */ ST7920(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char* name, unsigned int LCDSIZE_X = 132, unsigned int LCDSIZE_Y = 64); @@ -35,8 +36,8 @@ * @param WR pin connected to SDI of display * @param RD pin connected to RS of display * @param name The name used by the parent class to access the interface - * @param LCDSIZE_X x size in pixel - optional - * @param LCDSIZE_Y y size in pixel - optional + * @param LCDSIZE_X x size in pixel + * @param LCDSIZE_Y y size in pixel */ ST7920(proto_t displayproto, PinName* buspins, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char* name, unsigned int LCDSIZE_X = 132, unsigned int LCDSIZE_Y = 64); @@ -50,8 +51,8 @@ * @param reset pin connected to RESET of display * @param DC pin connected to data/command of display * @param name The name used by the parent class to access the interface - * @param LCDSIZE_X x size in pixel - optional - * @param LCDSIZE_Y y size in pixel - optional + * @param LCDSIZE_X x size in pixel + * @param LCDSIZE_Y y size in pixel */ ST7920(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char* name, unsigned int LCDSIZE_X = 132, unsigned int LCDSIZE_Y = 64); @@ -71,33 +72,47 @@ public: /** Mirror + // not needed, not supported */ virtual void mirrorXY(mirror_t mode); + // Clear Screen virtual void cls(void); + //Copy screenbuffer to LCD virtual void copy_to_lcd(void); + //not supported by hardware virtual void set_contrast(int o); + //not supported by hardware void invert(unsigned char o); + //not supported by hardware virtual void wr_grambuf(unsigned short* data, unsigned int lenght); + //not supported by hardware virtual void wr_gram(unsigned short data); + //not supported by hardware virtual void wr_gram(unsigned short data, unsigned int count); + //not supported by hardware virtual void wr_data16(unsigned short data); + //not supported by hardware virtual void wr_cmd16(unsigned short cmd); + //not supported by hardware virtual void wr_cmd8(unsigned char cmd); + //not supported by hardware virtual unsigned short rd_gram(bool convert); + //not supported by hardware virtual unsigned int rd_reg_data32(unsigned char reg); + //not supported by hardware virtual unsigned int rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd); };