Tous les tutoriels

4 · Écrans & bus

Écran TFT couleur en SPI

Expert30 min

Objectif

Piloter un ST7789 240×240 avec le port SPI matériel.

Pourquoi c'est utile

Le SPI est bien plus rapide que l'I²C : indispensable pour la vidéo.

Étapes

  1. 01Glissez le composant TFT 240×240 (SPI) sur le canevas.
  2. 02Gardez DC sur D8 — SCK est D13 et MOSI D11 sur l'UNO.
  3. 03Chargez le sketch de départ : il initialise le panneau et trace des barres de couleur.
  4. 04Modifiez le tableau de couleurs pour dessiner votre interface.

Code de départ

// ST7789 240x240 SPI display driven directly — DC on D8, RST on D9, CS on D10.
#include <SPI.h>

#define TFT_DC 8
#define TFT_RST 9
#define TFT_CS 10

void cmd(uint8_t c) {
  digitalWrite(TFT_DC, LOW);
  digitalWrite(TFT_CS, LOW);
  SPI.transfer(c);
  digitalWrite(TFT_CS, HIGH);
}

void dat(uint8_t d) {
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW);
  SPI.transfer(d);
  digitalWrite(TFT_CS, HIGH);
}

void window(int x0, int y0, int x1, int y1) {
  cmd(0x2A); dat(x0 >> 8); dat(x0); dat(x1 >> 8); dat(x1);
  cmd(0x2B); dat(y0 >> 8); dat(y0); dat(y1 >> 8); dat(y1);
  cmd(0x2C);
}

void fill(int x, int y, int w, int h, uint16_t color) {
  window(x, y, x + w - 1, y + h - 1);
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW);
  for (long i = 0; i < (long)w * h; i++) {
    SPI.transfer(color >> 8);
    SPI.transfer(color & 0xFF);
  }
  digitalWrite(TFT_CS, HIGH);
}

void setup() {
  pinMode(TFT_DC, OUTPUT);
  pinMode(TFT_RST, OUTPUT);
  pinMode(TFT_CS, OUTPUT);
  digitalWrite(TFT_CS, HIGH);
  SPI.begin();

  digitalWrite(TFT_RST, LOW); delay(20);
  digitalWrite(TFT_RST, HIGH); delay(50);

  cmd(0x01); delay(50);   // software reset
  cmd(0x11); delay(50);   // sleep out
  cmd(0x3A); dat(0x55);   // 16-bit color
  cmd(0x36); dat(0x00);   // memory access
  cmd(0x21);              // inversion on (typical for 240x240 panels)
  cmd(0x29);              // display on

  fill(0, 0, 240, 240, 0x0000);
}

uint16_t bar = 0;

void loop() {
  const uint16_t colors[4] = { 0xF800, 0x07E0, 0x001F, 0xFFE0 };
  fill(0, (bar % 4) * 60, 240, 60, colors[bar % 4]);
  bar++;
  delay(400);
}

Ce tutoriel se réalise dans le simulateur Circuitly : le montage et le code sont vérifiés automatiquement à chaque étape.

Tutoriels suivants