marco valli / TFT_ILI9163C

Dependents:   TFTLCDSCREEN Pong_ILI9163C

Fork of TFT_ILI9163C by _ peu605

Committer:
peu605
Date:
Wed Jan 21 14:32:07 2015 +0000
Revision:
0:f90a4405ef98
Child:
1:c271e7e2e330
initial

Who changed what in which revision?

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