for Arduino TFT LCD Screen 160x128

Dependents:   TFTLCDSCREEN Pong_ILI9163C

Fork of TFT_ILI9163C by _ peu605

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TFT_ILI9163C_BASE.cpp Source File

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 }