diff --git a/TFT_ILI9163C.cpp b/TFT_ILI9163C.cpp index c076d63..0d37f9b 100644 --- a/TFT_ILI9163C.cpp +++ b/TFT_ILI9163C.cpp @@ -269,6 +269,12 @@ void TFT_ILI9163C::chipInit() { writecommand(CMD_GAMRSEL);//Enable Gamma adj writedata(0x01); delay(10); + writecommand(CMD_NORML); + + writecommand(0xB6); + writedata(0b11111111);//0x04 + writedata(0b00000110);//0x04 + writecommand(CMD_PGAMMAC);//Positive Gamma Correction Setting #if defined(__GAMMASET1) writedata(0x36);//p1 @@ -342,61 +348,68 @@ void TFT_ILI9163C::chipInit() { writecommand(CMD_FRMCTR1);//Frame Rate Control (In normal mode/Full colors) - writedata(0x08);//0x0C - writedata(0x08);//0x14 + writedata(0x08);//0x0C//0x08 + writedata(0x02);//0x14//0x08 delay(10); writecommand(CMD_DINVCTR);//display inversion writedata(0x07); delay(10); writecommand(CMD_PWCTR1);//Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD - writedata(0x0A);//0x0C + writedata(0x0A);//4.30 - 0x0A writedata(0x02);//0x05 delay(10); writecommand(CMD_PWCTR2);//Set BT[2:0] for AVDD & VCL & VGH & VGL writedata(0x02); delay(10); writecommand(CMD_VCOMCTR1);//Set VMH[6:0] & VML[6:0] for VOMH & VCOML - writedata(0x50); - writedata(0x5B); + writedata(0x50);//0x50 + writedata(99);//0x5b delay(10); writecommand(CMD_VCOMOFFS); - writedata(0x40); + writedata(0);//0x40 delay(10); writecommand(CMD_CLMADRS);//Set Column Address writedata(0x00); writedata(0X00); writedata(0X00); - writedata(_DTA_WIDTH); + writedata(_GRAMWIDTH); writecommand(CMD_PGEADRS);//Set Page Address writedata(0x00); writedata(0X00); writedata(0X00); - writedata(_DTA_HEIGHT); + writedata(_GRAMHEIGH); writecommand(CMD_MADCTL);//Set Scanning Direction && Colorspace writedata(DTA_MADCTL_MX | __COLORSPC); //08 delay(10); - writecommand(CMD_SDRVDIR);//Set Source Output Direction - writedata(0x00); - delay(10); + //writecommand(CMD_SDRVDIR);//Set Source Output Direction + //writedata(0x00); + //delay(10); + writecommand(CMD_DISPON);//display ON delay(10); writecommand(CMD_RAMWR);//Memory Write + writedata16(0X0000); + writedata16(0X0000); + writedata16(0X0000); + writedata16(0X0000); delay(10); + fillScreen(BLACK); + setRotation(0); } void TFT_ILI9163C::clearScreen(uint16_t color) { homeAddress(); - for (int px=0;px <= (_TFTWIDTH*_TFTHEIGHT); px++){ + for (int px=0;px < _GRAMSIZE; px++){ writedata16(color); } } void TFT_ILI9163C::homeAddress() { - setAddrWindow(0x00,0x00,_DTA_WIDTH,_DTA_HEIGHT); + setAddrWindow(0x00,0x00,_GRAMWIDTH,_GRAMHEIGH); } void TFT_ILI9163C::setCursor(int16_t x, int16_t y) { @@ -405,27 +418,6 @@ void TFT_ILI9163C::setCursor(int16_t x, int16_t y) { cursor_y = y; } -void TFT_ILI9163C::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - writecommand(CMD_CLMADRS); // Column - writedata16(x0); - writedata16(x1); - - // writedata(0x00); - // writedata(x0); - // writedata(0x00); - // writedata(x1); - - writecommand(CMD_PGEADRS); // Page - writedata16(y0); - writedata16(y1); - - // writedata(0x00); - // writedata(y0); - // writedata(0x00); - // writedata(y1); - - writecommand(CMD_RAMWR); //Into RAM -} void TFT_ILI9163C::pushColor(uint16_t color) { @@ -466,8 +458,8 @@ void TFT_ILI9163C::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color } void TFT_ILI9163C::fillScreen(uint16_t color) { - fillRect(0, 0, _width, _height, color); - homeAddress(); + clearScreen(color); + //homeAddress(); } // fill a rectangle @@ -492,29 +484,68 @@ uint16_t TFT_ILI9163C::Color565(uint8_t r, uint8_t g, uint8_t b) { } +void TFT_ILI9163C::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + writecommand(CMD_CLMADRS); // Column + if (rotation == 0){ + writedata16(x0); + writedata16(x1); + } else if (rotation == 1){ + writedata16(x0+32); + writedata16(x1+32); + } else if (rotation == 2){ + writedata16(x0); + writedata16(x1); + } else { + writedata16(x0); + writedata16(x1); + } + + writecommand(CMD_PGEADRS); // Page + if (rotation == 0){ + writedata16(y0+__OFFSET); + writedata16(y1+__OFFSET); + } else if (rotation == 1){ + writedata16(y0); + writedata16(y1); + } else if (rotation == 2){ + writedata16(y0); + writedata16(y1); + } else { + writedata16(y0); + writedata16(y1); + } + + writecommand(CMD_RAMWR); //Into RAM +} + + void TFT_ILI9163C::setRotation(uint8_t m) { writecommand(CMD_MADCTL); rotation = m % 4; // can't be higher than 3 switch (rotation) { case 0: - writedata(DTA_MADCTL_MX | __COLORSPC); + writecommand(CMD_MADCTL); + writedata(0b00001000); _width = _TFTWIDTH; - _height = _TFTHEIGHT; + _height = _TFTHEIGHT;//-__OFFSET; break; case 1: - writedata(DTA_MADCTL_MV | __COLORSPC); - _width = _TFTHEIGHT; + writecommand(CMD_MADCTL); + writedata(0b01101000); + _width = _TFTHEIGHT;//-__OFFSET; _height = _TFTWIDTH; break; case 2: - writedata(DTA_MADCTL_MY | __COLORSPC); + writecommand(CMD_MADCTL); + writedata(0b11001000); _width = _TFTWIDTH; - _height = _TFTHEIGHT; + _height = _TFTHEIGHT;//-__OFFSET; break; case 3: - writedata(DTA_MADCTL_MV | DTA_MADCTL_MY | DTA_MADCTL_MX | __COLORSPC); - _width = _TFTHEIGHT; - _height = _TFTWIDTH; + writecommand(CMD_MADCTL); + writedata(0b10101000); + _width = _TFTWIDTH; + _height = _TFTHEIGHT;//-__OFFSET; break; } } diff --git a/TFT_ILI9163C.h b/TFT_ILI9163C.h index a1dc7b0..9a1aaa0 100644 --- a/TFT_ILI9163C.h +++ b/TFT_ILI9163C.h @@ -63,6 +63,7 @@ Version: 0.1a1: First release, compile correctly. Altrough not fully working! 0.1a3: Better but still some addressing problems. + 0.1b1: Beta! Addressing solved, now rotation works and boundaries ok. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BugList of the current version: @@ -113,19 +114,45 @@ //ILI9163C versions------------------------ #if defined(__144_RED_PCB__) - #define _TFTWIDTH 128 - #define _TFTHEIGHT 160 +/* +This display: +http://www.ebay.com/itm/Replace-Nokia-5110-LCD-1-44-Red-Serial-128X128-SPI-Color-TFT-LCD-Display-Module-/271422122271 +This particular display has a design error! The controller has 3 pins to configure to constrain +the memory and resolution to a fixed dimension (in that case 128x128) but they leaved those pins +configured for 128x160 so there was several pixel memory addressing problems. +I solved by setup several parameters that dinamically fix the resolution as needit so below +the parameters for this diplay. If you have a strain or a correct display (can happen with chinese) +you can copy those parameters and create setup for different displays. +*/ + #define _TFTWIDTH 128//the REAL W resolution of the TFT + #define _TFTHEIGHT 128//the REAL H resolution of the TFT + #define _GRAMWIDTH 128 + #define _GRAMHEIGH 160 + #define _GRAMSIZE _GRAMWIDTH * _GRAMHEIGH//*see note 1 + #define __COLORSPC DTA_MADCTL_BGR//DTA_MADCTL_RGB + #define __GAMMASET1 //uncomment for another gamma + #define __OFFSET 32//*see note 2 +#else + #define _TFTWIDTH 128//128 + #define _TFTHEIGHT 160//160 + #define _GRAMWIDTH 128 + #define _GRAMHEIGH 160 + #define _GRAMSIZE _GRAMWIDTH * _GRAMHEIGH//*see note 1 #define __COLORSPC DTA_MADCTL_BGR//DTA_MADCTL_RGB #define __GAMMASET1 -#else - #define _TFTWIDTH 128 - #define _TFTHEIGHT 160 + #define __OFFSET 0 #endif +/* + Note 1: The __144_RED_PCB__ display has hardware addressing of 128 x 160 + but the tft resolution it's 128 x 128 so the dram should be set correctly + + Note 2: This is the offset between image in RAM and TFT. In that case 160 - 128 = 32; +*/ //----------------------------------------- +#define BLACK 0x0000 +#define WHITE 0xFFFF -#define _DTA_WIDTH _TFTWIDTH//0x7F//=128 hex -#define _DTA_HEIGHT _TFTHEIGHT//0x7F//=128 hex //ILI9163C registers----------------------- #define CMD_NOP 0x00//Non operation #define CMD_SWRESET 0x01//Soft Reset @@ -144,7 +171,7 @@ #define CMD_NORML 0x13//Normal Display ON #define CMD_DINVOF 0x20//Display Inversion OFF #define CMD_DINVON 0x21//Display Inversion ON -#define CMD_GAMMASET 0x26//Gamma Set +#define CMD_GAMMASET 0x26//Gamma Set (0x01[1],0x02[2],0x04[3],0x08[4]) #define CMD_DISPOFF 0x28//Display OFF #define CMD_DISPON 0x29//Display ON #define CMD_IDLEON 0x39//Idle Mode ON @@ -194,7 +221,7 @@ #define CMD_GAMRSEL 0xF2//GAM_R_SEL -#define DTA_MADCTL_MX 0x00//0x40 +#define DTA_MADCTL_MX 0x40//0x40 or 00 #define DTA_MADCTL_MY 0x80 #define DTA_MADCTL_MV 0x20 #define DTA_MADCTL_ML 0x10 @@ -224,6 +251,7 @@ class TFT_ILI9163C : public Adafruit_GFX { invertDisplay(boolean i); uint16_t Color565(uint8_t r, uint8_t g, uint8_t b); void setBitrate(uint32_t n); + //void test(uint8_t rot); private: diff --git a/examples/cube/cube.ino b/examples/cube/cube.ino index db18a86..71e3baf 100644 --- a/examples/cube/cube.ino +++ b/examples/cube/cube.ino @@ -47,10 +47,13 @@ TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, __RST); void setup() { tft.begin(); + #if defined(__MK20DX128__) || defined(__MK20DX256__) + tft.setBitrate(24000000); + #endif } void loop(){ - tft.fillScreen(); + tft.fillScreen(WHITE); r[0]=r[0]+1; r[1]=r[1]+1; if (r[0] == 36) r[0] = 0; @@ -74,12 +77,12 @@ void loop(){ p2y[i] = ((tft.height())/2)+ay*500/az; } for (int i=0;i<3;i++) { - tft.drawLine(p2x[i],p2y[i],p2x[i+1],p2y[i+1],RED); - tft.drawLine(p2x[i+4],p2y[i+4],p2x[i+5],p2y[i+5],RED); - tft.drawLine(p2x[i],p2y[i],p2x[i+4],p2y[i+4],RED); + tft.drawLine(p2x[i],p2y[i],p2x[i+1],p2y[i+1],BLACK); + tft.drawLine(p2x[i+4],p2y[i+4],p2x[i+5],p2y[i+5],BLACK); + tft.drawLine(p2x[i],p2y[i],p2x[i+4],p2y[i+4],BLACK); } - tft.drawLine(p2x[3],p2y[3],p2x[0],p2y[0],RED); - tft.drawLine(p2x[7],p2y[7],p2x[4],p2y[4],RED); - tft.drawLine(p2x[3],p2y[3],p2x[7],p2y[7],RED); - delay(50); -} + tft.drawLine(p2x[3],p2y[3],p2x[0],p2y[0],BLACK); + tft.drawLine(p2x[7],p2y[7],p2x[4],p2y[4],BLACK); + tft.drawLine(p2x[3],p2y[3],p2x[7],p2y[7],BLACK); + delay(15); +} \ No newline at end of file diff --git a/examples/graphicstest/graphicstest.ino b/examples/graphicstest/graphicstest.ino index 23d0d4c..b72194f 100644 --- a/examples/graphicstest/graphicstest.ino +++ b/examples/graphicstest/graphicstest.ino @@ -27,9 +27,10 @@ TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, __RST); void setup() { Serial.begin(9600); //while (!Serial); - tft.setBitrate(24000000); tft.begin(); - //tft.setBitrate(6000000); + #if defined(__MK20DX128__) || defined(__MK20DX256__) + tft.setBitrate(24000000); + #endif Serial.println(F("Benchmark Time (microseconds)")); Serial.print(F("Screen fill ")); diff --git a/keywords.txt b/keywords.txt index 442ca9d..18cb98a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -5,5 +5,7 @@ setBrightness KEYWORD2 writeData KEYWORD2 setBitrate KEYWORD2 Color565 KEYWORD2 +setBitrate KEYWORD2 +clearScreen KEYWORD2