Interfacing Arduino with ST7789 TFT Display – Graphics Test Example

This Arduino tutorial shows how to interface the UNO board with ST7789 TFT display.
The ST7789 TFT module contains a display controller with the same name: ST7789. It’s a color display that uses SPI interface protocol and requires 3, 4 or 5 control pins, it’s low cost and easy to use. This display is an IPS display, it comes in different sizes (1.3″, 1.54″ …) but all of them should have the same resolution of 240×240 pixel, this means it has 57600 pixels. This module works with 3.3V only and it doesn’t support 5V (not 5V tolerant).

TFT: Thin-Film Transistor.
SPI: Serial Peripheral Interface.
IPS: In-Plane Switching.

The following image shows a ST7789 display module provided by Adafruit Industries:

Adafruit ST7789 TFT display module
Adafruit ST7789 TFT display module

Another version of the ST7789 display module is shown below. This one has no CS (chip select) pin, its internally attached to GND:

ST7789 TFT display without CS pin
ST7789 TFT display without CS pin

Project Hardware Required:

  • Arduino UNO board
  • ST7789 TFT display module (1.3″, 1.54″ …)
  • 4 x 3.3k ohm resistor (+1 if the display module has CS pin)
  • 4 x 2.2k ohm resistor (+1 if the display module has CS pin)
  • Breadboard
  • Jumper wires
Arduino uno with ST7789 IPS TFT display
Arduino uno with ST7789 IPS TFT display

Interfacing Arduino UNO with ST7789 TFT circuit:
Project circuit schematic diagram is shown below.

The ST7789 display module shown in project circuit diagram has 7 pins: (from right to left): GND (ground), VCC, SCL (serial clock), SDA (serial data), RES (reset), DC (or D/C: data/command) and BLK (back light).
Connecting the BLK pin is optional. The back light turns off when the BLK pin connected to the ground (GND).

Arduino ST7789 TFT display circuit
Arduino ST7789 TFT display circuit

As mentioned above, the ST7789 TFT display controller works with 3.3V only (power supply and control lines). The display module is supplied with 3.3V (between VCC and GND) which comes from the Arduino board.

All Arduino UNO board output pins are 5V, connecting a 5V pin to the ST7789 TFT display may damage its controller.
To connect the Arduino to the display module, I used voltage divider for each line which means there are 4 voltage dividers. Each voltage divider consists of 2.2k and 3.3k resistors, this drops the 5V into 3V which is sufficient.

If the display module has a CS pin (Chip Select) then it should be connected to Arduino digital pin 10 through another voltage divider.

So, the ST7789 TFT display is connected to the Arduino board as follows (each one through voltage divider):
RST pin is connected to Arduino digital pin 8,
DC pin is connected to Arduino digital pin 9,
SDA pin is connected to Arduino digital pin 11,
SCL pin is connected to Arduino digital pin 13.

Other pins are connected as follows:
VCC pin is connected to Arduino 3V3 pin,
GND pin is connected to Arduino GND pin,
BL (LED) pin is connected to Arduino 3V3 pin (optional).

Interfacing Arduino UNO with ST7789 TFT code:
The following Arduino code requires two libraries from Adafruit Industries:
The first library is a driver for the ST7789 TFT display which can be installed from Arduino IDE library manager (Sketch —> Include Library —> Manage Libraries …, in the search box write “st7789” and install the one from Adafruit).

The second library is Adafruit graphics library which can be installed also from Arduino IDE library manager.

Both libraries can be installed manually, first download them from the following 2 links:
Adafruit ST7789 TFT library    —->  direct link
Adafruit graphics library        —->  direct link

After the download, go to Arduino IDE —> Sketch —> Include Library —> Add .ZIP Library … and browse for the .zip file (previously downloaded).
The same thing for the other library file.

Hints:
The 2 library files are included in the main code as shown below.
Including Arduino SPI library is optional!

The ST7789 TFT module pins (CS, RST and DC) connections are defined as shown below:

The other display pins (SDA and SCL) are connected to Arduino hardware SPI pins (digital pin 11 and digital pin 13).

The Adafruit ST7789 library is initialized with this line:

And the TFT display is initialized using the following command:

The display may not work if it has a CS pin, try with SPI_MODE0 which is the default mode of the library or just use: tft.init(240, 240);

Rest of code is described through comments.

Full Arduino code:

The video below shows my breadboard test circuit:

