for Arduino TFT LCD Screen 160x128

Dependents:   TFTLCDSCREEN Pong_ILI9163C

Fork of TFT_ILI9163C by _ peu605

Committer:
peu605
Date:
Mon Mar 02 11:38:50 2015 +0000
Revision:
10:1ebc27775d92
Parent:
8:8dea70cf3ae8
Child:
11:4dd4a2f7b7f6
scroll test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peu605 7:3dcb98ecf29f 1 #include "TFT_ILI9163C_BASE.h"
peu605 7:3dcb98ecf29f 2 #include "mbed.h"
peu605 7:3dcb98ecf29f 3
peu605 7:3dcb98ecf29f 4 /**
peu605 7:3dcb98ecf29f 5 * TFT_ILI9163C library
peu605 7:3dcb98ecf29f 6 *
peu605 7:3dcb98ecf29f 7 * @author Copyright (c) 2014, .S.U.M.O.T.O.Y., coded by Max MC Costa
peu605 7:3dcb98ecf29f 8 * https://github.com/sumotoy/TFT_ILI9163C
peu605 7:3dcb98ecf29f 9 *
peu605 7:3dcb98ecf29f 10 * @author modified by masuda, Masuda Naika
peu605 7:3dcb98ecf29f 11 */
peu605 7:3dcb98ecf29f 12
peu605 7:3dcb98ecf29f 13 //Serial pc(SERIAL_TX, SERIAL_RX);
peu605 7:3dcb98ecf29f 14
peu605 7:3dcb98ecf29f 15 //constructors
peu605 7:3dcb98ecf29f 16 TFT_ILI9163C_BASE::TFT_ILI9163C_BASE(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc, PinName reset)
peu605 8:8dea70cf3ae8 17 : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) , SPI(mosi,miso,sclk,NC), _cs(cs, 1), _dc(dc, 0) {
peu605 7:3dcb98ecf29f 18
peu605 7:3dcb98ecf29f 19 _resetPinName = reset;
peu605 7:3dcb98ecf29f 20 init(cs, dc);
peu605 7:3dcb98ecf29f 21 }
peu605 7:3dcb98ecf29f 22
peu605 7:3dcb98ecf29f 23 TFT_ILI9163C_BASE::TFT_ILI9163C_BASE(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc)
peu605 8:8dea70cf3ae8 24 : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) , SPI(mosi,miso,sclk,NC), _cs(cs, 1), _dc(dc, 0) {
peu605 7:3dcb98ecf29f 25
peu605 7:3dcb98ecf29f 26 _resetPinName = NC;
peu605 7:3dcb98ecf29f 27 init(cs, dc);
peu605 7:3dcb98ecf29f 28 }
peu605 7:3dcb98ecf29f 29
peu605 7:3dcb98ecf29f 30
peu605 7:3dcb98ecf29f 31 void TFT_ILI9163C_BASE::init(PinName cs, PinName dc){
peu605 7:3dcb98ecf29f 32 }
peu605 7:3dcb98ecf29f 33
peu605 7:3dcb98ecf29f 34 inline void TFT_ILI9163C_BASE::selectSlave() {
peu605 7:3dcb98ecf29f 35 _cs = 0;
peu605 7:3dcb98ecf29f 36 }
peu605 7:3dcb98ecf29f 37
peu605 7:3dcb98ecf29f 38 inline void TFT_ILI9163C_BASE::deselectSlave() {
peu605 7:3dcb98ecf29f 39 _cs = 1;
peu605 7:3dcb98ecf29f 40 }
peu605 7:3dcb98ecf29f 41
peu605 7:3dcb98ecf29f 42 inline void TFT_ILI9163C_BASE::setCommandMode() {
peu605 7:3dcb98ecf29f 43 _dc = 0;
peu605 7:3dcb98ecf29f 44 }
peu605 7:3dcb98ecf29f 45
peu605 7:3dcb98ecf29f 46 inline void TFT_ILI9163C_BASE::setDataMode() {
peu605 7:3dcb98ecf29f 47 _dc = 1;
peu605 7:3dcb98ecf29f 48 }
peu605 7:3dcb98ecf29f 49
peu605 7:3dcb98ecf29f 50 void TFT_ILI9163C_BASE::writecommand(uint8_t c){
peu605 7:3dcb98ecf29f 51
peu605 7:3dcb98ecf29f 52 setCommandMode();
peu605 7:3dcb98ecf29f 53 selectSlave();
peu605 7:3dcb98ecf29f 54
peu605 7:3dcb98ecf29f 55 SPI::write(c);
peu605 7:3dcb98ecf29f 56
peu605 7:3dcb98ecf29f 57 deselectSlave();
peu605 7:3dcb98ecf29f 58 }
peu605 7:3dcb98ecf29f 59
peu605 7:3dcb98ecf29f 60 void TFT_ILI9163C_BASE::writedata(uint8_t c){
peu605 7:3dcb98ecf29f 61
peu605 7:3dcb98ecf29f 62 setDataMode();
peu605 7:3dcb98ecf29f 63 selectSlave();
peu605 7:3dcb98ecf29f 64
peu605 7:3dcb98ecf29f 65 SPI::write(c);
peu605 7:3dcb98ecf29f 66
peu605 7:3dcb98ecf29f 67 deselectSlave();
peu605 7:3dcb98ecf29f 68 }
peu605 7:3dcb98ecf29f 69
peu605 7:3dcb98ecf29f 70 void TFT_ILI9163C_BASE::writedata16(uint16_t d){
peu605 7:3dcb98ecf29f 71
peu605 7:3dcb98ecf29f 72 setDataMode();
peu605 7:3dcb98ecf29f 73 selectSlave();
peu605 7:3dcb98ecf29f 74
peu605 7:3dcb98ecf29f 75 SPI::write(d >> 8);
peu605 7:3dcb98ecf29f 76 SPI::write(d & 0xff);
peu605 7:3dcb98ecf29f 77
peu605 7:3dcb98ecf29f 78 deselectSlave();
peu605 7:3dcb98ecf29f 79 }
peu605 7:3dcb98ecf29f 80
peu605 7:3dcb98ecf29f 81 void TFT_ILI9163C_BASE::writedata32(uint16_t d1, uint16_t d2){
peu605 7:3dcb98ecf29f 82
peu605 7:3dcb98ecf29f 83 setDataMode();
peu605 7:3dcb98ecf29f 84 selectSlave();
peu605 7:3dcb98ecf29f 85
peu605 7:3dcb98ecf29f 86 SPI::write(d1 >> 8);
peu605 7:3dcb98ecf29f 87 SPI::write(d1 & 0xff);
peu605 7:3dcb98ecf29f 88 SPI::write(d2 >> 8);
peu605 7:3dcb98ecf29f 89 SPI::write(d2 & 0xff);
peu605 7:3dcb98ecf29f 90
peu605 7:3dcb98ecf29f 91 deselectSlave();
peu605 7:3dcb98ecf29f 92 }
peu605 7:3dcb98ecf29f 93
peu605 7:3dcb98ecf29f 94 void TFT_ILI9163C_BASE::writedata16burst(uint16_t d, int32_t len) {
peu605 7:3dcb98ecf29f 95
peu605 7:3dcb98ecf29f 96 len = len < 0 ? -len : len;
peu605 7:3dcb98ecf29f 97
peu605 7:3dcb98ecf29f 98 if (len > 0) {
peu605 7:3dcb98ecf29f 99
peu605 7:3dcb98ecf29f 100 setDataMode();
peu605 7:3dcb98ecf29f 101 selectSlave();
peu605 7:3dcb98ecf29f 102
peu605 7:3dcb98ecf29f 103 while (len--) {
peu605 7:3dcb98ecf29f 104 SPI::write(d >> 8);
peu605 7:3dcb98ecf29f 105 SPI::write(d & 0xff);
peu605 7:3dcb98ecf29f 106 }
peu605 7:3dcb98ecf29f 107
peu605 7:3dcb98ecf29f 108 deselectSlave();
peu605 7:3dcb98ecf29f 109 }
peu605 7:3dcb98ecf29f 110 }
peu605 7:3dcb98ecf29f 111
peu605 7:3dcb98ecf29f 112
peu605 7:3dcb98ecf29f 113 void TFT_ILI9163C_BASE::setBitrate(uint32_t n){
peu605 7:3dcb98ecf29f 114 SPI::frequency(n);
peu605 7:3dcb98ecf29f 115 }
peu605 7:3dcb98ecf29f 116
peu605 7:3dcb98ecf29f 117 void TFT_ILI9163C_BASE::begin(void) {
peu605 7:3dcb98ecf29f 118
peu605 7:3dcb98ecf29f 119 SPI::format(8,0); // 8 bit spi mode 0
peu605 7:3dcb98ecf29f 120 SPI::frequency(5000000L); // 5MHz
peu605 7:3dcb98ecf29f 121
peu605 7:3dcb98ecf29f 122 if (_resetPinName != NC) {
peu605 7:3dcb98ecf29f 123 DigitalOut _reset(_resetPinName);
peu605 7:3dcb98ecf29f 124 _reset = 1;
peu605 7:3dcb98ecf29f 125 wait_ms(1);
peu605 7:3dcb98ecf29f 126 _reset = 0;
peu605 7:3dcb98ecf29f 127 wait_ms(2);
peu605 7:3dcb98ecf29f 128 _reset = 1;
peu605 7:3dcb98ecf29f 129 wait_ms(120);
peu605 7:3dcb98ecf29f 130 }
peu605 7:3dcb98ecf29f 131
peu605 7:3dcb98ecf29f 132 /*
peu605 7:3dcb98ecf29f 133 7) MY: 1(bottom to top), 0(top to bottom) Row Address Order
peu605 7:3dcb98ecf29f 134 6) MX: 1(R to L), 0(L to R) Column Address Order
peu605 7:3dcb98ecf29f 135 5) MV: 1(Exchanged), 0(normal) Row/Column exchange
peu605 7:3dcb98ecf29f 136 4) ML: 1(bottom to top), 0(top to bottom) Vertical Refresh Order
peu605 7:3dcb98ecf29f 137 3) RGB: 1(BGR), 0(RGB) Color Space
peu605 7:3dcb98ecf29f 138 2) MH: 1(R to L), 0(L to R) Horizontal Refresh Order
peu605 7:3dcb98ecf29f 139 1)
peu605 7:3dcb98ecf29f 140 0)
peu605 7:3dcb98ecf29f 141
peu605 7:3dcb98ecf29f 142 MY, MX, MV, ML,RGB, MH, D1, D0
peu605 7:3dcb98ecf29f 143 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //normal
peu605 7:3dcb98ecf29f 144 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //Y-Mirror
peu605 7:3dcb98ecf29f 145 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Mirror
peu605 7:3dcb98ecf29f 146 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Y-Mirror
peu605 7:3dcb98ecf29f 147 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange
peu605 7:3dcb98ecf29f 148 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange, Y-Mirror
peu605 7:3dcb98ecf29f 149 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 //XY exchange
peu605 7:3dcb98ecf29f 150 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0
peu605 7:3dcb98ecf29f 151 */
peu605 7:3dcb98ecf29f 152 _Mactrl_Data = 0; // 0b00000000;
peu605 7:3dcb98ecf29f 153 _colorspaceData = __COLORSPC;//start with default data;
peu605 7:3dcb98ecf29f 154
peu605 7:3dcb98ecf29f 155 chipInit();
peu605 7:3dcb98ecf29f 156 }
peu605 7:3dcb98ecf29f 157
peu605 7:3dcb98ecf29f 158
peu605 7:3dcb98ecf29f 159 void TFT_ILI9163C_BASE::chipInit() {
peu605 7:3dcb98ecf29f 160 writecommand(CMD_SWRESET);//software reset
peu605 7:3dcb98ecf29f 161 wait_ms(120);
peu605 7:3dcb98ecf29f 162 writecommand(CMD_SLPOUT);//exit sleep
peu605 7:3dcb98ecf29f 163 wait_ms(5);
peu605 7:3dcb98ecf29f 164 writecommand(CMD_PIXFMT);//Set Color Format 16bit
peu605 7:3dcb98ecf29f 165 writedata(0x05);
peu605 7:3dcb98ecf29f 166 wait_ms(5);
peu605 7:3dcb98ecf29f 167 writecommand(CMD_GAMMASET);//default gamma curve 3
peu605 7:3dcb98ecf29f 168 writedata(0x04);//0x04
peu605 7:3dcb98ecf29f 169 wait_ms(1);
peu605 7:3dcb98ecf29f 170 writecommand(CMD_GAMRSEL);//Enable Gamma adj
peu605 7:3dcb98ecf29f 171 writedata(0x01);
peu605 7:3dcb98ecf29f 172 wait_ms(1);
peu605 7:3dcb98ecf29f 173 writecommand(CMD_NORML);
peu605 7:3dcb98ecf29f 174
peu605 7:3dcb98ecf29f 175 writecommand(CMD_DFUNCTR);
peu605 7:3dcb98ecf29f 176 writedata(0xff); // writedata(0b11111111);//
peu605 7:3dcb98ecf29f 177 writedata(0x06); // writedata(0b00000110);//
peu605 7:3dcb98ecf29f 178
peu605 7:3dcb98ecf29f 179 writecommand(CMD_PGAMMAC);//Positive Gamma Correction Setting
peu605 7:3dcb98ecf29f 180 #if defined(__GAMMASET1)
peu605 7:3dcb98ecf29f 181 writedata(0x36);//p1
peu605 7:3dcb98ecf29f 182 writedata(0x29);//p2
peu605 7:3dcb98ecf29f 183 writedata(0x12);//p3
peu605 7:3dcb98ecf29f 184 writedata(0x22);//p4
peu605 7:3dcb98ecf29f 185 writedata(0x1C);//p5
peu605 7:3dcb98ecf29f 186 writedata(0x15);//p6
peu605 7:3dcb98ecf29f 187 writedata(0x42);//p7
peu605 7:3dcb98ecf29f 188 writedata(0xB7);//p8
peu605 7:3dcb98ecf29f 189 writedata(0x2F);//p9
peu605 7:3dcb98ecf29f 190 writedata(0x13);//p10
peu605 7:3dcb98ecf29f 191 writedata(0x12);//p11
peu605 7:3dcb98ecf29f 192 writedata(0x0A);//p12
peu605 7:3dcb98ecf29f 193 writedata(0x11);//p13
peu605 7:3dcb98ecf29f 194 writedata(0x0B);//p14
peu605 7:3dcb98ecf29f 195 writedata(0x06);//p15
peu605 7:3dcb98ecf29f 196 #else
peu605 7:3dcb98ecf29f 197 writedata(0x3F);//p1
peu605 7:3dcb98ecf29f 198 writedata(0x25);//p2
peu605 7:3dcb98ecf29f 199 writedata(0x1C);//p3
peu605 7:3dcb98ecf29f 200 writedata(0x1E);//p4
peu605 7:3dcb98ecf29f 201 writedata(0x20);//p5
peu605 7:3dcb98ecf29f 202 writedata(0x12);//p6
peu605 7:3dcb98ecf29f 203 writedata(0x2A);//p7
peu605 7:3dcb98ecf29f 204 writedata(0x90);//p8
peu605 7:3dcb98ecf29f 205 writedata(0x24);//p9
peu605 7:3dcb98ecf29f 206 writedata(0x11);//p10
peu605 7:3dcb98ecf29f 207 writedata(0x00);//p11
peu605 7:3dcb98ecf29f 208 writedata(0x00);//p12
peu605 7:3dcb98ecf29f 209 writedata(0x00);//p13
peu605 7:3dcb98ecf29f 210 writedata(0x00);//p14
peu605 7:3dcb98ecf29f 211 writedata(0x00);//p15
peu605 7:3dcb98ecf29f 212 #endif
peu605 7:3dcb98ecf29f 213
peu605 7:3dcb98ecf29f 214 writecommand(CMD_NGAMMAC);//Negative Gamma Correction Setting
peu605 7:3dcb98ecf29f 215 #if defined(__GAMMASET1)
peu605 7:3dcb98ecf29f 216 writedata(0x09);//p1
peu605 7:3dcb98ecf29f 217 writedata(0x16);//p2
peu605 7:3dcb98ecf29f 218 writedata(0x2D);//p3
peu605 7:3dcb98ecf29f 219 writedata(0x0D);//p4
peu605 7:3dcb98ecf29f 220 writedata(0x13);//p5
peu605 7:3dcb98ecf29f 221 writedata(0x15);//p6
peu605 7:3dcb98ecf29f 222 writedata(0x40);//p7
peu605 7:3dcb98ecf29f 223 writedata(0x48);//p8
peu605 7:3dcb98ecf29f 224 writedata(0x53);//p9
peu605 7:3dcb98ecf29f 225 writedata(0x0C);//p10
peu605 7:3dcb98ecf29f 226 writedata(0x1D);//p11
peu605 7:3dcb98ecf29f 227 writedata(0x25);//p12
peu605 7:3dcb98ecf29f 228 writedata(0x2E);//p13
peu605 7:3dcb98ecf29f 229 writedata(0x34);//p14
peu605 7:3dcb98ecf29f 230 writedata(0x39);//p15
peu605 7:3dcb98ecf29f 231 #else
peu605 7:3dcb98ecf29f 232 writedata(0x20);//p1
peu605 7:3dcb98ecf29f 233 writedata(0x20);//p2
peu605 7:3dcb98ecf29f 234 writedata(0x20);//p3
peu605 7:3dcb98ecf29f 235 writedata(0x20);//p4
peu605 7:3dcb98ecf29f 236 writedata(0x05);//p5
peu605 7:3dcb98ecf29f 237 writedata(0x15);//p6
peu605 7:3dcb98ecf29f 238 writedata(0x00);//p7
peu605 7:3dcb98ecf29f 239 writedata(0xA7);//p8
peu605 7:3dcb98ecf29f 240 writedata(0x3D);//p9
peu605 7:3dcb98ecf29f 241 writedata(0x18);//p10
peu605 7:3dcb98ecf29f 242 writedata(0x25);//p11
peu605 7:3dcb98ecf29f 243 writedata(0x2A);//p12
peu605 7:3dcb98ecf29f 244 writedata(0x2B);//p13
peu605 7:3dcb98ecf29f 245 writedata(0x2B);//p14
peu605 7:3dcb98ecf29f 246 writedata(0x3A);//p15
peu605 7:3dcb98ecf29f 247 #endif
peu605 7:3dcb98ecf29f 248
peu605 7:3dcb98ecf29f 249 writecommand(CMD_FRMCTR1);//Frame Rate Control (In normal mode/Full colors)
peu605 7:3dcb98ecf29f 250 writedata(0x08);//0x0C//0x08
peu605 7:3dcb98ecf29f 251 writedata(0x02);//0x14//0x08
peu605 7:3dcb98ecf29f 252 wait_ms(1);
peu605 7:3dcb98ecf29f 253 writecommand(CMD_DINVCTR);//display inversion
peu605 7:3dcb98ecf29f 254 writedata(0x07);
peu605 7:3dcb98ecf29f 255 wait_ms(1);
peu605 7:3dcb98ecf29f 256 writecommand(CMD_PWCTR1);//Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD
peu605 7:3dcb98ecf29f 257 writedata(0x0A);//4.30 - 0x0A
peu605 7:3dcb98ecf29f 258 writedata(0x02);//0x05
peu605 7:3dcb98ecf29f 259 wait_ms(1);
peu605 7:3dcb98ecf29f 260 writecommand(CMD_PWCTR2);//Set BT[2:0] for AVDD & VCL & VGH & VGL
peu605 7:3dcb98ecf29f 261 writedata(0x02);
peu605 7:3dcb98ecf29f 262 wait_ms(1);
peu605 7:3dcb98ecf29f 263 writecommand(CMD_VCOMCTR1);//Set VMH[6:0] & VML[6:0] for VOMH & VCOML
peu605 7:3dcb98ecf29f 264 writedata(0x50);//0x50
peu605 7:3dcb98ecf29f 265 writedata(99);//0x5b
peu605 7:3dcb98ecf29f 266 wait_ms(1);
peu605 7:3dcb98ecf29f 267 writecommand(CMD_VCOMOFFS);
peu605 7:3dcb98ecf29f 268 writedata(0);//0x40
peu605 7:3dcb98ecf29f 269 wait_ms(1);
peu605 7:3dcb98ecf29f 270
peu605 7:3dcb98ecf29f 271 colorSpace(_colorspaceData);
peu605 7:3dcb98ecf29f 272 setRotation(0);
peu605 10:1ebc27775d92 273 defineScrollArea(0, 0); // top, bottom
peu605 7:3dcb98ecf29f 274 wait_ms(1);
peu605 7:3dcb98ecf29f 275
peu605 7:3dcb98ecf29f 276 fillScreen(BLACK);
peu605 7:3dcb98ecf29f 277 writecommand(CMD_DISPON);//display ON
peu605 7:3dcb98ecf29f 278 }
peu605 7:3dcb98ecf29f 279
peu605 7:3dcb98ecf29f 280 /*
peu605 7:3dcb98ecf29f 281 Colorspace selection:
peu605 7:3dcb98ecf29f 282 0: RGB
peu605 7:3dcb98ecf29f 283 1: GBR
peu605 7:3dcb98ecf29f 284 */
peu605 7:3dcb98ecf29f 285 void TFT_ILI9163C_BASE::colorSpace(uint8_t cspace) {
peu605 7:3dcb98ecf29f 286 if (cspace < 1){
peu605 7:3dcb98ecf29f 287 _Mactrl_Data &= ~(1 << 3); // bitClear(_Mactrl_Data,3);
peu605 7:3dcb98ecf29f 288 } else {
peu605 7:3dcb98ecf29f 289 _Mactrl_Data |= 1 << 3; // bitSet(_Mactrl_Data,3);
peu605 7:3dcb98ecf29f 290 }
peu605 7:3dcb98ecf29f 291 }
peu605 7:3dcb98ecf29f 292
peu605 7:3dcb98ecf29f 293
peu605 7:3dcb98ecf29f 294 void TFT_ILI9163C_BASE::clearScreen(uint16_t color) {
peu605 7:3dcb98ecf29f 295 homeAddress();
peu605 7:3dcb98ecf29f 296 writedata16burst(color, _GRAMSIZE);
peu605 7:3dcb98ecf29f 297 }
peu605 7:3dcb98ecf29f 298
peu605 7:3dcb98ecf29f 299 void TFT_ILI9163C_BASE::homeAddress() {
peu605 7:3dcb98ecf29f 300 setAddrWindow(0x00,0x00,_GRAMWIDTH-1,_GRAMHEIGH-1);
peu605 7:3dcb98ecf29f 301 }
peu605 7:3dcb98ecf29f 302
peu605 7:3dcb98ecf29f 303
peu605 7:3dcb98ecf29f 304 void TFT_ILI9163C_BASE::setCursor(int16_t x, int16_t y) {
peu605 7:3dcb98ecf29f 305 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 306 setAddrWindow(0x00,0x00,x,y);
peu605 7:3dcb98ecf29f 307 cursor_x = x;
peu605 7:3dcb98ecf29f 308 cursor_y = y;
peu605 7:3dcb98ecf29f 309 }
peu605 7:3dcb98ecf29f 310
peu605 7:3dcb98ecf29f 311
peu605 7:3dcb98ecf29f 312 void TFT_ILI9163C_BASE::pushColor(uint16_t color) {
peu605 7:3dcb98ecf29f 313 writedata16(color);
peu605 7:3dcb98ecf29f 314 }
peu605 7:3dcb98ecf29f 315
peu605 7:3dcb98ecf29f 316
peu605 7:3dcb98ecf29f 317 void TFT_ILI9163C_BASE::drawPixel(int16_t x, int16_t y, uint16_t color) {
peu605 7:3dcb98ecf29f 318 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 319 if ((x < 0) || (y < 0)) return;
peu605 7:3dcb98ecf29f 320 setAddrWindow(x,y,x+1,y+1);
peu605 7:3dcb98ecf29f 321 writedata16(color);
peu605 7:3dcb98ecf29f 322 }
peu605 7:3dcb98ecf29f 323
peu605 7:3dcb98ecf29f 324
peu605 7:3dcb98ecf29f 325 void TFT_ILI9163C_BASE::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
peu605 7:3dcb98ecf29f 326 // Rudimentary clipping
peu605 7:3dcb98ecf29f 327 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 328 if (((y + h) - 1) >= _height) h = _height-y;
peu605 7:3dcb98ecf29f 329
peu605 7:3dcb98ecf29f 330 setAddrWindow(x,y,x,(y+h)-1);
peu605 7:3dcb98ecf29f 331 writedata16burst(color, h);
peu605 7:3dcb98ecf29f 332 }
peu605 7:3dcb98ecf29f 333
peu605 7:3dcb98ecf29f 334 inline bool TFT_ILI9163C_BASE::boundaryCheck(int16_t x,int16_t y){
peu605 7:3dcb98ecf29f 335 if ((x >= _width) || (y >= _height)) return true;
peu605 7:3dcb98ecf29f 336 return false;
peu605 7:3dcb98ecf29f 337 }
peu605 7:3dcb98ecf29f 338
peu605 7:3dcb98ecf29f 339 void TFT_ILI9163C_BASE::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
peu605 7:3dcb98ecf29f 340 // Rudimentary clipping
peu605 7:3dcb98ecf29f 341 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 342 if (((x+w) - 1) >= _width) w = _width-x;
peu605 7:3dcb98ecf29f 343
peu605 7:3dcb98ecf29f 344 setAddrWindow(x,y,(x+w)-1,y);
peu605 7:3dcb98ecf29f 345 writedata16burst(color, w);
peu605 7:3dcb98ecf29f 346 }
peu605 7:3dcb98ecf29f 347
peu605 7:3dcb98ecf29f 348 void TFT_ILI9163C_BASE::fillScreen(uint16_t color) {
peu605 7:3dcb98ecf29f 349 clearScreen(color);
peu605 7:3dcb98ecf29f 350 }
peu605 7:3dcb98ecf29f 351
peu605 7:3dcb98ecf29f 352 // fill a rectangle
peu605 7:3dcb98ecf29f 353 void TFT_ILI9163C_BASE::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
peu605 7:3dcb98ecf29f 354
peu605 7:3dcb98ecf29f 355 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 356 if (((x + w) - 1) >= _width) w = _width - x;
peu605 7:3dcb98ecf29f 357 if (((y + h) - 1) >= _height) h = _height - y;
peu605 7:3dcb98ecf29f 358
peu605 7:3dcb98ecf29f 359 setAddrWindow(x,y,(x+w)-1,(y+h)-1);
peu605 7:3dcb98ecf29f 360 writedata16burst(color, w * h);
peu605 7:3dcb98ecf29f 361 }
peu605 7:3dcb98ecf29f 362
peu605 7:3dcb98ecf29f 363
peu605 7:3dcb98ecf29f 364 // Pass 8-bit (each) R,G,B, get back 16-bit packed color
peu605 7:3dcb98ecf29f 365
peu605 7:3dcb98ecf29f 366 uint16_t TFT_ILI9163C_BASE::Color565(uint8_t r, uint8_t g, uint8_t b) {
peu605 7:3dcb98ecf29f 367 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
peu605 7:3dcb98ecf29f 368 }
peu605 7:3dcb98ecf29f 369
peu605 7:3dcb98ecf29f 370
peu605 7:3dcb98ecf29f 371 void TFT_ILI9163C_BASE::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
peu605 7:3dcb98ecf29f 372
peu605 7:3dcb98ecf29f 373 writecommand(CMD_CLMADRS); // Column
peu605 7:3dcb98ecf29f 374
peu605 7:3dcb98ecf29f 375 if (rotation == 1) {
peu605 7:3dcb98ecf29f 376 writedata32(x0 + __OFFSET, x1 + __OFFSET);
peu605 7:3dcb98ecf29f 377 } else {
peu605 7:3dcb98ecf29f 378 writedata32(x0, x1);
peu605 7:3dcb98ecf29f 379 }
peu605 7:3dcb98ecf29f 380
peu605 7:3dcb98ecf29f 381 writecommand(CMD_PGEADRS); // Page
peu605 7:3dcb98ecf29f 382 if (rotation == 0){
peu605 7:3dcb98ecf29f 383 writedata32(y0 + __OFFSET, y1 + __OFFSET);
peu605 7:3dcb98ecf29f 384 } else {
peu605 7:3dcb98ecf29f 385 writedata32(y0, y1);
peu605 7:3dcb98ecf29f 386 }
peu605 7:3dcb98ecf29f 387
peu605 7:3dcb98ecf29f 388 writecommand(CMD_RAMWR); //Into RAM
peu605 7:3dcb98ecf29f 389 }
peu605 7:3dcb98ecf29f 390
peu605 7:3dcb98ecf29f 391
peu605 7:3dcb98ecf29f 392 void TFT_ILI9163C_BASE::setRotation(uint8_t m) {
peu605 7:3dcb98ecf29f 393 rotation = m &3; // can't be higher than 3
peu605 7:3dcb98ecf29f 394 switch (rotation) {
peu605 7:3dcb98ecf29f 395 case 0:
peu605 7:3dcb98ecf29f 396 _Mactrl_Data = 0x08; // 0b00001000;
peu605 7:3dcb98ecf29f 397 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 398 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 399 break;
peu605 7:3dcb98ecf29f 400 case 1:
peu605 7:3dcb98ecf29f 401 _Mactrl_Data = 0x68; // 0b01101000;
peu605 7:3dcb98ecf29f 402 _width = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 403 _height = _TFTWIDTH;
peu605 7:3dcb98ecf29f 404 break;
peu605 7:3dcb98ecf29f 405 case 2:
peu605 7:3dcb98ecf29f 406 _Mactrl_Data = 0xC8; // 0b11001000;
peu605 7:3dcb98ecf29f 407 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 408 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 409 break;
peu605 7:3dcb98ecf29f 410 case 3:
peu605 7:3dcb98ecf29f 411 _Mactrl_Data = 0xA8; // 0b10101000;
peu605 7:3dcb98ecf29f 412 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 413 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 414 break;
peu605 7:3dcb98ecf29f 415 }
peu605 7:3dcb98ecf29f 416 colorSpace(_colorspaceData);
peu605 7:3dcb98ecf29f 417 writecommand(CMD_MADCTL);
peu605 7:3dcb98ecf29f 418 writedata(_Mactrl_Data);
peu605 7:3dcb98ecf29f 419 }
peu605 7:3dcb98ecf29f 420
peu605 7:3dcb98ecf29f 421
peu605 7:3dcb98ecf29f 422 void TFT_ILI9163C_BASE::invertDisplay(bool i) {
peu605 7:3dcb98ecf29f 423 writecommand(i ? CMD_DINVON : CMD_DINVOF);
peu605 7:3dcb98ecf29f 424 }
peu605 10:1ebc27775d92 425
peu605 10:1ebc27775d92 426 void TFT_ILI9163C_BASE::display(bool onOff) {
peu605 10:1ebc27775d92 427 if (onOff){
peu605 10:1ebc27775d92 428 writecommand(CMD_DISPON);
peu605 10:1ebc27775d92 429 } else {
peu605 10:1ebc27775d92 430 writecommand(CMD_DISPOFF);
peu605 10:1ebc27775d92 431 }
peu605 10:1ebc27775d92 432 }
peu605 10:1ebc27775d92 433
peu605 10:1ebc27775d92 434 void TFT_ILI9163C_BASE::sleepMode(bool mode) {
peu605 10:1ebc27775d92 435 if (mode){
peu605 10:1ebc27775d92 436 if (sleep == 1) return;//already sleeping
peu605 10:1ebc27775d92 437 sleep = 1;
peu605 10:1ebc27775d92 438 writecommand(CMD_SLPIN);
peu605 10:1ebc27775d92 439 wait_ms(5);//needed
peu605 10:1ebc27775d92 440 } else {
peu605 10:1ebc27775d92 441 if (sleep == 0) return; //Already awake
peu605 10:1ebc27775d92 442 sleep = 0;
peu605 10:1ebc27775d92 443 writecommand(CMD_SLPOUT);
peu605 10:1ebc27775d92 444 wait_ms(120);//needed
peu605 10:1ebc27775d92 445 }
peu605 10:1ebc27775d92 446 }
peu605 10:1ebc27775d92 447
peu605 10:1ebc27775d92 448
peu605 10:1ebc27775d92 449 void TFT_ILI9163C_BASE::defineScrollArea(uint16_t tfa, uint16_t bfa){
peu605 10:1ebc27775d92 450 tfa += __OFFSET ;
peu605 10:1ebc27775d92 451 int16_t vsa = _GRAMHEIGH - tfa - bfa;
peu605 10:1ebc27775d92 452 if (vsa >= 0) {
peu605 10:1ebc27775d92 453 writecommand(CMD_VSCLLDEF);
peu605 10:1ebc27775d92 454 writedata16(tfa);
peu605 10:1ebc27775d92 455 writedata16(vsa);
peu605 10:1ebc27775d92 456 writedata16(bfa);
peu605 10:1ebc27775d92 457 }
peu605 10:1ebc27775d92 458 }
peu605 10:1ebc27775d92 459
peu605 10:1ebc27775d92 460 void TFT_ILI9163C_BASE::scroll(uint16_t ssa) {
peu605 10:1ebc27775d92 461 if (ssa <= _TFTHEIGHT) {
peu605 10:1ebc27775d92 462 writecommand(CMD_VSSTADRS);
peu605 10:1ebc27775d92 463 writedata16(ssa + __OFFSET);
peu605 10:1ebc27775d92 464 }
peu605 10:1ebc27775d92 465 }