ST7789 SPI tft without cs pin esp8266 wemos d1

ST7789 Chip is used in SPI interface based TFT LCD displays. These 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.

ST7789 SPI TFT 240x240 without CS Pin Interfacing ESP8266
ESP8266ST7789
3V3VCC
GNDGND
D5SCL
D7SDA
D2RES
D3DC

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

ST7789 SPI TFT 240x240 without CS Pin Interfacing ESP8266

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

httpv://www.youtube.com/watch?v=l6BeyyJdp_A

1 COMMENT

  1. I use more than 3 days to set this display to work without any positive result.
    Tanks to this post now it work like a charm
    This is the display i use:
    1.3 inch IPS HD TFT ST7789 Drive IC 240*240 SPI Communication 3.3V Voltage 4-Wire SPI Interface Full Color LCD OLED Display

Comment Box