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:

14 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).

  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 !

Leave a Reply

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