ST7789 Chip is used in SPI interface based TFT LCD displays. ST7789 SPI TFT displays are the very chip in price and produce high-density Colorful images.

But, the Chinese clone of ST7789 modules ships without a CS pin. Mainly the Resolution of the display is 240×240. In this post, I will share how to connect ST7789 SPI TFT LCD Displays 240×240 without CS Pin with ESP8266 based boards. Here I will use the Wemos D1 Board.

Components Used:(Click to Buy)

Connect ESP8266 with ST7789 SPI TFT

This display works with 3.3V power and ST7789 chip works with 4 wire SPI interface. This display comes with 7 pins. But, we do not connect anything with the rightmost pin. Because this is the backlight on /off pin. If we connect this pin with GND (Ground) the display backlight will be off.

Here, we will use 2 hardware SPI pins of ESP8266 boards. These pins are predefined. Other two pins we can select any two Digital pins.

ESP8266 ST7789 3V3 VCC GND GND D5 SCL D7 SDA D2 RES D3 DC

Add Library For ST7789 SPI TFT

First of all, we have to download and import the Libray.

In this tutorial, I have used these 2 libraries from Github. Both must be included in the header.

Arduino-ST7789-Library

Adafruit-GFX-Library

So, just Download ZIP and import in your Arduino IDE or Platform IO.

Code Explain

Using the 9,10,11 & 12 lines we defined the pins for the Display. RST & DC pins can be changed to other Digital pins, but MOSI & SCLK can not be changed as it is hardware design specific.

Then, on line no 13, we defined a display object named “TFT“. On line no 200, we initialized the display with 240 height and 240 width. If you have different resolution display, then change the value with yours.

Demo Arduino Sketch for ST7789 SPI TFT Display

Now, Run the following demo code for your ST7789 SPI interfacing display and check the display is working or not.

/* This is a demo for the ST7789 IPS SPI 240x240 display without CS pin. by somtips.com */ #include <Arduino.h> #include <Adafruit_GFX.h> // Core graphics library by Adafruit #include <Arduino_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #define TFT_DC D1 #define TFT_RST D0 #define TFT_MOSI D7 #define TFT_SCLK D5 Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); float p = 3.1415926; void testlines(uint16_t color) { tft.fillScreen(BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); } tft.fillScreen(BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); } tft.fillScreen(BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); } tft.fillScreen(BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(BLACK); int color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(BLACK); int color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(BLACK); tft.setCursor(0, 30); tft.setTextColor(RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(BLACK); tft.setTextColor(WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(MAGENTA); tft.print(millis() / 1000); tft.setTextColor(WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, RED); tft.fillRoundRect(69, 98, 20, 45, 5, RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, GREEN); } void setup(void) { Serial.begin(9600); Serial.print("Hello! ST7789 TFT Test"); tft. tft.init(240, 240); // initialize a ST7789 chip, 240x240 pixels Serial.println("Initialized"); uint16_t time = millis(); tft.fillScreen(BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(BLACK); tft.setCursor(0, 0); tft.setTextColor(RED); tft.setTextSize(2); tft.println("Welcome to"); tft.setCursor(0, 35); tft.setTextColor(GREEN); tft.setTextSize(4); tft.println("SOM TIPS"); tft.setCursor(0, 80); tft.setTextColor(BLUE); tft.setTextSize(3); tft.println("YouTube"); tft.setTextColor(YELLOW); tft.setTextSize(3); tft.println("somtips.com"); delay(3000); // tft print function tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, GREEN); delay(500); // line draw test testlines(YELLOW); delay(500); // optimized lines testfastlines(RED, BLUE); delay(500); testdrawrects(GREEN); delay(500); testfillrects(YELLOW, MAGENTA); delay(500); tft.fillScreen(BLACK); testfillcircles(10, BLUE); testdrawcircles(10, WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); }

Output

Finally, all done. we can see the text on ST7789 SPI TFT Display.

Connect LCD Display with ESP8266