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:
Tue Oct 30 20:00:29 2018 +0000
Revision:
38:1b6f9fc49a03
Parent:
36:668396f861d2
some modifications.

Who changed what in which revision?

UserRevisionLine numberNew 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 }