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/

Committer:
charly
Date:
Sat May 20 21:12:05 2017 +0000
Revision:
34:a9648877491f
Child:
35:b8d3f1e68000
First working Version with 128x64LCD with ST7920-COntroller;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 34:a9648877491f 1 /* mbed UniGraphic library - Device specific class
charly 34:a9648877491f 2 * Copyright (c) 2015 Giuliano Dianda
charly 34:a9648877491f 3 * Released under the MIT License: http://mbed.org/license/mit
charly 34:a9648877491f 4 */
charly 34:a9648877491f 5 #include "Protocols.h"
charly 34:a9648877491f 6 #include "ST7920.h"
charly 34:a9648877491f 7
charly 34:a9648877491f 8 /*this is a quite standard config for ST7920 and similars*/
charly 34:a9648877491f 9
charly 34:a9648877491f 10 //////////////////////////////////////////////////////////////////////////////////
charly 34:a9648877491f 11 // display settings ///////////////////////////////////////////////////////
charly 34:a9648877491f 12 /////////////////////////////////////////////////////////////////////////
charly 34:a9648877491f 13 //#define IC_X_SEGS 132 // ST7920 SEG has range 0-131 (131-0 if ADC=1), check your datasheet, important for the orientation
charly 34:a9648877491f 14 //#define IC_Y_COMS 64 // ST7920 COM has range 0-63 (63-0 if SHL=1), check your datasheet, important for the orientation
charly 34:a9648877491f 15 #define IC_X_SEGS 256 // ST7920 SEG has range 0-131 (131-0 if ADC=1), check your datasheet, important for the orientation
charly 34:a9648877491f 16 #define IC_Y_COMS 32 // ST7920 COM has range 0-63 (63-0 if SHL=1), check your datasheet, important for the orientation
charly 34:a9648877491f 17
charly 34:a9648877491f 18 // put in constructor
charly 34:a9648877491f 19 //#define LCDSIZE_X 128 // display X pixels
charly 34:a9648877491f 20 //#define LCDSIZE_Y 64 // display Y pixels
charly 34:a9648877491f 21
charly 34:a9648877491f 22
charly 34:a9648877491f 23
charly 34:a9648877491f 24 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)
charly 34:a9648877491f 25 : LCD(displayproto, port, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
charly 34:a9648877491f 26 {
charly 34:a9648877491f 27 hw_reset();
charly 34:a9648877491f 28 BusEnable(true);
charly 34:a9648877491f 29 init();
charly 34:a9648877491f 30 cls();
charly 34:a9648877491f 31 set_orientation(1);
charly 34:a9648877491f 32 locate(0,0);
charly 34:a9648877491f 33 }
charly 34:a9648877491f 34 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)
charly 34:a9648877491f 35 : LCD(displayproto, buspins, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
charly 34:a9648877491f 36 {
charly 34:a9648877491f 37 hw_reset();
charly 34:a9648877491f 38 BusEnable(true);
charly 34:a9648877491f 39 init();
charly 34:a9648877491f 40 cls();
charly 34:a9648877491f 41 set_orientation(1);
charly 34:a9648877491f 42 locate(0,0);
charly 34:a9648877491f 43 }
charly 34:a9648877491f 44 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)
charly 34:a9648877491f 45 : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
charly 34:a9648877491f 46 {
charly 34:a9648877491f 47 hw_reset();
charly 34:a9648877491f 48 BusEnable(true);
charly 34:a9648877491f 49 init();
charly 34:a9648877491f 50 cls();
charly 34:a9648877491f 51 set_orientation(1);
charly 34:a9648877491f 52 locate(0,0);
charly 34:a9648877491f 53 }
charly 34:a9648877491f 54
charly 34:a9648877491f 55 //WriteInstructionRegister IR
charly 34:a9648877491f 56 void ST7920::wir(unsigned char data)
charly 34:a9648877491f 57 {
charly 34:a9648877491f 58
charly 34:a9648877491f 59 /*
charly 34:a9648877491f 60 Timing Diagram of Serial Mode Data Transfer on p.20
charly 34:a9648877491f 61
charly 34:a9648877491f 62 |-------------------|------------------------|------------------------|
charly 34:a9648877491f 63 | Synchronizing | 1-st Byte Higher data | 2-nd Byte Lower data |
charly 34:a9648877491f 64 |-------------------|------------------------|------------------------|
charly 34:a9648877491f 65 | 1 1 1 1 1 RW RS 0 | D7 D6 D5 D4 0 0 0 0| D3 D2 D1 D0 0 0 0 0|
charly 34:a9648877491f 66 |-------------------|------------------------|------------------------|
charly 34:a9648877491f 67 */
charly 34:a9648877491f 68
charly 34:a9648877491f 69 wr_data8(0xf8); // Sync. - 1 1 1 1 1 0 0 0 RW=0,RS=0
charly 34:a9648877491f 70 wr_data8(data & 0xf0); // HighData - D7 D6 D5 D4 0 0 0 0
charly 34:a9648877491f 71 wr_data8(data << 4); // LowData - D3 D2 D1 D0 0 0 0 0
charly 34:a9648877491f 72 if (data == 0x01) {
charly 34:a9648877491f 73 // Display Clear
charly 34:a9648877491f 74 wait_ms(1.6);
charly 34:a9648877491f 75 } else {
charly 34:a9648877491f 76 //everything else
charly 34:a9648877491f 77 wait_us(72);
charly 34:a9648877491f 78 }
charly 34:a9648877491f 79 }
charly 34:a9648877491f 80
charly 34:a9648877491f 81 //WriteDataRegister DR
charly 34:a9648877491f 82 void ST7920::wdr(unsigned char data)
charly 34:a9648877491f 83 {
charly 34:a9648877491f 84 wr_data8(0xfa); // Sync. - 1 1 1 1 1 0 1 0 RW=0 RS=1
charly 34:a9648877491f 85 wr_data8(data & 0xf0); // HighData - D7 D6 D5 D4 0 0 0 0
charly 34:a9648877491f 86 wr_data8(data << 4); // LowData - D3 D2 D1 D0 0 0 0 0
charly 34:a9648877491f 87 wait_us(72);
charly 34:a9648877491f 88 }
charly 34:a9648877491f 89
charly 34:a9648877491f 90
charly 34:a9648877491f 91 // reset and init the lcd controller
charly 34:a9648877491f 92 // init sequence is manufacturer specific
charly 34:a9648877491f 93 void ST7920::init()
charly 34:a9648877491f 94 {
charly 34:a9648877491f 95 /* Start Initial Sequence ----------------------------------------------------*/
charly 34:a9648877491f 96 wait_ms(40);
charly 34:a9648877491f 97
charly 34:a9648877491f 98 //Function set [DL=1 8-bit interface; DL=0 4-bit interface;
charly 34:a9648877491f 99 // RE=1: extended instruction; RE=0: basic instruction]
charly 34:a9648877491f 100 // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
charly 34:a9648877491f 101 // 0 0 0 0 1 DL X RE 0 0
charly 34:a9648877491f 102 // DisplayClear
charly 34:a9648877491f 103 wir(0x01);
charly 34:a9648877491f 104 // ReturnHome
charly 34:a9648877491f 105 wir(0x02);
charly 34:a9648877491f 106 // FunctionSet: BasicIR
charly 34:a9648877491f 107 wir(0x30);
charly 34:a9648877491f 108 // FunctionSet: ExtendedIR
charly 34:a9648877491f 109 //wir(0x34);
charly 34:a9648877491f 110
charly 34:a9648877491f 111 //Function set [DL=1 8-bit interface; DL=0 4-bit interface;
charly 34:a9648877491f 112 // RE=1: extended instruction; RE=0: basic instruction]
charly 34:a9648877491f 113 // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
charly 34:a9648877491f 114 // 0 0 0 0 1 DL X RE 0 0
charly 34:a9648877491f 115 //
charly 34:a9648877491f 116 // ExtFunctionSet Display OFF
charly 34:a9648877491f 117 //wir(0x30);
charly 34:a9648877491f 118
charly 34:a9648877491f 119 // DisplayControl [D=1: Display ON; C=1: Cursor ON; B=1: Character Blink ON]
charly 34:a9648877491f 120 // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
charly 34:a9648877491f 121 // 0 0 0 0 0 0 1 D C B
charly 34:a9648877491f 122 // DisplayControl: Display ON CharacterBlink ON Cursor=On
charly 34:a9648877491f 123 //wir(0x0f);
charly 34:a9648877491f 124 // DisplayControl: Display ON CharacterBlink OFF Cursor=Off
charly 34:a9648877491f 125 wir(0x0c);
charly 34:a9648877491f 126
charly 34:a9648877491f 127 // Display Clear
charly 34:a9648877491f 128 wir(0x01);
charly 34:a9648877491f 129 //wait_ms(10);
charly 34:a9648877491f 130 //Set cursor position and display shift when doing write or read operation
charly 34:a9648877491f 131 // RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
charly 34:a9648877491f 132 // 0 0 0 0 0 0 0 1 I/D S
charly 34:a9648877491f 133 // EntryModeSet: Increase, Shift right
charly 34:a9648877491f 134 wir(0x06);
charly 34:a9648877491f 135
charly 34:a9648877491f 136 }
charly 34:a9648877491f 137
charly 34:a9648877491f 138 void ST7920::mirrorXY(mirror_t mode)
charly 34:a9648877491f 139 {
charly 34:a9648877491f 140 }
charly 34:a9648877491f 141
charly 34:a9648877491f 142 void ST7920::cls(void)
charly 34:a9648877491f 143 {
charly 34:a9648877491f 144 //DisplayClear
charly 34:a9648877491f 145 wir(0x01);
charly 34:a9648877491f 146 //ReturnHome
charly 34:a9648877491f 147 wir(0x02);
charly 34:a9648877491f 148
charly 34:a9648877491f 149 memset(buffer,0x00,sizeX()*(sizeY()>>3)); // clear display buffer
charly 34:a9648877491f 150 }
charly 34:a9648877491f 151
charly 34:a9648877491f 152 void ST7920::copy_to_lcd(void)
charly 34:a9648877491f 153 {
charly 34:a9648877491f 154 int i,j;
charly 34:a9648877491f 155
charly 34:a9648877491f 156 // Change to Extended InstructionSet
charly 34:a9648877491f 157 //FunctionSet: Extended
charly 34:a9648877491f 158 wir(0x36);
charly 34:a9648877491f 159 for(i=0; i<32; i++) { //32 Doppelzeilen
charly 34:a9648877491f 160 // SetGDRAM-Adress AC: 0
charly 34:a9648877491f 161 //Vertical-Adr
charly 34:a9648877491f 162 wir(0x80+i);
charly 34:a9648877491f 163 //Horizontal-Adr
charly 34:a9648877491f 164 wir(0x80);
charly 34:a9648877491f 165
charly 34:a9648877491f 166 //write 16 Double-Bytes of data
charly 34:a9648877491f 167 //upper part
charly 34:a9648877491f 168 for (j=0; j<8; j++) {
charly 34:a9648877491f 169 wdr(buffer[(i*16) + (j*2)]);
charly 34:a9648877491f 170 wdr(buffer[(i*16) + (j*2) +1]);
charly 34:a9648877491f 171 //if (i==0) {wdr(0xAA); wdr(0xAA);}else {wdr(0x00); wdr(0x00);};
charly 34:a9648877491f 172 }
charly 34:a9648877491f 173 //lower part
charly 34:a9648877491f 174 for (j=0; j<8; j++) {
charly 34:a9648877491f 175 wdr(buffer[(i*16)+512 + (j*2)]);
charly 34:a9648877491f 176 wdr(buffer[(i*16)+512 + (j*2) +1]);
charly 34:a9648877491f 177 //if (i==31) {wdr(0xAA); wdr(0xAA);}else {wdr(0x00); wdr(0x00);};
charly 34:a9648877491f 178 }
charly 34:a9648877491f 179
charly 34:a9648877491f 180
charly 34:a9648877491f 181 /*
charly 34:a9648877491f 182 //obere Displayhälfte
charly 34:a9648877491f 183 wdr(0xFF);
charly 34:a9648877491f 184 wdr(0x00);
charly 34:a9648877491f 185 wdr(0x00);
charly 34:a9648877491f 186 wdr(0xAA);
charly 34:a9648877491f 187 wdr(0xF0);
charly 34:a9648877491f 188 wdr(0xAA);
charly 34:a9648877491f 189 wdr(0xF0);
charly 34:a9648877491f 190 wdr(0xAA);
charly 34:a9648877491f 191 wdr(0xF0);
charly 34:a9648877491f 192 wdr(0xAA);
charly 34:a9648877491f 193 wdr(0xF0);
charly 34:a9648877491f 194 wdr(0xAA);
charly 34:a9648877491f 195 wdr(0xF0);
charly 34:a9648877491f 196 wdr(0xAA);
charly 34:a9648877491f 197 wdr(0xFF);
charly 34:a9648877491f 198
charly 34:a9648877491f 199 //Zeile fertig
charly 34:a9648877491f 200
charly 34:a9648877491f 201 // untere Displayhälfte
charly 34:a9648877491f 202
charly 34:a9648877491f 203 wdr(0x00);
charly 34:a9648877491f 204 wdr(0x00);
charly 34:a9648877491f 205 wdr(0xFF);
charly 34:a9648877491f 206 wdr(0xFF);
charly 34:a9648877491f 207 wdr(0xAA);
charly 34:a9648877491f 208 wdr(0xF0);
charly 34:a9648877491f 209 wdr(0xAA);
charly 34:a9648877491f 210 wdr(0xF0);
charly 34:a9648877491f 211 wdr(0xAA);
charly 34:a9648877491f 212 wdr(0xF0);
charly 34:a9648877491f 213 wdr(0xAA);
charly 34:a9648877491f 214 wdr(0xF0);
charly 34:a9648877491f 215 wdr(0xAA);
charly 34:a9648877491f 216 wdr(0xF0);
charly 34:a9648877491f 217 wdr(0x00);
charly 34:a9648877491f 218 wdr(0xFF);
charly 34:a9648877491f 219 */
charly 34:a9648877491f 220 }
charly 34:a9648877491f 221
charly 34:a9648877491f 222 //back to BasicInstructionSet
charly 34:a9648877491f 223 wir(0x30);
charly 34:a9648877491f 224
charly 34:a9648877491f 225 }
charly 34:a9648877491f 226
charly 34:a9648877491f 227 void ST7920::set_contrast(int o)
charly 34:a9648877491f 228 {
charly 34:a9648877491f 229 }
charly 34:a9648877491f 230
charly 34:a9648877491f 231 void ST7920::invert(unsigned char o)
charly 34:a9648877491f 232 {
charly 34:a9648877491f 233 }
charly 34:a9648877491f 234
charly 34:a9648877491f 235 void ST7920::wr_grambuf(unsigned short* data, unsigned int lenght)
charly 34:a9648877491f 236 {
charly 34:a9648877491f 237 }
charly 34:a9648877491f 238
charly 34:a9648877491f 239 void ST7920::wr_gram(unsigned short data)
charly 34:a9648877491f 240 {
charly 34:a9648877491f 241 }
charly 34:a9648877491f 242
charly 34:a9648877491f 243 void ST7920::wr_gram(unsigned short data, unsigned int count)
charly 34:a9648877491f 244 {
charly 34:a9648877491f 245 }
charly 34:a9648877491f 246
charly 34:a9648877491f 247 void ST7920::wr_data16(unsigned short data)
charly 34:a9648877491f 248 {
charly 34:a9648877491f 249 }
charly 34:a9648877491f 250
charly 34:a9648877491f 251 void ST7920::wr_cmd16(unsigned short cmd)
charly 34:a9648877491f 252 {
charly 34:a9648877491f 253 }
charly 34:a9648877491f 254
charly 34:a9648877491f 255 void ST7920::wr_cmd8(unsigned char cmd)
charly 34:a9648877491f 256 {
charly 34:a9648877491f 257 }
charly 34:a9648877491f 258
charly 34:a9648877491f 259 unsigned short ST7920::rd_gram(bool convert)
charly 34:a9648877491f 260 {
charly 34:a9648877491f 261 return(0);
charly 34:a9648877491f 262 }
charly 34:a9648877491f 263
charly 34:a9648877491f 264 unsigned int ST7920::rd_reg_data32(unsigned char reg)
charly 34:a9648877491f 265 {
charly 34:a9648877491f 266 return(0);
charly 34:a9648877491f 267 }
charly 34:a9648877491f 268
charly 34:a9648877491f 269 unsigned int ST7920::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd)
charly 34:a9648877491f 270 {
charly 34:a9648877491f 271 return(0);
charly 34:a9648877491f 272 }