Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TFTLCDSCREEN Pong_ILI9163C
Fork of TFT_ILI9163C by
TFT_ILI9163C.cpp@0:f90a4405ef98, 2015-01-21 (annotated)
- Committer:
- peu605
- Date:
- Wed Jan 21 14:32:07 2015 +0000
- Revision:
- 0:f90a4405ef98
- Child:
- 1:c271e7e2e330
initial
Who changed what in which revision?
User | Revision | Line number | New 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 | } |