for Arduino TFT LCD Screen 160x128
Dependents: TFTLCDSCREEN Pong_ILI9163C
Fork of TFT_ILI9163C by
TFT_ILI9163C_BASE.cpp
00001 #include "TFT_ILI9163C_BASE.h" 00002 #include "mbed.h" 00003 00004 /** 00005 * TFT_ILI9163C library 00006 * 00007 * @author Copyright (c) 2014, .S.U.M.O.T.O.Y., coded by Max MC Costa 00008 * https://github.com/sumotoy/TFT_ILI9163C 00009 * 00010 * @author modified by masuda, Masuda Naika 00011 */ 00012 00013 //Serial pc(SERIAL_TX, SERIAL_RX); 00014 00015 //constructors 00016 TFT_ILI9163C_BASE::TFT_ILI9163C_BASE(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc, PinName reset) 00017 : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) , SPI(mosi,miso,sclk,NC), _cs(cs, 1), _dc(dc, 0) { 00018 00019 _resetPinName = reset; 00020 init(cs, dc); 00021 } 00022 00023 TFT_ILI9163C_BASE::TFT_ILI9163C_BASE(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc) 00024 : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) , SPI(mosi,miso,sclk,NC), _cs(cs, 1), _dc(dc, 0) { 00025 00026 _resetPinName = NC; 00027 init(cs, dc); 00028 } 00029 00030 00031 void TFT_ILI9163C_BASE::init(PinName cs, PinName dc){ 00032 } 00033 00034 inline void TFT_ILI9163C_BASE::selectSlave() { 00035 _cs = 0; 00036 } 00037 00038 inline void TFT_ILI9163C_BASE::deselectSlave() { 00039 _cs = 1; 00040 } 00041 00042 inline void TFT_ILI9163C_BASE::setCommandMode() { 00043 _dc = 0; 00044 } 00045 00046 inline void TFT_ILI9163C_BASE::setDataMode() { 00047 _dc = 1; 00048 } 00049 00050 void TFT_ILI9163C_BASE::writecommand(uint8_t c){ 00051 00052 setCommandMode(); 00053 selectSlave(); 00054 00055 SPI::write(c); 00056 00057 deselectSlave(); 00058 } 00059 00060 void TFT_ILI9163C_BASE::writedata(uint8_t c){ 00061 00062 setDataMode(); 00063 selectSlave(); 00064 00065 SPI::write(c); 00066 00067 deselectSlave(); 00068 } 00069 00070 void TFT_ILI9163C_BASE::writedata16(uint16_t d){ 00071 00072 setDataMode(); 00073 selectSlave(); 00074 00075 SPI::write(d >> 8); 00076 SPI::write(d & 0xff); 00077 00078 deselectSlave(); 00079 } 00080 00081 void TFT_ILI9163C_BASE::writedata32(uint16_t d1, uint16_t d2){ 00082 00083 setDataMode(); 00084 selectSlave(); 00085 00086 SPI::write(d1 >> 8); 00087 SPI::write(d1 & 0xff); 00088 SPI::write(d2 >> 8); 00089 SPI::write(d2 & 0xff); 00090 00091 deselectSlave(); 00092 } 00093 00094 void TFT_ILI9163C_BASE::writedata16burst(uint16_t d, int32_t len) { 00095 00096 len = len < 0 ? -len : len; 00097 00098 if (len > 0) { 00099 00100 setDataMode(); 00101 selectSlave(); 00102 00103 while (len--) { 00104 SPI::write(d >> 8); 00105 SPI::write(d & 0xff); 00106 } 00107 00108 deselectSlave(); 00109 } 00110 } 00111 00112 00113 void TFT_ILI9163C_BASE::setBitrate(uint32_t n){ 00114 SPI::frequency(n); 00115 } 00116 00117 void TFT_ILI9163C_BASE::begin(void) { 00118 00119 SPI::format(8,0); // 8 bit spi mode 0 00120 SPI::frequency(5000000L); // 5MHz 00121 00122 if (_resetPinName != NC) { 00123 DigitalOut _reset(_resetPinName); 00124 _reset = 1; 00125 wait_ms(1); 00126 _reset = 0; 00127 wait_ms(2); 00128 _reset = 1; 00129 wait_ms(120); 00130 } 00131 00132 /* 00133 7) MY: 1(bottom to top), 0(top to bottom) Row Address Order 00134 6) MX: 1(R to L), 0(L to R) Column Address Order 00135 5) MV: 1(Exchanged), 0(normal) Row/Column exchange 00136 4) ML: 1(bottom to top), 0(top to bottom) Vertical Refresh Order 00137 3) RGB: 1(BGR), 0(RGB) Color Space 00138 2) MH: 1(R to L), 0(L to R) Horizontal Refresh Order 00139 1) 00140 0) 00141 00142 MY, MX, MV, ML,RGB, MH, D1, D0 00143 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //normal 00144 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //Y-Mirror 00145 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Mirror 00146 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Y-Mirror 00147 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange 00148 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange, Y-Mirror 00149 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 //XY exchange 00150 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 00151 */ 00152 _Mactrl_Data = 0; // 0b00000000; 00153 _colorspaceData = __COLORSPC;//start with default data; 00154 00155 chipInit(); 00156 } 00157 00158 00159 void TFT_ILI9163C_BASE::chipInit() { 00160 writecommand(CMD_SWRESET);//software reset 00161 wait_ms(120); 00162 writecommand(CMD_SLPOUT);//exit sleep 00163 wait_ms(5); 00164 writecommand(CMD_PIXFMT);//Set Color Format 16bit 00165 writedata(0x05); 00166 wait_ms(5); 00167 writecommand(CMD_GAMMASET);//default gamma curve 3 00168 writedata(0x04);//0x04 00169 wait_ms(1); 00170 writecommand(CMD_GAMRSEL);//Enable Gamma adj 00171 writedata(0x01); 00172 wait_ms(1); 00173 writecommand(CMD_NORML); 00174 00175 writecommand(CMD_DFUNCTR); 00176 writedata(0xff); // writedata(0b11111111);// 00177 writedata(0x06); // writedata(0b00000110);// 00178 00179 writecommand(CMD_PGAMMAC);//Positive Gamma Correction Setting 00180 #if defined(__GAMMASET1) 00181 writedata(0x36);//p1 00182 writedata(0x29);//p2 00183 writedata(0x12);//p3 00184 writedata(0x22);//p4 00185 writedata(0x1C);//p5 00186 writedata(0x15);//p6 00187 writedata(0x42);//p7 00188 writedata(0xB7);//p8 00189 writedata(0x2F);//p9 00190 writedata(0x13);//p10 00191 writedata(0x12);//p11 00192 writedata(0x0A);//p12 00193 writedata(0x11);//p13 00194 writedata(0x0B);//p14 00195 writedata(0x06);//p15 00196 #else 00197 writedata(0x3F);//p1 00198 writedata(0x25);//p2 00199 writedata(0x1C);//p3 00200 writedata(0x1E);//p4 00201 writedata(0x20);//p5 00202 writedata(0x12);//p6 00203 writedata(0x2A);//p7 00204 writedata(0x90);//p8 00205 writedata(0x24);//p9 00206 writedata(0x11);//p10 00207 writedata(0x00);//p11 00208 writedata(0x00);//p12 00209 writedata(0x00);//p13 00210 writedata(0x00);//p14 00211 writedata(0x00);//p15 00212 #endif 00213 00214 writecommand(CMD_NGAMMAC);//Negative Gamma Correction Setting 00215 #if defined(__GAMMASET1) 00216 writedata(0x09);//p1 00217 writedata(0x16);//p2 00218 writedata(0x2D);//p3 00219 writedata(0x0D);//p4 00220 writedata(0x13);//p5 00221 writedata(0x15);//p6 00222 writedata(0x40);//p7 00223 writedata(0x48);//p8 00224 writedata(0x53);//p9 00225 writedata(0x0C);//p10 00226 writedata(0x1D);//p11 00227 writedata(0x25);//p12 00228 writedata(0x2E);//p13 00229 writedata(0x34);//p14 00230 writedata(0x39);//p15 00231 #else 00232 writedata(0x20);//p1 00233 writedata(0x20);//p2 00234 writedata(0x20);//p3 00235 writedata(0x20);//p4 00236 writedata(0x05);//p5 00237 writedata(0x15);//p6 00238 writedata(0x00);//p7 00239 writedata(0xA7);//p8 00240 writedata(0x3D);//p9 00241 writedata(0x18);//p10 00242 writedata(0x25);//p11 00243 writedata(0x2A);//p12 00244 writedata(0x2B);//p13 00245 writedata(0x2B);//p14 00246 writedata(0x3A);//p15 00247 #endif 00248 00249 writecommand(CMD_FRMCTR1);//Frame Rate Control (In normal mode/Full colors) 00250 writedata(0x08);//0x0C//0x08 00251 writedata(0x02);//0x14//0x08 00252 wait_ms(1); 00253 writecommand(CMD_DINVCTR);//display inversion 00254 writedata(0x07); 00255 wait_ms(1); 00256 writecommand(CMD_PWCTR1);//Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD 00257 writedata(0x0A);//4.30 - 0x0A 00258 writedata(0x02);//0x05 00259 wait_ms(1); 00260 writecommand(CMD_PWCTR2);//Set BT[2:0] for AVDD & VCL & VGH & VGL 00261 writedata(0x02); 00262 wait_ms(1); 00263 writecommand(CMD_VCOMCTR1);//Set VMH[6:0] & VML[6:0] for VOMH & VCOML 00264 writedata(0x50);//0x50 00265 writedata(99);//0x5b 00266 wait_ms(1); 00267 writecommand(CMD_VCOMOFFS); 00268 writedata(0);//0x40 00269 wait_ms(1); 00270 00271 colorSpace(_colorspaceData); 00272 setRotation(0); 00273 defineScrollArea(0, 0); // top, bottom 00274 wait_ms(1); 00275 00276 fillScreen(BLACK); 00277 writecommand(CMD_DISPON);//display ON 00278 } 00279 00280 /* 00281 Colorspace selection: 00282 0: RGB 00283 1: GBR 00284 */ 00285 void TFT_ILI9163C_BASE::colorSpace(uint8_t cspace) { 00286 if (cspace < 1){ 00287 _Mactrl_Data &= ~(1 << 3); // bitClear(_Mactrl_Data,3); 00288 } else { 00289 _Mactrl_Data |= 1 << 3; // bitSet(_Mactrl_Data,3); 00290 } 00291 } 00292 00293 00294 void TFT_ILI9163C_BASE::clearScreen(uint16_t color) { 00295 scroll(0); 00296 homeAddress(); 00297 writedata16burst(color, _GRAMSIZE); 00298 } 00299 00300 void TFT_ILI9163C_BASE::homeAddress() { 00301 setAddrWindow(0x00,0x00,_GRAMWIDTH-1,_GRAMHEIGH-1); 00302 } 00303 00304 00305 void TFT_ILI9163C_BASE::setCursor(int16_t x, int16_t y) { 00306 if (boundaryCheck(x,y)) return; 00307 setAddrWindow(0x00,0x00,x,y); 00308 cursor_x = x; 00309 cursor_y = y; 00310 } 00311 00312 00313 void TFT_ILI9163C_BASE::pushColor(uint16_t color) { 00314 writedata16(color); 00315 } 00316 00317 00318 void TFT_ILI9163C_BASE::drawPixel(int16_t x, int16_t y, uint16_t color) { 00319 if (boundaryCheck(x,y)) return; 00320 if ((x < 0) || (y < 0)) return; 00321 setAddrWindow(x,y,x+1,y+1); 00322 writedata16(color); 00323 } 00324 00325 00326 void TFT_ILI9163C_BASE::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { 00327 // Rudimentary clipping 00328 if (boundaryCheck(x,y)) return; 00329 if (((y + h) - 1) >= _height) h = _height-y; 00330 00331 setAddrWindow(x,y,x,(y+h)-1); 00332 writedata16burst(color, h); 00333 } 00334 00335 inline bool TFT_ILI9163C_BASE::boundaryCheck(int16_t x,int16_t y){ 00336 if ((x >= _width) || (y >= _height)) return true; 00337 return false; 00338 } 00339 00340 void TFT_ILI9163C_BASE::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { 00341 // Rudimentary clipping 00342 if (boundaryCheck(x,y)) return; 00343 if (((x+w) - 1) >= _width) w = _width-x; 00344 00345 setAddrWindow(x,y,(x+w)-1,y); 00346 writedata16burst(color, w); 00347 } 00348 00349 void TFT_ILI9163C_BASE::fillScreen(uint16_t color) { 00350 clearScreen(color); 00351 } 00352 00353 // fill a rectangle 00354 void TFT_ILI9163C_BASE::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { 00355 00356 if (boundaryCheck(x,y)) return; 00357 if (((x + w) - 1) >= _width) w = _width - x; 00358 if (((y + h) - 1) >= _height) h = _height - y; 00359 00360 setAddrWindow(x,y,(x+w)-1,(y+h)-1); 00361 writedata16burst(color, w * h); 00362 } 00363 00364 00365 // Pass 8-bit (each) R,G,B, get back 16-bit packed color 00366 00367 uint16_t TFT_ILI9163C_BASE::Color565(uint8_t r, uint8_t g, uint8_t b) { 00368 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); 00369 } 00370 00371 00372 void TFT_ILI9163C_BASE::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { 00373 00374 writecommand(CMD_CLMADRS); // Column 00375 00376 if (rotation == 1) { 00377 writedata32(x0 + __OFFSET, x1 + __OFFSET); 00378 } else { 00379 writedata32(x0, x1); 00380 } 00381 00382 writecommand(CMD_PGEADRS); // Page 00383 if (rotation == 0){ 00384 writedata32(y0 + __OFFSET, y1 + __OFFSET); 00385 } else { 00386 writedata32(y0, y1); 00387 } 00388 00389 writecommand(CMD_RAMWR); //Into RAM 00390 } 00391 00392 00393 void TFT_ILI9163C_BASE::setRotation(uint8_t m) { 00394 rotation = m &3; // can't be higher than 3 00395 switch (rotation) { 00396 case 0: 00397 _Mactrl_Data = 0x08; // 0b00001000; 00398 _width = _TFTWIDTH; 00399 _height = _TFTHEIGHT;//-__OFFSET; 00400 break; 00401 case 1: 00402 _Mactrl_Data = 0x68; // 0b01101000; 00403 _width = _TFTHEIGHT;//-__OFFSET; 00404 _height = _TFTWIDTH; 00405 break; 00406 case 2: 00407 _Mactrl_Data = 0xC8; // 0b11001000; 00408 _width = _TFTWIDTH; 00409 _height = _TFTHEIGHT;//-__OFFSET; 00410 break; 00411 case 3: 00412 _Mactrl_Data = 0xA8; // 0b10101000; 00413 _width = _TFTWIDTH; 00414 _height = _TFTHEIGHT;//-__OFFSET; 00415 break; 00416 } 00417 colorSpace(_colorspaceData); 00418 writecommand(CMD_MADCTL); 00419 writedata(_Mactrl_Data); 00420 } 00421 00422 00423 void TFT_ILI9163C_BASE::invertDisplay(bool i) { 00424 writecommand(i ? CMD_DINVON : CMD_DINVOF); 00425 } 00426 00427 void TFT_ILI9163C_BASE::display(bool onOff) { 00428 if (onOff){ 00429 writecommand(CMD_DISPON); 00430 } else { 00431 writecommand(CMD_DISPOFF); 00432 } 00433 } 00434 00435 void TFT_ILI9163C_BASE::sleepMode(bool mode) { 00436 if (mode){ 00437 if (sleep == 1) return;//already sleeping 00438 sleep = 1; 00439 writecommand(CMD_SLPIN); 00440 wait_ms(5);//needed 00441 } else { 00442 if (sleep == 0) return; //Already awake 00443 sleep = 0; 00444 writecommand(CMD_SLPOUT); 00445 wait_ms(120);//needed 00446 } 00447 } 00448 00449 00450 void TFT_ILI9163C_BASE::defineScrollArea(uint16_t tfa, uint16_t bfa){ 00451 tfa += __OFFSET ; 00452 int16_t vsa = _GRAMHEIGH - tfa - bfa; 00453 if (vsa >= 0) { 00454 writecommand(CMD_VSCLLDEF); 00455 writedata16(tfa); 00456 writedata16(vsa); 00457 writedata16(bfa); 00458 } 00459 } 00460 00461 void TFT_ILI9163C_BASE::scroll(uint16_t ssa) { 00462 if (ssa <= _TFTHEIGHT) { 00463 writecommand(CMD_VSSTADRS); 00464 writedata16(ssa + __OFFSET); 00465 } 00466 }
Generated on Wed Jul 13 2022 11:29:01 by 1.7.2