for Arduino TFT LCD Screen 160x128
Dependents: TFTLCDSCREEN Pong_ILI9163C
Fork of TFT_ILI9163C by
TFT_ILI9163C_BASE.cpp@8:8dea70cf3ae8, 2015-02-03 (annotated)
- Committer:
- peu605
- Date:
- Tue Feb 03 11:13:35 2015 +0000
- Revision:
- 8:8dea70cf3ae8
- Parent:
- 7:3dcb98ecf29f
- Child:
- 10:1ebc27775d92
DMA_IT
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:3dcb98ecf29f | 273 | wait_ms(1); |
peu605 | 7:3dcb98ecf29f | 274 | |
peu605 | 7:3dcb98ecf29f | 275 | fillScreen(BLACK); |
peu605 | 7:3dcb98ecf29f | 276 | writecommand(CMD_DISPON);//display ON |
peu605 | 7:3dcb98ecf29f | 277 | } |
peu605 | 7:3dcb98ecf29f | 278 | |
peu605 | 7:3dcb98ecf29f | 279 | /* |
peu605 | 7:3dcb98ecf29f | 280 | Colorspace selection: |
peu605 | 7:3dcb98ecf29f | 281 | 0: RGB |
peu605 | 7:3dcb98ecf29f | 282 | 1: GBR |
peu605 | 7:3dcb98ecf29f | 283 | */ |
peu605 | 7:3dcb98ecf29f | 284 | void TFT_ILI9163C_BASE::colorSpace(uint8_t cspace) { |
peu605 | 7:3dcb98ecf29f | 285 | if (cspace < 1){ |
peu605 | 7:3dcb98ecf29f | 286 | _Mactrl_Data &= ~(1 << 3); // bitClear(_Mactrl_Data,3); |
peu605 | 7:3dcb98ecf29f | 287 | } else { |
peu605 | 7:3dcb98ecf29f | 288 | _Mactrl_Data |= 1 << 3; // bitSet(_Mactrl_Data,3); |
peu605 | 7:3dcb98ecf29f | 289 | } |
peu605 | 7:3dcb98ecf29f | 290 | } |
peu605 | 7:3dcb98ecf29f | 291 | |
peu605 | 7:3dcb98ecf29f | 292 | |
peu605 | 7:3dcb98ecf29f | 293 | void TFT_ILI9163C_BASE::clearScreen(uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 294 | homeAddress(); |
peu605 | 7:3dcb98ecf29f | 295 | writedata16burst(color, _GRAMSIZE); |
peu605 | 7:3dcb98ecf29f | 296 | } |
peu605 | 7:3dcb98ecf29f | 297 | |
peu605 | 7:3dcb98ecf29f | 298 | void TFT_ILI9163C_BASE::homeAddress() { |
peu605 | 7:3dcb98ecf29f | 299 | setAddrWindow(0x00,0x00,_GRAMWIDTH-1,_GRAMHEIGH-1); |
peu605 | 7:3dcb98ecf29f | 300 | } |
peu605 | 7:3dcb98ecf29f | 301 | |
peu605 | 7:3dcb98ecf29f | 302 | |
peu605 | 7:3dcb98ecf29f | 303 | void TFT_ILI9163C_BASE::setCursor(int16_t x, int16_t y) { |
peu605 | 7:3dcb98ecf29f | 304 | if (boundaryCheck(x,y)) return; |
peu605 | 7:3dcb98ecf29f | 305 | setAddrWindow(0x00,0x00,x,y); |
peu605 | 7:3dcb98ecf29f | 306 | cursor_x = x; |
peu605 | 7:3dcb98ecf29f | 307 | cursor_y = y; |
peu605 | 7:3dcb98ecf29f | 308 | } |
peu605 | 7:3dcb98ecf29f | 309 | |
peu605 | 7:3dcb98ecf29f | 310 | |
peu605 | 7:3dcb98ecf29f | 311 | void TFT_ILI9163C_BASE::pushColor(uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 312 | writedata16(color); |
peu605 | 7:3dcb98ecf29f | 313 | } |
peu605 | 7:3dcb98ecf29f | 314 | |
peu605 | 7:3dcb98ecf29f | 315 | |
peu605 | 7:3dcb98ecf29f | 316 | void TFT_ILI9163C_BASE::drawPixel(int16_t x, int16_t y, uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 317 | if (boundaryCheck(x,y)) return; |
peu605 | 7:3dcb98ecf29f | 318 | if ((x < 0) || (y < 0)) return; |
peu605 | 7:3dcb98ecf29f | 319 | setAddrWindow(x,y,x+1,y+1); |
peu605 | 7:3dcb98ecf29f | 320 | writedata16(color); |
peu605 | 7:3dcb98ecf29f | 321 | } |
peu605 | 7:3dcb98ecf29f | 322 | |
peu605 | 7:3dcb98ecf29f | 323 | |
peu605 | 7:3dcb98ecf29f | 324 | void TFT_ILI9163C_BASE::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 325 | // Rudimentary clipping |
peu605 | 7:3dcb98ecf29f | 326 | if (boundaryCheck(x,y)) return; |
peu605 | 7:3dcb98ecf29f | 327 | if (((y + h) - 1) >= _height) h = _height-y; |
peu605 | 7:3dcb98ecf29f | 328 | |
peu605 | 7:3dcb98ecf29f | 329 | setAddrWindow(x,y,x,(y+h)-1); |
peu605 | 7:3dcb98ecf29f | 330 | writedata16burst(color, h); |
peu605 | 7:3dcb98ecf29f | 331 | } |
peu605 | 7:3dcb98ecf29f | 332 | |
peu605 | 7:3dcb98ecf29f | 333 | inline bool TFT_ILI9163C_BASE::boundaryCheck(int16_t x,int16_t y){ |
peu605 | 7:3dcb98ecf29f | 334 | if ((x >= _width) || (y >= _height)) return true; |
peu605 | 7:3dcb98ecf29f | 335 | return false; |
peu605 | 7:3dcb98ecf29f | 336 | } |
peu605 | 7:3dcb98ecf29f | 337 | |
peu605 | 7:3dcb98ecf29f | 338 | void TFT_ILI9163C_BASE::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 339 | // Rudimentary clipping |
peu605 | 7:3dcb98ecf29f | 340 | if (boundaryCheck(x,y)) return; |
peu605 | 7:3dcb98ecf29f | 341 | if (((x+w) - 1) >= _width) w = _width-x; |
peu605 | 7:3dcb98ecf29f | 342 | |
peu605 | 7:3dcb98ecf29f | 343 | setAddrWindow(x,y,(x+w)-1,y); |
peu605 | 7:3dcb98ecf29f | 344 | writedata16burst(color, w); |
peu605 | 7:3dcb98ecf29f | 345 | } |
peu605 | 7:3dcb98ecf29f | 346 | |
peu605 | 7:3dcb98ecf29f | 347 | void TFT_ILI9163C_BASE::fillScreen(uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 348 | clearScreen(color); |
peu605 | 7:3dcb98ecf29f | 349 | } |
peu605 | 7:3dcb98ecf29f | 350 | |
peu605 | 7:3dcb98ecf29f | 351 | // fill a rectangle |
peu605 | 7:3dcb98ecf29f | 352 | void TFT_ILI9163C_BASE::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { |
peu605 | 7:3dcb98ecf29f | 353 | |
peu605 | 7:3dcb98ecf29f | 354 | if (boundaryCheck(x,y)) return; |
peu605 | 7:3dcb98ecf29f | 355 | if (((x + w) - 1) >= _width) w = _width - x; |
peu605 | 7:3dcb98ecf29f | 356 | if (((y + h) - 1) >= _height) h = _height - y; |
peu605 | 7:3dcb98ecf29f | 357 | |
peu605 | 7:3dcb98ecf29f | 358 | setAddrWindow(x,y,(x+w)-1,(y+h)-1); |
peu605 | 7:3dcb98ecf29f | 359 | writedata16burst(color, w * h); |
peu605 | 7:3dcb98ecf29f | 360 | } |
peu605 | 7:3dcb98ecf29f | 361 | |
peu605 | 7:3dcb98ecf29f | 362 | |
peu605 | 7:3dcb98ecf29f | 363 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color |
peu605 | 7:3dcb98ecf29f | 364 | |
peu605 | 7:3dcb98ecf29f | 365 | uint16_t TFT_ILI9163C_BASE::Color565(uint8_t r, uint8_t g, uint8_t b) { |
peu605 | 7:3dcb98ecf29f | 366 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); |
peu605 | 7:3dcb98ecf29f | 367 | } |
peu605 | 7:3dcb98ecf29f | 368 | |
peu605 | 7:3dcb98ecf29f | 369 | |
peu605 | 7:3dcb98ecf29f | 370 | void TFT_ILI9163C_BASE::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { |
peu605 | 7:3dcb98ecf29f | 371 | |
peu605 | 7:3dcb98ecf29f | 372 | writecommand(CMD_CLMADRS); // Column |
peu605 | 7:3dcb98ecf29f | 373 | |
peu605 | 7:3dcb98ecf29f | 374 | if (rotation == 1) { |
peu605 | 7:3dcb98ecf29f | 375 | writedata32(x0 + __OFFSET, x1 + __OFFSET); |
peu605 | 7:3dcb98ecf29f | 376 | } else { |
peu605 | 7:3dcb98ecf29f | 377 | writedata32(x0, x1); |
peu605 | 7:3dcb98ecf29f | 378 | } |
peu605 | 7:3dcb98ecf29f | 379 | |
peu605 | 7:3dcb98ecf29f | 380 | writecommand(CMD_PGEADRS); // Page |
peu605 | 7:3dcb98ecf29f | 381 | if (rotation == 0){ |
peu605 | 7:3dcb98ecf29f | 382 | writedata32(y0 + __OFFSET, y1 + __OFFSET); |
peu605 | 7:3dcb98ecf29f | 383 | } else { |
peu605 | 7:3dcb98ecf29f | 384 | writedata32(y0, y1); |
peu605 | 7:3dcb98ecf29f | 385 | } |
peu605 | 7:3dcb98ecf29f | 386 | |
peu605 | 7:3dcb98ecf29f | 387 | writecommand(CMD_RAMWR); //Into RAM |
peu605 | 7:3dcb98ecf29f | 388 | } |
peu605 | 7:3dcb98ecf29f | 389 | |
peu605 | 7:3dcb98ecf29f | 390 | |
peu605 | 7:3dcb98ecf29f | 391 | void TFT_ILI9163C_BASE::setRotation(uint8_t m) { |
peu605 | 7:3dcb98ecf29f | 392 | rotation = m &3; // can't be higher than 3 |
peu605 | 7:3dcb98ecf29f | 393 | switch (rotation) { |
peu605 | 7:3dcb98ecf29f | 394 | case 0: |
peu605 | 7:3dcb98ecf29f | 395 | _Mactrl_Data = 0x08; // 0b00001000; |
peu605 | 7:3dcb98ecf29f | 396 | _width = _TFTWIDTH; |
peu605 | 7:3dcb98ecf29f | 397 | _height = _TFTHEIGHT;//-__OFFSET; |
peu605 | 7:3dcb98ecf29f | 398 | break; |
peu605 | 7:3dcb98ecf29f | 399 | case 1: |
peu605 | 7:3dcb98ecf29f | 400 | _Mactrl_Data = 0x68; // 0b01101000; |
peu605 | 7:3dcb98ecf29f | 401 | _width = _TFTHEIGHT;//-__OFFSET; |
peu605 | 7:3dcb98ecf29f | 402 | _height = _TFTWIDTH; |
peu605 | 7:3dcb98ecf29f | 403 | break; |
peu605 | 7:3dcb98ecf29f | 404 | case 2: |
peu605 | 7:3dcb98ecf29f | 405 | _Mactrl_Data = 0xC8; // 0b11001000; |
peu605 | 7:3dcb98ecf29f | 406 | _width = _TFTWIDTH; |
peu605 | 7:3dcb98ecf29f | 407 | _height = _TFTHEIGHT;//-__OFFSET; |
peu605 | 7:3dcb98ecf29f | 408 | break; |
peu605 | 7:3dcb98ecf29f | 409 | case 3: |
peu605 | 7:3dcb98ecf29f | 410 | _Mactrl_Data = 0xA8; // 0b10101000; |
peu605 | 7:3dcb98ecf29f | 411 | _width = _TFTWIDTH; |
peu605 | 7:3dcb98ecf29f | 412 | _height = _TFTHEIGHT;//-__OFFSET; |
peu605 | 7:3dcb98ecf29f | 413 | break; |
peu605 | 7:3dcb98ecf29f | 414 | } |
peu605 | 7:3dcb98ecf29f | 415 | colorSpace(_colorspaceData); |
peu605 | 7:3dcb98ecf29f | 416 | writecommand(CMD_MADCTL); |
peu605 | 7:3dcb98ecf29f | 417 | writedata(_Mactrl_Data); |
peu605 | 7:3dcb98ecf29f | 418 | } |
peu605 | 7:3dcb98ecf29f | 419 | |
peu605 | 7:3dcb98ecf29f | 420 | |
peu605 | 7:3dcb98ecf29f | 421 | void TFT_ILI9163C_BASE::invertDisplay(bool i) { |
peu605 | 7:3dcb98ecf29f | 422 | writecommand(i ? CMD_DINVON : CMD_DINVOF); |
peu605 | 7:3dcb98ecf29f | 423 | } |