for Arduino TFT LCD Screen 160x128

Dependents:   TFTLCDSCREEN Pong_ILI9163C

Fork of TFT_ILI9163C by _ peu605

Committer:
billycorgan123
Date:
Fri Mar 04 08:55:32 2016 +0000
Revision:
12:f0799be044ff
Parent:
11:4dd4a2f7b7f6
first trial with Arduino TFT LCD Screen, ILI9163

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 11:4dd4a2f7b7f6 295 scroll(0);
peu605 7:3dcb98ecf29f 296 homeAddress();
peu605 7:3dcb98ecf29f 297 writedata16burst(color, _GRAMSIZE);
peu605 7:3dcb98ecf29f 298 }
peu605 7:3dcb98ecf29f 299
peu605 7:3dcb98ecf29f 300 void TFT_ILI9163C_BASE::homeAddress() {
peu605 7:3dcb98ecf29f 301 setAddrWindow(0x00,0x00,_GRAMWIDTH-1,_GRAMHEIGH-1);
peu605 7:3dcb98ecf29f 302 }
peu605 7:3dcb98ecf29f 303
peu605 7:3dcb98ecf29f 304
peu605 7:3dcb98ecf29f 305 void TFT_ILI9163C_BASE::setCursor(int16_t x, int16_t y) {
peu605 7:3dcb98ecf29f 306 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 307 setAddrWindow(0x00,0x00,x,y);
peu605 7:3dcb98ecf29f 308 cursor_x = x;
peu605 7:3dcb98ecf29f 309 cursor_y = y;
peu605 7:3dcb98ecf29f 310 }
peu605 7:3dcb98ecf29f 311
peu605 7:3dcb98ecf29f 312
peu605 7:3dcb98ecf29f 313 void TFT_ILI9163C_BASE::pushColor(uint16_t color) {
peu605 7:3dcb98ecf29f 314 writedata16(color);
peu605 7:3dcb98ecf29f 315 }
peu605 7:3dcb98ecf29f 316
peu605 7:3dcb98ecf29f 317
peu605 7:3dcb98ecf29f 318 void TFT_ILI9163C_BASE::drawPixel(int16_t x, int16_t y, uint16_t color) {
peu605 7:3dcb98ecf29f 319 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 320 if ((x < 0) || (y < 0)) return;
peu605 7:3dcb98ecf29f 321 setAddrWindow(x,y,x+1,y+1);
peu605 7:3dcb98ecf29f 322 writedata16(color);
peu605 7:3dcb98ecf29f 323 }
peu605 7:3dcb98ecf29f 324
peu605 7:3dcb98ecf29f 325
peu605 7:3dcb98ecf29f 326 void TFT_ILI9163C_BASE::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
peu605 7:3dcb98ecf29f 327 // Rudimentary clipping
peu605 7:3dcb98ecf29f 328 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 329 if (((y + h) - 1) >= _height) h = _height-y;
peu605 7:3dcb98ecf29f 330
peu605 7:3dcb98ecf29f 331 setAddrWindow(x,y,x,(y+h)-1);
peu605 7:3dcb98ecf29f 332 writedata16burst(color, h);
peu605 7:3dcb98ecf29f 333 }
peu605 7:3dcb98ecf29f 334
peu605 7:3dcb98ecf29f 335 inline bool TFT_ILI9163C_BASE::boundaryCheck(int16_t x,int16_t y){
peu605 7:3dcb98ecf29f 336 if ((x >= _width) || (y >= _height)) return true;
peu605 7:3dcb98ecf29f 337 return false;
peu605 7:3dcb98ecf29f 338 }
peu605 7:3dcb98ecf29f 339
peu605 7:3dcb98ecf29f 340 void TFT_ILI9163C_BASE::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
peu605 7:3dcb98ecf29f 341 // Rudimentary clipping
peu605 7:3dcb98ecf29f 342 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 343 if (((x+w) - 1) >= _width) w = _width-x;
peu605 7:3dcb98ecf29f 344
peu605 7:3dcb98ecf29f 345 setAddrWindow(x,y,(x+w)-1,y);
peu605 7:3dcb98ecf29f 346 writedata16burst(color, w);
peu605 7:3dcb98ecf29f 347 }
peu605 7:3dcb98ecf29f 348
peu605 7:3dcb98ecf29f 349 void TFT_ILI9163C_BASE::fillScreen(uint16_t color) {
peu605 7:3dcb98ecf29f 350 clearScreen(color);
peu605 7:3dcb98ecf29f 351 }
peu605 7:3dcb98ecf29f 352
peu605 7:3dcb98ecf29f 353 // fill a rectangle
peu605 7:3dcb98ecf29f 354 void TFT_ILI9163C_BASE::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
peu605 7:3dcb98ecf29f 355
peu605 7:3dcb98ecf29f 356 if (boundaryCheck(x,y)) return;
peu605 7:3dcb98ecf29f 357 if (((x + w) - 1) >= _width) w = _width - x;
peu605 7:3dcb98ecf29f 358 if (((y + h) - 1) >= _height) h = _height - y;
peu605 7:3dcb98ecf29f 359
peu605 7:3dcb98ecf29f 360 setAddrWindow(x,y,(x+w)-1,(y+h)-1);
peu605 7:3dcb98ecf29f 361 writedata16burst(color, w * h);
peu605 7:3dcb98ecf29f 362 }
peu605 7:3dcb98ecf29f 363
peu605 7:3dcb98ecf29f 364
peu605 7:3dcb98ecf29f 365 // Pass 8-bit (each) R,G,B, get back 16-bit packed color
peu605 7:3dcb98ecf29f 366
peu605 7:3dcb98ecf29f 367 uint16_t TFT_ILI9163C_BASE::Color565(uint8_t r, uint8_t g, uint8_t b) {
peu605 7:3dcb98ecf29f 368 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
peu605 7:3dcb98ecf29f 369 }
peu605 7:3dcb98ecf29f 370
peu605 7:3dcb98ecf29f 371
peu605 7:3dcb98ecf29f 372 void TFT_ILI9163C_BASE::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
peu605 7:3dcb98ecf29f 373
peu605 7:3dcb98ecf29f 374 writecommand(CMD_CLMADRS); // Column
peu605 7:3dcb98ecf29f 375
peu605 7:3dcb98ecf29f 376 if (rotation == 1) {
peu605 7:3dcb98ecf29f 377 writedata32(x0 + __OFFSET, x1 + __OFFSET);
peu605 7:3dcb98ecf29f 378 } else {
peu605 7:3dcb98ecf29f 379 writedata32(x0, x1);
peu605 7:3dcb98ecf29f 380 }
peu605 7:3dcb98ecf29f 381
peu605 7:3dcb98ecf29f 382 writecommand(CMD_PGEADRS); // Page
peu605 7:3dcb98ecf29f 383 if (rotation == 0){
peu605 7:3dcb98ecf29f 384 writedata32(y0 + __OFFSET, y1 + __OFFSET);
peu605 7:3dcb98ecf29f 385 } else {
peu605 7:3dcb98ecf29f 386 writedata32(y0, y1);
peu605 7:3dcb98ecf29f 387 }
peu605 7:3dcb98ecf29f 388
peu605 7:3dcb98ecf29f 389 writecommand(CMD_RAMWR); //Into RAM
peu605 7:3dcb98ecf29f 390 }
peu605 7:3dcb98ecf29f 391
peu605 7:3dcb98ecf29f 392
peu605 7:3dcb98ecf29f 393 void TFT_ILI9163C_BASE::setRotation(uint8_t m) {
peu605 7:3dcb98ecf29f 394 rotation = m &3; // can't be higher than 3
peu605 7:3dcb98ecf29f 395 switch (rotation) {
peu605 7:3dcb98ecf29f 396 case 0:
peu605 7:3dcb98ecf29f 397 _Mactrl_Data = 0x08; // 0b00001000;
peu605 7:3dcb98ecf29f 398 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 399 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 400 break;
peu605 7:3dcb98ecf29f 401 case 1:
peu605 7:3dcb98ecf29f 402 _Mactrl_Data = 0x68; // 0b01101000;
peu605 7:3dcb98ecf29f 403 _width = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 404 _height = _TFTWIDTH;
peu605 7:3dcb98ecf29f 405 break;
peu605 7:3dcb98ecf29f 406 case 2:
peu605 7:3dcb98ecf29f 407 _Mactrl_Data = 0xC8; // 0b11001000;
peu605 7:3dcb98ecf29f 408 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 409 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 410 break;
peu605 7:3dcb98ecf29f 411 case 3:
peu605 7:3dcb98ecf29f 412 _Mactrl_Data = 0xA8; // 0b10101000;
peu605 7:3dcb98ecf29f 413 _width = _TFTWIDTH;
peu605 7:3dcb98ecf29f 414 _height = _TFTHEIGHT;//-__OFFSET;
peu605 7:3dcb98ecf29f 415 break;
peu605 7:3dcb98ecf29f 416 }
peu605 7:3dcb98ecf29f 417 colorSpace(_colorspaceData);
peu605 7:3dcb98ecf29f 418 writecommand(CMD_MADCTL);
peu605 7:3dcb98ecf29f 419 writedata(_Mactrl_Data);
peu605 7:3dcb98ecf29f 420 }
peu605 7:3dcb98ecf29f 421
peu605 7:3dcb98ecf29f 422
peu605 7:3dcb98ecf29f 423 void TFT_ILI9163C_BASE::invertDisplay(bool i) {
peu605 7:3dcb98ecf29f 424 writecommand(i ? CMD_DINVON : CMD_DINVOF);
peu605 7:3dcb98ecf29f 425 }
peu605 10:1ebc27775d92 426
peu605 10:1ebc27775d92 427 void TFT_ILI9163C_BASE::display(bool onOff) {
peu605 10:1ebc27775d92 428 if (onOff){
peu605 10:1ebc27775d92 429 writecommand(CMD_DISPON);
peu605 10:1ebc27775d92 430 } else {
peu605 10:1ebc27775d92 431 writecommand(CMD_DISPOFF);
peu605 10:1ebc27775d92 432 }
peu605 10:1ebc27775d92 433 }
peu605 10:1ebc27775d92 434
peu605 10:1ebc27775d92 435 void TFT_ILI9163C_BASE::sleepMode(bool mode) {
peu605 10:1ebc27775d92 436 if (mode){
peu605 10:1ebc27775d92 437 if (sleep == 1) return;//already sleeping
peu605 10:1ebc27775d92 438 sleep = 1;
peu605 10:1ebc27775d92 439 writecommand(CMD_SLPIN);
peu605 10:1ebc27775d92 440 wait_ms(5);//needed
peu605 10:1ebc27775d92 441 } else {
peu605 10:1ebc27775d92 442 if (sleep == 0) return; //Already awake
peu605 10:1ebc27775d92 443 sleep = 0;
peu605 10:1ebc27775d92 444 writecommand(CMD_SLPOUT);
peu605 10:1ebc27775d92 445 wait_ms(120);//needed
peu605 10:1ebc27775d92 446 }
peu605 10:1ebc27775d92 447 }
peu605 10:1ebc27775d92 448
peu605 10:1ebc27775d92 449
peu605 10:1ebc27775d92 450 void TFT_ILI9163C_BASE::defineScrollArea(uint16_t tfa, uint16_t bfa){
peu605 10:1ebc27775d92 451 tfa += __OFFSET ;
peu605 10:1ebc27775d92 452 int16_t vsa = _GRAMHEIGH - tfa - bfa;
peu605 10:1ebc27775d92 453 if (vsa >= 0) {
peu605 10:1ebc27775d92 454 writecommand(CMD_VSCLLDEF);
peu605 10:1ebc27775d92 455 writedata16(tfa);
peu605 10:1ebc27775d92 456 writedata16(vsa);
peu605 10:1ebc27775d92 457 writedata16(bfa);
peu605 10:1ebc27775d92 458 }
peu605 10:1ebc27775d92 459 }
peu605 10:1ebc27775d92 460
peu605 10:1ebc27775d92 461 void TFT_ILI9163C_BASE::scroll(uint16_t ssa) {
peu605 10:1ebc27775d92 462 if (ssa <= _TFTHEIGHT) {
peu605 10:1ebc27775d92 463 writecommand(CMD_VSSTADRS);
peu605 10:1ebc27775d92 464 writedata16(ssa + __OFFSET);
peu605 10:1ebc27775d92 465 }
peu605 10:1ebc27775d92 466 }