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 GraphicsDisplay

Fork of the UniGraphic-Library for monochrome LCDs with ST7920 controller and 128x64-IIC-OLED-Display with SH1106-Controller

/media/uploads/charly/20170522_210344.jpg

/media/uploads/charly/20180425_230623.jpg

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:
34:a9648877491f
Child:
35:b8d3f1e68000
diff -r f87f06292637 -r a9648877491f Inits/ST7920.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Inits/ST7920.cpp	Sat May 20 21:12:05 2017 +0000
@@ -0,0 +1,272 @@
+/* mbed UniGraphic library - Device specific class
+* Copyright (c) 2015 Giuliano Dianda
+* Released under the MIT License: http://mbed.org/license/mit
+*/
+#include "Protocols.h"
+#include "ST7920.h"
+
+/*this is a quite standard config for ST7920 and similars*/
+
+//////////////////////////////////////////////////////////////////////////////////
+// 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
+
+
+
+ST7920::ST7920(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char *name, unsigned int LCDSIZE_X, unsigned  int LCDSIZE_Y)
+    : LCD(displayproto, port, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
+{
+    hw_reset();
+    BusEnable(true);
+    init();
+    cls();
+    set_orientation(1);
+    locate(0,0);
+}
+ST7920::ST7920(proto_t displayproto, PinName* buspins, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char *name, unsigned int LCDSIZE_X, unsigned  int LCDSIZE_Y)
+    : LCD(displayproto, buspins, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
+{
+    hw_reset();
+    BusEnable(true);
+    init();
+    cls();
+    set_orientation(1);
+    locate(0,0);
+}
+ST7920::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, unsigned  int LCDSIZE_Y)
+    : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
+{
+    hw_reset();
+    BusEnable(true);
+    init();
+    cls();
+    set_orientation(1);
+    locate(0,0);
+}
+
+//WriteInstructionRegister IR
+void ST7920::wir(unsigned char data)
+{
+
+    /*
+    Timing Diagram of Serial Mode Data Transfer on p.20
+
+    |-------------------|------------------------|------------------------|
+    |  Synchronizing    | 1-st Byte Higher data  |  2-nd Byte Lower data  |
+    |-------------------|------------------------|------------------------|
+    | 1 1 1 1 1 RW RS 0 | D7 D6 D5 D4  0  0  0  0| D3 D2 D1 D0  0  0  0  0|
+    |-------------------|------------------------|------------------------|
+    */
+
+    wr_data8(0xf8);        // Sync.    - 1  1  1  1  1  0  0  0  RW=0,RS=0
+    wr_data8(data & 0xf0); // HighData - D7 D6 D5 D4 0  0  0  0
+    wr_data8(data << 4);   // LowData  - D3 D2 D1 D0 0  0  0  0
+    if (data == 0x01) {
+        // Display Clear
+        wait_ms(1.6);
+    } else {
+        //everything else
+        wait_us(72);
+    }
+}
+
+//WriteDataRegister DR
+void ST7920::wdr(unsigned char data)
+{
+    wr_data8(0xfa);        // Sync.    - 1  1  1  1  1  0  1  0 RW=0 RS=1
+    wr_data8(data & 0xf0); // HighData - D7 D6 D5 D4 0  0  0  0
+    wr_data8(data << 4);   // LowData  - D3 D2 D1 D0 0  0  0  0
+    wait_us(72);
+}
+
+
+// reset and init the lcd controller
+// init sequence is manufacturer specific
+void ST7920::init()
+{
+    /* Start Initial Sequence ----------------------------------------------------*/
+    wait_ms(40);
+
+    //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
+    //  0  0   0   0   1  DL   X  RE   0   0
+    // DisplayClear
+    wir(0x01);
+    // ReturnHome
+    wir(0x02);
+    // FunctionSet: BasicIR
+    wir(0x30);
+    // FunctionSet: ExtendedIR
+    //wir(0x34);
+
+    //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
+    //  0  0   0   0   1  DL   X  RE   0   0
+    //
+    // ExtFunctionSet Display OFF
+    //wir(0x30);
+
+    // DisplayControl [D=1: Display ON; C=1: Cursor ON; B=1: Character Blink ON]
+    // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+    //  0  0   0   0   0   0   1   D   C   B
+    // DisplayControl: Display ON CharacterBlink ON Cursor=On
+    //wir(0x0f);
+    // DisplayControl: Display ON CharacterBlink OFF Cursor=Off
+    wir(0x0c);
+
+    // Display Clear
+    wir(0x01);
+    //wait_ms(10);
+    //Set cursor position and display shift when doing write or read operation
+    // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+    //  0  0   0   0   0   0   0   1 I/D   S
+    // EntryModeSet: Increase, Shift right
+    wir(0x06);
+
+}
+
+void ST7920::mirrorXY(mirror_t mode)
+{
+}
+
+void ST7920::cls(void)
+{
+    //DisplayClear
+    wir(0x01);
+    //ReturnHome
+    wir(0x02);
+    
+    memset(buffer,0x00,sizeX()*(sizeY()>>3));  // clear display buffer
+}
+
+void ST7920::copy_to_lcd(void)
+{
+    int i,j;
+
+    // Change to Extended InstructionSet
+    //FunctionSet: Extended
+    wir(0x36);
+    for(i=0; i<32; i++) { //32 Doppelzeilen
+        // SetGDRAM-Adress AC: 0
+        //Vertical-Adr
+        wir(0x80+i);
+        //Horizontal-Adr
+        wir(0x80);
+
+        //write 16 Double-Bytes of data
+        //upper part
+        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
+        for (j=0; j<8; j++) {
+            wdr(buffer[(i*16)+512 + (j*2)]);
+            wdr(buffer[(i*16)+512 + (j*2) +1]);
+            //if (i==31) {wdr(0xAA); wdr(0xAA);}else {wdr(0x00); wdr(0x00);};
+        }
+        
+
+        /*
+        //obere Displayhälfte
+        wdr(0xFF);
+        wdr(0x00);
+        wdr(0x00);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xFF);
+
+        //Zeile fertig
+
+        // untere Displayhälfte
+
+        wdr(0x00);
+        wdr(0x00);
+        wdr(0xFF);
+        wdr(0xFF);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0xAA);
+        wdr(0xF0);
+        wdr(0x00);
+        wdr(0xFF);
+        */
+    }
+
+    //back to BasicInstructionSet
+    wir(0x30);
+
+}
+
+void ST7920::set_contrast(int o)
+{
+}
+
+void ST7920::invert(unsigned char o)
+{
+}
+
+void ST7920::wr_grambuf(unsigned short* data, unsigned int lenght)
+{
+}
+
+void ST7920::wr_gram(unsigned short data)
+{
+}
+
+void ST7920::wr_gram(unsigned short data, unsigned int count)
+{
+}
+
+void ST7920::wr_data16(unsigned short data)
+{
+}
+
+void ST7920::wr_cmd16(unsigned short cmd)
+{
+}
+
+void ST7920::wr_cmd8(unsigned char cmd)
+{
+}
+
+unsigned short ST7920::rd_gram(bool convert)
+{
+    return(0);
+}
+
+unsigned int ST7920::rd_reg_data32(unsigned char reg)
+{
+    return(0);
+}
+
+unsigned int ST7920::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd)
+{
+    return(0);
+}
\ No newline at end of file