diff --git a/TFT_Drivers/ST7789_DSTIKE_Defines.h b/TFT_Drivers/ST7789_DSTIKE_Defines.h new file mode 100644 index 0000000..9e70629 --- /dev/null +++ b/TFT_Drivers/ST7789_DSTIKE_Defines.h @@ -0,0 +1,143 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 240 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 +#endif + +#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240) + //#define CGRAM_OFFSET +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 +#define TFT_NORON 0x13 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C +#define TFT_RAMRD 0x2E +#define TFT_MADCTL 0x36 +#define TFT_COLMOD 0x3A + +// Flags for TFT_MADCTL +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #ifdef CGRAM_OFFSET + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #endif +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read + +#define ST_CMD_DELAY 0x80 // special signifier for command lists +#define ST7789_240x240_XSTART 0 +#define ST7789_240x240_YSTART 0 + +// ST7789 specific commands used in init +#define ST7789_NOP 0x00 +#define ST7789_SWRESET 0x01 +#define ST7789_RDDID 0x04 +#define ST7789_RDDST 0x09 + +#define ST7789_RDDPM 0x0A // Read display power mode +#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL +#define ST7789_RDD_COLMOD 0x0C // Read display pixel format +#define ST7789_RDDIM 0x0D // Read display image mode +#define ST7789_RDDSM 0x0E // Read display signal mode +#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V) + +#define ST7789_SLPIN 0x10 +#define ST7789_SLPOUT 0x11 +#define ST7789_PTLON 0x12 +#define ST7789_NORON 0x13 + +#define ST7789_INVOFF 0x20 +#define ST7789_INVON 0x21 +#define ST7789_GAMSET 0x26 // Gamma set +#define ST7789_DISPOFF 0x28 +#define ST7789_DISPON 0x29 +#define ST7789_CASET 0x2A +#define ST7789_RASET 0x2B +#define ST7789_RAMWR 0x2C +#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors +#define ST7789_RAMRD 0x2E + +#define ST7789_PTLAR 0x30 +#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V) +#define ST7789_TEOFF 0x34 // Tearing effect line off +#define ST7789_TEON 0x35 // Tearing effect line on +#define ST7789_MADCTL 0x36 // Memory data access control +#define ST7789_IDMOFF 0x38 // Idle mode off +#define ST7789_IDMON 0x39 // Idle mode on +#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V) +#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V) +#define ST7789_COLMOD 0x3A + +#define ST7789_RAMCTRL 0xB0 // RAM control +#define ST7789_RGBCTRL 0xB1 // RGB control +#define ST7789_PORCTRL 0xB2 // Porch control +#define ST7789_FRCTRL1 0xB3 // Frame rate control +#define ST7789_PARCTRL 0xB5 // Partial mode control +#define ST7789_GCTRL 0xB7 // Gate control +#define ST7789_GTADJ 0xB8 // Gate on timing adjustment +#define ST7789_DGMEN 0xBA // Digital gamma enable +#define ST7789_VCOMS 0xBB // VCOMS setting +#define ST7789_LCMCTRL 0xC0 // LCM control +#define ST7789_IDSET 0xC1 // ID setting +#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable +#define ST7789_VRHS 0xC3 // VRH set +#define ST7789_VDVSET 0xC4 // VDV setting +#define ST7789_VCMOFSET 0xC5 // VCOMS offset set +#define ST7789_FRCTR2 0xC6 // FR Control 2 +#define ST7789_CABCCTRL 0xC7 // CABC control +#define ST7789_REGSEL1 0xC8 // Register value section 1 +#define ST7789_REGSEL2 0xCA // Register value section 2 +#define ST7789_PWMFRSEL 0xCC // PWM frequency selection +#define ST7789_PWCTRL1 0xD0 // Power control 1 +#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789_CMD2EN 0xDF // Command 2 enable +#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control +#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control +#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red +#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue +#define ST7789_GATECTRL 0xE4 // Gate control +#define ST7789_SPI2EN 0xE7 // SPI2 enable +#define ST7789_PWCTRL2 0xE8 // Power control 2 +#define ST7789_EQCTRL 0xE9 // Equalize time control +#define ST7789_PROMCTRL 0xEC // Program control +#define ST7789_PROMEN 0xFA // Program mode enable +#define ST7789_NVMSET 0xFC // NVM setting +#define ST7789_PROMACT 0xFE // Program action + diff --git a/TFT_Drivers/ST7789_DSTIKE_Init.h b/TFT_Drivers/ST7789_DSTIKE_Init.h new file mode 100644 index 0000000..f59d4b5 --- /dev/null +++ b/TFT_Drivers/ST7789_DSTIKE_Init.h @@ -0,0 +1,32 @@ + + + +static uint8_t PROGMEM + cmd_240x240[] = { // Initialization commands for 7789 screens + 10, // 9 commands in list: + ST7789_SWRESET, ST_CMD_DELAY, // 1: Software reset, no args, w/delay + 150, // 150 ms delay + ST7789_SLPOUT , ST_CMD_DELAY, // 2: Out of sleep mode, no args, w/delay + 255, // 255 = 500 ms delay + ST7789_COLMOD , 1+ST_CMD_DELAY, // 3: Set color mode, 1 arg + delay: + 0x55, // 16-bit color + 10, // 10 ms delay + ST7789_MADCTL , 1, // 4: Memory access ctrl (directions), 1 arg: + 0x00, // Row addr/col addr, bottom to top refresh + ST7789_CASET , 4, // 5: Column addr set, 4 args, no delay: + 0x00, ST7789_240x240_XSTART, // XSTART = 0 + (240+ST7789_240x240_XSTART) >> 8, + (240+ST7789_240x240_XSTART) & 0xFF, // XEND = 240 + ST7789_RASET , 4, // 6: Row addr set, 4 args, no delay: + 0x00, ST7789_240x240_YSTART, // YSTART = 0 + (240+ST7789_240x240_YSTART) >> 8, + (240+ST7789_240x240_YSTART) & 0xFF, // YEND = 240 + ST7789_INVON , ST_CMD_DELAY, // 7: Inversion ON + 10, + ST7789_NORON , ST_CMD_DELAY, // 8: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7789_DISPON , ST_CMD_DELAY, // 9: Main screen turn on, no args, w/delay + 255 }; // 255 = 500 ms delay + + commandList( cmd_240x240 ); + diff --git a/TFT_Drivers/ST7789_DSTIKE_Rotation.h b/TFT_Drivers/ST7789_DSTIKE_Rotation.h new file mode 100644 index 0000000..d490279 --- /dev/null +++ b/TFT_Drivers/ST7789_DSTIKE_Rotation.h @@ -0,0 +1,48 @@ + // This is the command sequence that rotates the ST7789 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait +#ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 0; +#endif + writedata(TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + + case 1: // Landscape (Portrait + 90) +#ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 0; +#endif + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + + case 2: // Inverter portrait +#ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 80; +#endif + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape +#ifdef CGRAM_OFFSET + colstart = 80; + rowstart = 0; +#endif + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + } diff --git a/TFT_eSPI.cpp b/TFT_eSPI.cpp index 19af227..32c436c 100644 --- a/TFT_eSPI.cpp +++ b/TFT_eSPI.cpp @@ -407,6 +407,9 @@ void TFT_eSPI::init(uint8_t tc) #elif defined (R61581_DRIVER) #include "TFT_Drivers/R61581_Init.h" +#elif defined (ST7789_DSTIKE_DRIVER) + #include "TFT_Drivers/ST7789_DSTIKE_Init.h" + #endif #ifdef TFT_INVERSION_ON @@ -477,6 +480,9 @@ void TFT_eSPI::setRotation(uint8_t m) #elif defined (R61581_DRIVER) #include "TFT_Drivers/R61581_Rotation.h" +#elif defined (ST7789_DSTIKE_DRIVER) + #include "TFT_Drivers/ST7789_DSTIKE_Rotation.h" + #endif delayMicroseconds(10); diff --git a/TFT_eSPI.h b/TFT_eSPI.h index cc937d7..10d1b39 100644 --- a/TFT_eSPI.h +++ b/TFT_eSPI.h @@ -37,7 +37,7 @@ #define SPI_READ_FREQUENCY SPI_FREQUENCY #endif -#ifdef ST7789_DRIVER +#if defined(ST7789_DRIVER) || defined(ST7789_DSTIKE_DRIVER) #define TFT_SPI_MODE SPI_MODE3 #else #define TFT_SPI_MODE SPI_MODE0 diff --git a/User_Setup_Select.h b/User_Setup_Select.h index 69d27a0..fabdac3 100644 --- a/User_Setup_Select.h +++ b/User_Setup_Select.h @@ -47,7 +47,8 @@ //#include // Setup file for ESP32 and TTGO T4 (BTC) ILI9341 SPI bus TFT //#include // Setup file for ESP32 and TTGO TM ST7789 SPI bus TFT -//#include // Setup file configured for my ST7735S 80x160 +//#include // Setup file configured for my ST7735S 80x160 +//#include // Setup file configured for ST7789 (DSTIKE on D-Duino32-XS) 240x240 //#include @@ -106,6 +107,9 @@ #elif defined (R61581_DRIVER) #include "TFT_Drivers/R61581_Defines.h" #define TFT_DRIVER 0x6158 +#elif defined (ST7789_DSTIKE_DRIVER) + #include "TFT_Drivers/ST7789_DSTIKE_Defines.h" + #define TFT_DRIVER 0x7789 #elif defined (XYZZY_DRIVER) // <<<<<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVER HERE #include "TFT_Drivers/XYZZY_Defines.h" #define TFT_DRIVER 0x0000 diff --git a/User_Setups/Setup24_ST7789_DSTIKE.h b/User_Setups/Setup24_ST7789_DSTIKE.h new file mode 100644 index 0000000..bbc7e2e --- /dev/null +++ b/User_Setups/Setup24_ST7789_DSTIKE.h @@ -0,0 +1,34 @@ + + +#define ST7789_DSTIKE_DRIVER + + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define SPI_FREQUENCY 40000000 + +#define TFT_DC 23 +#define TFT_RST 32 +#define TFT_MOSI 26 +#define TFT_SCLK 27 + +#define TFT_BGR 0 // Colour order Blue-Green-Red +#define TFT_RGB 1 // Colour order Red-Green-Blue + + +// Load the right driver definition - do not tinker here ! +#include "TFT_Drivers/ST7789_DSTIKE_Defines.h" +#define TFT_DRIVER 0x7789 + + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000