26 comments

  1. Hello, i tested it with Arduino Micro Pro. As is described, it was not working. After change Res to pin 9, DC to pin 8, BLK to pin 10 is now working nice. Thank for inspiration.

  2. Pingback: Need help
    1. No, there is no need to remove the screen from the board, just connect the screen module to the Arduino as shown in the circuit diagram and use the Arduino code (above).

    1. For colour issue in china display you need to change spi mode in two places

      Adafruit_ST77xx.h

      //spiMode = SPI_MODE0; ///< Certain display needs MODE3 instead
      spiMode = SPI_MODE3; ///< Certain display needs MODE3 instead

      Adafruit_ST7789.h

      void init(uint16_t width, uint16_t height, uint8_t spiMode = SPI_MODE3);

      i faced colour issue, that display purchased in aliexpress

      after long studies i done above modification

      now works

      Just tested today (24/12/2019)

      1. Instead of this modification you may just set SPI mode in the main code, for example:
        tft.init(240, 240, SPI_MODE3);
        Can you give us a picture of your display (or Aliexpress link)?

          1. Hi friends

            i am unlucky to use this display, i think so.

            the same program i used and removed all content like draw lines, circles, like all by one by one the display works in all stage. finally when removing testroundrectangle(); function the display gone half.

            if i am using this in the program display works good

            so i included the function to execute first, like when power on test round rectangle will come then my project content will comes net. like power up screen

            then i decided to copy the program from following link

            https://simple-circuit.com/tft-st7789-arduino-dht11-sensor/

            directly i uploaded but the display direction is not good

            same parameters used in the program like spimode 3 setrotation 2 etc but different result

            kindly suggest me some idea still my project is in first phase

          2. This code _as it is_ should work perfectly and without any problem!
            Try with the following:
            Update Adafruit ST7735/ST7789 library (current version 1.5.9),
            Update Adafruit graphics library (current version 1.7.3),
            You can update both libraries using Arduino IDE library manager (Tools —> Manage Libraries…).
            And try using the latest version of Arduino IDE (current version 1.8.10).

          3. Thanks friend,

            i am new to Arduino and really happy you all reply immediately.

            really works after update. its miracle

            one program working on old file another working in new one. now i tested both program after update working fine

  3. After long time this working for me, i wanted to use BLK, so i connect it to Ground… and my screen is dead now (but not sure it’s the cause).. but now something make me confuse, you connect BLK to GND, so it means connect GND direct with 3.3v on arduino (BLK is connected to 3.3v), how can’t it damage it ?

    1. The BLK pin is just for the back light LED. If it is connected to VCC (+3.3V) or left unconnected the backlight will be ON and if it is connected to GND the backlight will be OFF. You cannot connect it to VCC and GND at the same time because you will do a short circuit and even your Arduino board may be damaged!
      Connecting the display to 5V may damage it (power supply or data lines), that’s why the voltage dividers are used!
      Also reversing the polarity of the 3.3V power supply may damage it.

  4. That’s what i finaly thought, you just confirm to me i had did a terrible newbie mistake ;-( After following all your instruction screen was working fine for months.. But backlight was too strong for me during night, so i wanted to try connect BLK to GROUND as you suggere…. But i had your setup with BLK connect to vcc 3.3v, what make me confused and did not think about switching with ground (maybe should be good to precise for others newbees like me).. So i thought maybe there is some protection inside arduino or some funcion i ignore.. But no !! you confirm to me i did a short circuit ;-)). I burn the TFT, and after check i burned some pins of arduino too, and my relay module ;-((

    The good news of this story is i had learned of my mistake and never do it again 😉 and in 1 month i receive the new screen for my clock alarm v2 😉

    So thank you.. It’s not easy to find information about thoses screen and BLK funccion.. Can we use a potentiometer to ajust luminosity ? (The strange things with my short circuit story is that TFT funccion display burnout but no the led, i still have light).
    I saw a man using tft reset pin : pinmode(reset,output);
    analogWrite(reset,true), delay(200);analogwrite(reset,false) for software simulate of BLK, i try it but it only switch off the display, some light was still there. So i wanted to try something with analogwrite to send 3,3v or 0v (i did not found any information about that)..
    Do you know what the reset is use for ? Just reset display i suppose…

    So thanks again, you are the only one to have such a good and almost full explanation with how to use thoses screen..

    Nicolas from france !

    1. Use voltage divider formula and you’ll get 3 Volts (not 2 Volts):
      Vout (goes to ST7789 TFT) = 5V (from Arduino output pin) x 3.3k/(3.3k + 2.2k) = 5 x 3.3/5.5 = 3 volts.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.