Beta! Fully working!
Solved finally memory addressing problems.
This commit is contained in:
parent
653c157f4e
commit
def2720d1b
5 changed files with 130 additions and 65 deletions
121
TFT_ILI9163C.cpp
121
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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 "));
|
||||
|
|
|
|||
|
|
@ -5,5 +5,7 @@ setBrightness KEYWORD2
|
|||
writeData KEYWORD2
|
||||
setBitrate KEYWORD2
|
||||
Color565 KEYWORD2
|
||||
setBitrate KEYWORD2
|
||||
clearScreen KEYWORD2
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue