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/
Display/LCD.cpp@38:1b6f9fc49a03, 2018-10-30 (annotated)
- Committer:
- charly
- Date:
- Tue Oct 30 20:00:29 2018 +0000
- Revision:
- 38:1b6f9fc49a03
- Parent:
- 36:668396f861d2
some modifications.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Geremia | 4:12ba0ecc2c1f | 1 | /* mbed UniGraphic library - universal LCD driver class |
Geremia | 4:12ba0ecc2c1f | 2 | * Copyright (c) 2015 Giuliano Dianda |
Geremia | 4:12ba0ecc2c1f | 3 | * Released under the MIT License: http://mbed.org/license/mit |
Geremia | 4:12ba0ecc2c1f | 4 | * |
Geremia | 4:12ba0ecc2c1f | 5 | * Derived work of: |
Geremia | 4:12ba0ecc2c1f | 6 | * |
Geremia | 4:12ba0ecc2c1f | 7 | * mbed library for the mbed Lab Board 128*32 pixel LCD |
Geremia | 3:48f3282c2be8 | 8 | * use C12832 controller |
Geremia | 3:48f3282c2be8 | 9 | * Copyright (c) 2012 Peter Drescher - DC2PD |
Geremia | 3:48f3282c2be8 | 10 | * Released under the MIT License: http://mbed.org/license/mit |
Geremia | 3:48f3282c2be8 | 11 | * |
Geremia | 3:48f3282c2be8 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Geremia | 3:48f3282c2be8 | 13 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
Geremia | 3:48f3282c2be8 | 14 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
Geremia | 3:48f3282c2be8 | 15 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
Geremia | 3:48f3282c2be8 | 16 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Geremia | 3:48f3282c2be8 | 17 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
Geremia | 3:48f3282c2be8 | 18 | * THE SOFTWARE. |
Geremia | 3:48f3282c2be8 | 19 | */ |
dreschpe | 27:acb2594b8aa4 | 20 | #include "platform.h" |
dreschpe | 27:acb2594b8aa4 | 21 | #include "LCD.h" |
Geremia | 3:48f3282c2be8 | 22 | |
dreschpe | 27:acb2594b8aa4 | 23 | #if DEVICE_PORTINOUT |
dreschpe | 27:acb2594b8aa4 | 24 | #include "PAR8.h" |
dreschpe | 27:acb2594b8aa4 | 25 | #include "PAR16.h" |
dreschpe | 27:acb2594b8aa4 | 26 | #endif |
Geremia | 0:75ec1b3cde17 | 27 | |
Geremia | 0:75ec1b3cde17 | 28 | //#include "mbed_debug.h" |
Geremia | 7:bb0383b91104 | 29 | |
Geremia | 0:75ec1b3cde17 | 30 | #define SWAP(a, b) { a ^= b; b ^= a; a ^= b; } |
Geremia | 2:713844a55c4e | 31 | |
dreschpe | 27:acb2594b8aa4 | 32 | #if DEVICE_PORTINOUT |
Geremia | 0:75ec1b3cde17 | 33 | LCD::LCD(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char *name) |
Geremia | 7:bb0383b91104 | 34 | : 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) |
Geremia | 0:75ec1b3cde17 | 35 | { |
dreschpe | 27:acb2594b8aa4 | 36 | if(displayproto==PAR_8) proto = new PAR8(port, CS, reset, DC, WR, RD); |
Geremia | 1:ff019d22b275 | 37 | useNOP=false; |
charly | 38:1b6f9fc49a03 | 38 | //buffer = (unsigned char*) malloc (screensize_X*_LCDPAGES); |
charly | 38:1b6f9fc49a03 | 39 | //posix_memalign(void **memptr, size_t alignment, size_t size); |
charly | 38:1b6f9fc49a03 | 40 | posix_memalign((void **)&buffer, 16,screensize_X*_LCDPAGES); |
Geremia | 1:ff019d22b275 | 41 | buffer16 = (unsigned short*)buffer; |
Geremia | 0:75ec1b3cde17 | 42 | draw_mode = NORMAL; |
Geremia | 0:75ec1b3cde17 | 43 | set_orientation(1); |
Geremia | 4:12ba0ecc2c1f | 44 | foreground(White); |
Geremia | 4:12ba0ecc2c1f | 45 | background(Black); |
Geremia | 2:713844a55c4e | 46 | set_auto_up(true); |
Geremia | 7:bb0383b91104 | 47 | tftID=0; |
Geremia | 0:75ec1b3cde17 | 48 | // cls(); |
Geremia | 0:75ec1b3cde17 | 49 | // locate(0,0); |
Geremia | 0:75ec1b3cde17 | 50 | } |
dreschpe | 27:acb2594b8aa4 | 51 | #endif |
dreschpe | 27:acb2594b8aa4 | 52 | |
Geremia | 21:ae0a4eedfc90 | 53 | LCD::LCD(proto_t displayproto, PinName* buspins, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char *name) |
Geremia | 21:ae0a4eedfc90 | 54 | : 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) |
Geremia | 21:ae0a4eedfc90 | 55 | { |
Geremia | 21:ae0a4eedfc90 | 56 | if(displayproto==BUS_8) |
Geremia | 21:ae0a4eedfc90 | 57 | { |
Geremia | 21:ae0a4eedfc90 | 58 | PinName pins[16]; |
Geremia | 21:ae0a4eedfc90 | 59 | for(int i=0; i<16; i++) pins[i]=NC; |
Geremia | 21:ae0a4eedfc90 | 60 | for(int i=0; i<8; i++) pins[i]=buspins[i]; |
Geremia | 21:ae0a4eedfc90 | 61 | proto = new BUS8(pins, CS, reset, DC, WR, RD); |
Geremia | 21:ae0a4eedfc90 | 62 | } |
Geremia | 21:ae0a4eedfc90 | 63 | useNOP=false; |
charly | 38:1b6f9fc49a03 | 64 | //buffer = (unsigned char*) malloc (screensize_X*_LCDPAGES); |
charly | 38:1b6f9fc49a03 | 65 | //posix_memalign(void **memptr, size_t alignment, size_t size); |
charly | 38:1b6f9fc49a03 | 66 | posix_memalign((void **)&buffer, 16,screensize_X*_LCDPAGES); |
Geremia | 21:ae0a4eedfc90 | 67 | buffer16 = (unsigned short*)buffer; |
Geremia | 21:ae0a4eedfc90 | 68 | draw_mode = NORMAL; |
Geremia | 21:ae0a4eedfc90 | 69 | set_orientation(1); |
Geremia | 21:ae0a4eedfc90 | 70 | foreground(White); |
Geremia | 21:ae0a4eedfc90 | 71 | background(Black); |
Geremia | 21:ae0a4eedfc90 | 72 | set_auto_up(true); |
Geremia | 21:ae0a4eedfc90 | 73 | tftID=0; |
Geremia | 21:ae0a4eedfc90 | 74 | // cls(); |
Geremia | 21:ae0a4eedfc90 | 75 | // locate(0,0); |
Geremia | 21:ae0a4eedfc90 | 76 | } |
Geremia | 1:ff019d22b275 | 77 | LCD::LCD(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char *name) |
Geremia | 7:bb0383b91104 | 78 | : 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) |
Geremia | 0:75ec1b3cde17 | 79 | { |
Geremia | 1:ff019d22b275 | 80 | if(displayproto==SPI_8) |
Geremia | 1:ff019d22b275 | 81 | { |
Geremia | 1:ff019d22b275 | 82 | proto = new SPI8(Hz, mosi, miso, sclk, CS, reset, DC); |
Geremia | 1:ff019d22b275 | 83 | useNOP=false; |
Geremia | 1:ff019d22b275 | 84 | } |
Geremia | 1:ff019d22b275 | 85 | else if(displayproto==SPI_16) |
Geremia | 1:ff019d22b275 | 86 | { |
Geremia | 1:ff019d22b275 | 87 | proto = new SPI16(Hz, mosi, miso, sclk, CS, reset, DC); |
Geremia | 1:ff019d22b275 | 88 | useNOP=true; |
Geremia | 1:ff019d22b275 | 89 | } |
charly | 38:1b6f9fc49a03 | 90 | //buffer = (unsigned char*) malloc (screensize_X*_LCDPAGES); |
charly | 38:1b6f9fc49a03 | 91 | //posix_memalign(void **memptr, size_t alignment, size_t size); |
charly | 38:1b6f9fc49a03 | 92 | posix_memalign((void **)&buffer, 16,screensize_X*_LCDPAGES); |
Geremia | 1:ff019d22b275 | 93 | buffer16 = (unsigned short*)buffer; |
Geremia | 0:75ec1b3cde17 | 94 | draw_mode = NORMAL; |
Geremia | 0:75ec1b3cde17 | 95 | // cls(); |
Geremia | 0:75ec1b3cde17 | 96 | set_orientation(1); |
Geremia | 4:12ba0ecc2c1f | 97 | foreground(White); |
Geremia | 4:12ba0ecc2c1f | 98 | background(Black); |
Geremia | 2:713844a55c4e | 99 | set_auto_up(true); |
Geremia | 7:bb0383b91104 | 100 | tftID=0; |
Geremia | 0:75ec1b3cde17 | 101 | // locate(0,0); |
Geremia | 0:75ec1b3cde17 | 102 | } |
charly | 36:668396f861d2 | 103 | LCD::LCD(proto_t displayproto, int Hz, int address, PinName sda, PinName scl, PinName reset, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char* name) |
dreschpe | 33:f87f06292637 | 104 | : 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) |
dreschpe | 33:f87f06292637 | 105 | { |
dreschpe | 33:f87f06292637 | 106 | if(displayproto==I2C_){ |
charly | 36:668396f861d2 | 107 | proto = new I2C_bus(Hz,address,sda,scl, reset); |
dreschpe | 33:f87f06292637 | 108 | useNOP=false; |
dreschpe | 33:f87f06292637 | 109 | } |
charly | 38:1b6f9fc49a03 | 110 | //buffer = (unsigned char*) malloc (screensize_X*_LCDPAGES); |
charly | 38:1b6f9fc49a03 | 111 | //posix_memalign(void **memptr, size_t alignment, size_t size); |
charly | 38:1b6f9fc49a03 | 112 | posix_memalign((void **)&buffer, 16,screensize_X*_LCDPAGES); |
dreschpe | 33:f87f06292637 | 113 | buffer16 = (unsigned short*)buffer; |
charly | 38:1b6f9fc49a03 | 114 | |
dreschpe | 33:f87f06292637 | 115 | draw_mode = NORMAL; |
dreschpe | 33:f87f06292637 | 116 | // cls(); |
dreschpe | 33:f87f06292637 | 117 | set_orientation(1); |
dreschpe | 33:f87f06292637 | 118 | foreground(White); |
dreschpe | 33:f87f06292637 | 119 | background(Black); |
dreschpe | 33:f87f06292637 | 120 | set_auto_up(true); |
dreschpe | 33:f87f06292637 | 121 | tftID=0; |
dreschpe | 33:f87f06292637 | 122 | } |
dreschpe | 33:f87f06292637 | 123 | |
Geremia | 0:75ec1b3cde17 | 124 | LCD::~LCD() |
Geremia | 0:75ec1b3cde17 | 125 | { |
Geremia | 0:75ec1b3cde17 | 126 | free(buffer); |
Geremia | 0:75ec1b3cde17 | 127 | } |
Geremia | 0:75ec1b3cde17 | 128 | |
Geremia | 1:ff019d22b275 | 129 | void LCD::wr_cmd8(unsigned char cmd) |
Geremia | 0:75ec1b3cde17 | 130 | { |
Geremia | 2:713844a55c4e | 131 | if(useNOP) proto->wr_cmd16(0xE300|cmd); // E3 is NOP cmd for LCD |
Geremia | 1:ff019d22b275 | 132 | else proto->wr_cmd8(cmd); |
Geremia | 0:75ec1b3cde17 | 133 | } |
Geremia | 1:ff019d22b275 | 134 | void LCD::wr_data8(unsigned char data) |
Geremia | 0:75ec1b3cde17 | 135 | { |
Geremia | 1:ff019d22b275 | 136 | proto->wr_data8(data); |
Geremia | 1:ff019d22b275 | 137 | } |
Geremia | 1:ff019d22b275 | 138 | void LCD::wr_cmd16(unsigned short cmd) |
Geremia | 1:ff019d22b275 | 139 | { |
Geremia | 1:ff019d22b275 | 140 | proto->wr_cmd16(cmd); |
Geremia | 0:75ec1b3cde17 | 141 | } |
Geremia | 4:12ba0ecc2c1f | 142 | void LCD::wr_gram(unsigned short data, unsigned int count) |
Geremia | 0:75ec1b3cde17 | 143 | { |
Geremia | 4:12ba0ecc2c1f | 144 | proto->wr_gram(data, count); |
Geremia | 1:ff019d22b275 | 145 | } |
Geremia | 4:12ba0ecc2c1f | 146 | void LCD::wr_grambuf(unsigned short* data, unsigned int lenght) |
Geremia | 1:ff019d22b275 | 147 | { |
Geremia | 4:12ba0ecc2c1f | 148 | proto->wr_grambuf(data, lenght); |
Geremia | 0:75ec1b3cde17 | 149 | } |
Geremia | 0:75ec1b3cde17 | 150 | void LCD::hw_reset() |
Geremia | 0:75ec1b3cde17 | 151 | { |
Geremia | 0:75ec1b3cde17 | 152 | proto->hw_reset(); |
Geremia | 0:75ec1b3cde17 | 153 | } |
Geremia | 0:75ec1b3cde17 | 154 | void LCD::BusEnable(bool enable) |
Geremia | 0:75ec1b3cde17 | 155 | { |
Geremia | 0:75ec1b3cde17 | 156 | proto->BusEnable(enable); |
Geremia | 0:75ec1b3cde17 | 157 | } |
Geremia | 0:75ec1b3cde17 | 158 | |
Geremia | 0:75ec1b3cde17 | 159 | |
Geremia | 0:75ec1b3cde17 | 160 | |
Geremia | 0:75ec1b3cde17 | 161 | // monochrome LCD driver ICs does not have ram rotate in hw (swap raw<->columns) like TFT displays |
Geremia | 0:75ec1b3cde17 | 162 | // for portrait views, XY swap will be done in sw in pixel() function |
Geremia | 0:75ec1b3cde17 | 163 | void LCD::set_orientation(int o) |
Geremia | 0:75ec1b3cde17 | 164 | { |
Geremia | 0:75ec1b3cde17 | 165 | orientation = o; |
Geremia | 0:75ec1b3cde17 | 166 | switch (o) { |
Geremia | 0:75ec1b3cde17 | 167 | case (0):// portrait view -90° |
Geremia | 0:75ec1b3cde17 | 168 | mirrorXY(Y); |
Geremia | 0:75ec1b3cde17 | 169 | col_offset = 0; |
Geremia | 7:bb0383b91104 | 170 | page_offset = _IC_PAGES-_LCDPAGES; |
Geremia | 7:bb0383b91104 | 171 | set_width(screensize_Y); |
Geremia | 7:bb0383b91104 | 172 | set_height(screensize_X); |
Geremia | 0:75ec1b3cde17 | 173 | // portrait = true; |
Geremia | 0:75ec1b3cde17 | 174 | break; |
Geremia | 0:75ec1b3cde17 | 175 | case (1): // default, landscape view 0° |
Geremia | 0:75ec1b3cde17 | 176 | mirrorXY(NONE); |
Geremia | 0:75ec1b3cde17 | 177 | col_offset = 0; |
Geremia | 0:75ec1b3cde17 | 178 | page_offset = 0; |
Geremia | 7:bb0383b91104 | 179 | set_width(screensize_X); |
Geremia | 7:bb0383b91104 | 180 | set_height(screensize_Y); |
Geremia | 0:75ec1b3cde17 | 181 | // portrait = false; |
Geremia | 0:75ec1b3cde17 | 182 | break; |
Geremia | 0:75ec1b3cde17 | 183 | case (2):// portrait view +90° |
Geremia | 0:75ec1b3cde17 | 184 | mirrorXY(X); |
Geremia | 7:bb0383b91104 | 185 | col_offset = _IC_X_SEGS-screensize_X; // some displays have less pixels than IC ram |
Geremia | 0:75ec1b3cde17 | 186 | page_offset = 0; |
Geremia | 7:bb0383b91104 | 187 | set_width(screensize_Y); |
Geremia | 7:bb0383b91104 | 188 | set_height(screensize_X); |
Geremia | 0:75ec1b3cde17 | 189 | // portrait = true; |
Geremia | 0:75ec1b3cde17 | 190 | break; |
Geremia | 0:75ec1b3cde17 | 191 | case (3):// landscape view +180° |
Geremia | 0:75ec1b3cde17 | 192 | mirrorXY(XY); |
Geremia | 7:bb0383b91104 | 193 | col_offset = _IC_X_SEGS-screensize_X; |
Geremia | 7:bb0383b91104 | 194 | page_offset = _IC_PAGES-_LCDPAGES; |
Geremia | 7:bb0383b91104 | 195 | set_width(screensize_X); |
Geremia | 7:bb0383b91104 | 196 | set_height(screensize_Y); |
Geremia | 0:75ec1b3cde17 | 197 | // portrait = false; |
Geremia | 0:75ec1b3cde17 | 198 | break; |
Geremia | 0:75ec1b3cde17 | 199 | } |
Geremia | 0:75ec1b3cde17 | 200 | } |
Geremia | 0:75ec1b3cde17 | 201 | void LCD::mirrorXY(mirror_t mode) |
Geremia | 0:75ec1b3cde17 | 202 | { |
Geremia | 0:75ec1b3cde17 | 203 | switch (mode) |
Geremia | 0:75ec1b3cde17 | 204 | { |
Geremia | 0:75ec1b3cde17 | 205 | case(NONE): |
Geremia | 1:ff019d22b275 | 206 | // wr_cmd8(0xA0); |
Geremia | 1:ff019d22b275 | 207 | wr_cmd16(0xA0C8); // this is in real Y mirror command, but seems most displays have COMs wired inverted, so assume this is the default no-y-mirror |
Geremia | 0:75ec1b3cde17 | 208 | break; |
Geremia | 0:75ec1b3cde17 | 209 | case(X): |
Geremia | 1:ff019d22b275 | 210 | // wr_cmd8(0xA1); |
Geremia | 1:ff019d22b275 | 211 | wr_cmd16(0xA1C8); |
Geremia | 0:75ec1b3cde17 | 212 | break; |
Geremia | 0:75ec1b3cde17 | 213 | case(Y): |
Geremia | 1:ff019d22b275 | 214 | // wr_cmd8(0xA0); |
Geremia | 1:ff019d22b275 | 215 | wr_cmd16(0xA0C0); |
Geremia | 0:75ec1b3cde17 | 216 | break; |
Geremia | 0:75ec1b3cde17 | 217 | case(XY): |
Geremia | 1:ff019d22b275 | 218 | // wr_cmd8(0xA1); |
Geremia | 1:ff019d22b275 | 219 | wr_cmd16(0xA1C0); |
Geremia | 0:75ec1b3cde17 | 220 | break; |
Geremia | 0:75ec1b3cde17 | 221 | } |
Geremia | 0:75ec1b3cde17 | 222 | } |
Geremia | 0:75ec1b3cde17 | 223 | void LCD::invert(unsigned char o) |
Geremia | 0:75ec1b3cde17 | 224 | { |
Geremia | 1:ff019d22b275 | 225 | if(o == 0) wr_cmd8(0xA6); |
Geremia | 1:ff019d22b275 | 226 | else wr_cmd8(0xA7); |
Geremia | 0:75ec1b3cde17 | 227 | } |
Geremia | 0:75ec1b3cde17 | 228 | |
Geremia | 0:75ec1b3cde17 | 229 | void LCD::set_contrast(int o) |
Geremia | 0:75ec1b3cde17 | 230 | { |
Geremia | 0:75ec1b3cde17 | 231 | contrast = o; |
Geremia | 1:ff019d22b275 | 232 | // wr_cmd8(0x81); // set volume |
Geremia | 1:ff019d22b275 | 233 | wr_cmd16(0x8100|(o&0x3F)); |
Geremia | 0:75ec1b3cde17 | 234 | } |
Geremia | 2:713844a55c4e | 235 | |
Geremia | 0:75ec1b3cde17 | 236 | int LCD::get_contrast(void) |
Geremia | 0:75ec1b3cde17 | 237 | { |
Geremia | 0:75ec1b3cde17 | 238 | return(contrast); |
Geremia | 0:75ec1b3cde17 | 239 | } |
Geremia | 0:75ec1b3cde17 | 240 | void LCD::window(int x, int y, int w, int h) { |
Geremia | 0:75ec1b3cde17 | 241 | // current pixel location |
Geremia | 0:75ec1b3cde17 | 242 | cur_x = x; |
Geremia | 0:75ec1b3cde17 | 243 | cur_y = y; |
Geremia | 0:75ec1b3cde17 | 244 | // window settings |
Geremia | 0:75ec1b3cde17 | 245 | win_x1 = x; |
Geremia | 0:75ec1b3cde17 | 246 | win_x2 = x + w - 1; |
Geremia | 0:75ec1b3cde17 | 247 | win_y1 = y; |
Geremia | 0:75ec1b3cde17 | 248 | win_y2 = y + h - 1; |
Geremia | 0:75ec1b3cde17 | 249 | } |
Geremia | 0:75ec1b3cde17 | 250 | void LCD::window_pushpixel(unsigned short color) { |
Geremia | 0:75ec1b3cde17 | 251 | pixel(cur_x, cur_y, color); |
Geremia | 0:75ec1b3cde17 | 252 | cur_x++; |
Geremia | 0:75ec1b3cde17 | 253 | if(cur_x > win_x2) { |
Geremia | 0:75ec1b3cde17 | 254 | cur_x = win_x1; |
Geremia | 0:75ec1b3cde17 | 255 | cur_y++; |
Geremia | 0:75ec1b3cde17 | 256 | if(cur_y > win_y2) { |
Geremia | 0:75ec1b3cde17 | 257 | cur_y = win_y1; |
Geremia | 0:75ec1b3cde17 | 258 | } |
Geremia | 0:75ec1b3cde17 | 259 | } |
Geremia | 0:75ec1b3cde17 | 260 | } |
Geremia | 2:713844a55c4e | 261 | void LCD::window_pushpixel(unsigned short color, unsigned int count) { |
Geremia | 2:713844a55c4e | 262 | while(count) |
Geremia | 2:713844a55c4e | 263 | { |
Geremia | 2:713844a55c4e | 264 | pixel(cur_x, cur_y, color); |
Geremia | 2:713844a55c4e | 265 | cur_x++; |
Geremia | 2:713844a55c4e | 266 | if(cur_x > win_x2) |
Geremia | 2:713844a55c4e | 267 | { |
Geremia | 2:713844a55c4e | 268 | cur_x = win_x1; |
Geremia | 2:713844a55c4e | 269 | cur_y++; |
Geremia | 2:713844a55c4e | 270 | if(cur_y > win_y2) |
Geremia | 2:713844a55c4e | 271 | { |
Geremia | 2:713844a55c4e | 272 | cur_y = win_y1; |
Geremia | 2:713844a55c4e | 273 | } |
Geremia | 2:713844a55c4e | 274 | } |
Geremia | 2:713844a55c4e | 275 | count--; |
Geremia | 2:713844a55c4e | 276 | } |
Geremia | 2:713844a55c4e | 277 | } |
Geremia | 2:713844a55c4e | 278 | void LCD::window_pushpixelbuf(unsigned short* color, unsigned int lenght) { |
Geremia | 2:713844a55c4e | 279 | while(lenght) |
Geremia | 2:713844a55c4e | 280 | { |
Geremia | 2:713844a55c4e | 281 | pixel(cur_x, cur_y, *color++); |
Geremia | 2:713844a55c4e | 282 | cur_x++; |
Geremia | 2:713844a55c4e | 283 | if(cur_x > win_x2) |
Geremia | 2:713844a55c4e | 284 | { |
Geremia | 2:713844a55c4e | 285 | cur_x = win_x1; |
Geremia | 2:713844a55c4e | 286 | cur_y++; |
Geremia | 2:713844a55c4e | 287 | if(cur_y > win_y2) |
Geremia | 2:713844a55c4e | 288 | { |
Geremia | 2:713844a55c4e | 289 | cur_y = win_y1; |
Geremia | 2:713844a55c4e | 290 | } |
Geremia | 2:713844a55c4e | 291 | } |
Geremia | 2:713844a55c4e | 292 | lenght--; |
Geremia | 2:713844a55c4e | 293 | } |
Geremia | 2:713844a55c4e | 294 | } |
charly | 38:1b6f9fc49a03 | 295 | |
Geremia | 0:75ec1b3cde17 | 296 | void LCD::pixel(int x, int y, unsigned short color) |
Geremia | 0:75ec1b3cde17 | 297 | { |
charly | 38:1b6f9fc49a03 | 298 | /* |
Geremia | 0:75ec1b3cde17 | 299 | if(!(orientation&1)) SWAP(x,y); |
Geremia | 0:75ec1b3cde17 | 300 | // first check parameter |
Geremia | 7:bb0383b91104 | 301 | if((x >= screensize_X) || (y >= screensize_Y)) return; |
Geremia | 0:75ec1b3cde17 | 302 | |
charly | 35:b8d3f1e68000 | 303 | |
charly | 35:b8d3f1e68000 | 304 | if (color) {buffer[(x>>3)+(y*_IC_X_SEGS>>4)]&= ~(1 << (7-(x&7)));} |
charly | 35:b8d3f1e68000 | 305 | else {buffer[(x>>3)+(y*_IC_X_SEGS>>4)]|= (1 << (7-(x&7)));} |
charly | 34:a9648877491f | 306 | |
charly | 34:a9648877491f | 307 | //buffer[0]=0xFF; |
charly | 34:a9648877491f | 308 | //buffer[16]=0xAA; |
charly | 34:a9648877491f | 309 | //buffer[1023]=0xFF; |
charly | 38:1b6f9fc49a03 | 310 | */ |
charly | 38:1b6f9fc49a03 | 311 | } |
charly | 34:a9648877491f | 312 | |
Geremia | 20:14daa48ffd4c | 313 | unsigned short LCD::pixelread(int x, int y) |
Geremia | 20:14daa48ffd4c | 314 | { |
charly | 38:1b6f9fc49a03 | 315 | /* |
Geremia | 20:14daa48ffd4c | 316 | if(!(orientation&1)) SWAP(x,y); |
Geremia | 20:14daa48ffd4c | 317 | // first check parameter |
Geremia | 20:14daa48ffd4c | 318 | if((x >= screensize_X) || (y >= screensize_Y)) return 0; |
Geremia | 20:14daa48ffd4c | 319 | |
charly | 35:b8d3f1e68000 | 320 | |
charly | 35:b8d3f1e68000 | 321 | if((buffer[(x>>3)+(y*_IC_X_SEGS>>4)] & (1 << (7-(x&7))))==0) return 0xFFFF ; // pixel not set, White |
Geremia | 20:14daa48ffd4c | 322 | else return 0; // pixel set, Black |
charly | 38:1b6f9fc49a03 | 323 | */ |
charly | 38:1b6f9fc49a03 | 324 | return 0; |
Geremia | 0:75ec1b3cde17 | 325 | } |
Geremia | 0:75ec1b3cde17 | 326 | void LCD::copy_to_lcd(void) |
Geremia | 0:75ec1b3cde17 | 327 | { |
charly | 38:1b6f9fc49a03 | 328 | /* |
Geremia | 0:75ec1b3cde17 | 329 | unsigned short i=0; |
Geremia | 1:ff019d22b275 | 330 | unsigned short setcolcmd = 0x0010 | ((col_offset&0xF)<<8) | (col_offset>>4); |
Geremia | 7:bb0383b91104 | 331 | for(int page=0; page<_LCDPAGES; page++) |
Geremia | 0:75ec1b3cde17 | 332 | { |
Geremia | 1:ff019d22b275 | 333 | // wr_cmd8(col_offset&0xF); // set column low nibble |
Geremia | 1:ff019d22b275 | 334 | // wr_cmd8(0x10|(col_offset>>4)); // set column hi nibble |
Geremia | 1:ff019d22b275 | 335 | wr_cmd16(setcolcmd); |
Geremia | 1:ff019d22b275 | 336 | wr_cmd8(0xB0|(page+page_offset)); // set page |
Geremia | 7:bb0383b91104 | 337 | wr_grambuf(buffer16+i, screensize_X>>1); // send whole page pixels |
Geremia | 7:bb0383b91104 | 338 | i+=screensize_X>>1; |
Geremia | 0:75ec1b3cde17 | 339 | } |
charly | 38:1b6f9fc49a03 | 340 | */ |
Geremia | 0:75ec1b3cde17 | 341 | } |
Geremia | 0:75ec1b3cde17 | 342 | void LCD::cls(void) |
Geremia | 0:75ec1b3cde17 | 343 | { |
charly | 38:1b6f9fc49a03 | 344 | /* |
Geremia | 4:12ba0ecc2c1f | 345 | unsigned short tmp = _background^0xFFFF; |
Geremia | 7:bb0383b91104 | 346 | memset(buffer,tmp,screensize_X*_LCDPAGES); // clear display buffer |
Geremia | 1:ff019d22b275 | 347 | unsigned short setcolcmd = 0x0010 | ((col_offset&0xF)<<8) | (col_offset>>4); |
Geremia | 7:bb0383b91104 | 348 | for(int page=0; page<_LCDPAGES; page++) |
Geremia | 0:75ec1b3cde17 | 349 | { |
Geremia | 1:ff019d22b275 | 350 | // wr_cmd8((unsigned char)col_offset&0xF); // set column low nibble |
Geremia | 1:ff019d22b275 | 351 | // wr_cmd8(0x10|(col_offset>>4)); // set column hi nibble |
Geremia | 1:ff019d22b275 | 352 | wr_cmd16(setcolcmd); |
Geremia | 1:ff019d22b275 | 353 | wr_cmd8(0xB0|(page+page_offset)); // set page |
Geremia | 18:ffa58f1a680a | 354 | wr_gram(tmp, screensize_X>>1); // send whole page pixels = background |
Geremia | 0:75ec1b3cde17 | 355 | } |
charly | 38:1b6f9fc49a03 | 356 | */ |
Geremia | 7:bb0383b91104 | 357 | } |
Geremia | 7:bb0383b91104 | 358 | int LCD::sizeX() |
Geremia | 7:bb0383b91104 | 359 | { |
Geremia | 7:bb0383b91104 | 360 | return screensize_X; |
Geremia | 7:bb0383b91104 | 361 | } |
Geremia | 7:bb0383b91104 | 362 | int LCD::sizeY() |
Geremia | 7:bb0383b91104 | 363 | { |
Geremia | 7:bb0383b91104 | 364 | return screensize_Y; |
Geremia | 0:75ec1b3cde17 | 365 | } |