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/
Inits/ST7920.cpp@34:a9648877491f, 2017-05-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |