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);
};
