Lerne, wie du ein 1,69 Zoll ST7789 SPI-LCD-Display mit dem Raspberry Pi Pico und MicroPython Schritt für Schritt anschließt, programmierst und mit einfachen Animationen zum Leben erweckst – inklusive wichtiger Tipps für ähnliche Displays.

Was brauchst du?
Was wird in diesem Beitrag erklärt?
In diesem Beitrag lernst du, wie du ein Waveshare 1,69 Zoll ST7789 SPI-LCD-Display mit dem Raspberry Pi Pico verbindest und programmierst. Ich zeige dir Schritt für Schritt, wie die Verkabelung funktioniert, welche MicroPython-Bibliotheken du brauchst und wie du den Bildschirm mit Text, Farben und einfachen Animationen füllst. Dabei gehe ich auch auf Anpassungen für andere ähnliche Displays ein, sodass du die Methoden leicht auf dein eigenes Projekt übertragen kannst.
Schritt 1: Allgemeine Funktionsweise von SPI-basierten LCD-Displays
Kleine LCD-Module, wie sie häufig im Embedded- oder Maker-Bereich verwendet werden, sind ideale Anzeigelösungen für Mikrocontroller-Projekte. Typische Vertreter dieser Gattung sind farbige TFT-Displays mit einer Auflösung von z. B. 240×240 oder 240×280 Pixeln. Sie basieren in der Regel auf einem Display-Controller – im Fall des hier behandelten Displays ist das der ST7789.
Displayaufbau und Kommunikation
Solche Displays bestehen im Wesentlichen aus zwei Hauptkomponenten:
- TFT-Panel (Thin Film Transistor)
Dieses Panel ist ein rasterbasiertes, aktives Matrix-Display, bei dem jeder einzelne Pixel separat angesteuert wird. Je nach Farbmodus kann ein Pixel 16 Bit Farbtiefe haben, was 65.536 Farben entspricht (RGB565). - Display-Controller (z. B. ST7789)
Der Controller steuert den Bildaufbau, das Timing und die Kommunikation mit dem Mikrocontroller. Er bietet einen Speicherbereich (GRAM), in den die Pixelinformationen geschrieben werden, sowie eine Vielzahl von Konfigurationsmöglichkeiten (Rotation, Farbmodus, Scrollen etc.).
SPI als Kommunikationsschnittstelle
Die meisten dieser Displays nutzen SPI (Serial Peripheral Interface) als Verbindung zum Mikrocontroller. SPI ist ein synchrones serielles Protokoll, das sich besonders gut für schnelle Datenübertragungen eignet. Die typischen Signalleitungen sind:
- MOSI (Master Out Slave In): Datenleitung vom Mikrocontroller zum Display
- SCK (Serial Clock): Taktleitung, ebenfalls vom Mikrocontroller gesteuert
- DC (Data/Command): Steuert, ob ein Kommando oder Pixeldaten gesendet werden
- CS (Chip Select): Aktiviert das Display zur Datenübertragung
- RESET: Setzt den Controller in den Ausgangszustand zurück
Einige Displays verfügen zusätzlich über eine Backlight-Steuerung, die meist einfach über einen digitalen Pin realisiert ist.
Grafische Steuerung
Im Betrieb „malt“ der Mikrocontroller gewissermaßen direkt in den Bildspeicher des Displays. Das geschieht durch Befehle wie:
- Pixel setzen (draw_pixel)
- Flächen füllen (fill_rect, fill)
- Text anzeigen (text)
- Bilder oder Bitmaps darstellen
Da der Mikrocontroller den Display-Inhalt manuell aktualisiert, ist der Datendurchsatz (insbesondere bei Animationen) eng mit der SPI-Geschwindigkeit und der Optimierung des Codes verknüpft.
Schritt 2: Verkabelung des Waveshare 1.69″ LCD-Moduls mit dem Raspberry Pi Pico
Bevor wir mit dem Code beginnen, müssen Display und Mikrocontroller korrekt verbunden sein. Das Waveshare 1.69″ LCD-Modul nutzt das SPI-Protokoll zur Kommunikation. Der ST7789-Treiberchip steuert das Display an und erwartet Signale über mehrere dedizierte Pins.
Hier ist die genaue Pinbelegung, wie ich sie im Projekt verwendet habe:
Display-Pin (Waveshare) | Funktion | Raspberry Pi Pico |
---|---|---|
VCC | Stromversorgung | 3.3V (Pin 36) |
GND | Masse | GND (Pin 38) |
DIN | SPI MOSI | GP7 (Pin 10) |
CLK | SPI SCK | GP6 (Pin 9) |
CS | Chip Select | GP17 (Pin 22) |
DC | Data/Command | GP16 (Pin 21) |
RST | Reset | GP20 (Pin 26) |
BLK | Hintergrund-Beleuchtung | 3.3V (kann auch an einen freien GPIO) |
Hinweis zur Hintergrundbeleuchtung (BLK):
Du kannst diesen Pin dauerhaft auf 3.3 V legen (immer an), oder an einen GPIO anschließen, wenn du das Backlight per Software steuern möchtest. Im gezeigten Code wird er nicht gesteuert – das Display leuchtet dauerhaft.
Schaltplan-Details
Das Display kommuniziert über SPI0, was sich durch die Nutzung von SPI(0)
im Code zeigt. Die gewählten Pins (GP6 = SCK, GP7 = MOSI) sind Standard-SPI-Pins auf dem Pico und werden explizit gesetzt. Der MISO-Pin wird nicht verwendet, da das Display nur empfangen muss, nicht senden.
Die Verbindung erfordert 7 Kabel (8 mit dimmbarer Beleuchtung), und die Stromversorgung erfolgt über 3.3 V – nicht 5 V! Die Kommunikation läuft über SPI, ergänzt durch CS, DC und RST zur Steuerung des Displays.
Sobald das Display korrekt angeschlossen ist, kannst du es im nächsten Schritt initialisieren und mit Leben füllen.
Schritt 3: st7789py
-Bibliothek (mit Anpassungen für 240×280)
Um das LCD-Modul anzusteuern, verwenden wir die MicroPython-Bibliothek st7789py
. Diese bietet eine umfassende Unterstützung für Displays mit dem ST7789-Treiberchip – allerdings unterstützt sie von Haus aus nur gängige Auflösungen wie 240×240, 240×320, 135×240 oder 128×128 Pixel.
Unser Display hat jedoch eine ungewöhnliche Auflösung von 240×280 Pixel, daher sind kleine, aber notwendige Anpassungen im Quellcode nötig, damit alles korrekt funktioniert.
Woher kommt die Bibliothek?
Die Bibliothek ist auf GitHub verfügbar (im Unterordner lib
):
https://github.com/russhughes/st7789py_mpy
Du kannst die Datei st7789py.py
manuell herunterladen und auf den Raspberry Pi Pico kopieren – z. B. über Thonny oder am einfachsten via USB-Dateisystem.
Anpassungen für 240×280 Pixel
Damit das Display erkannt und korrekt initialisiert wird, musst du die Datei st7789py.py
an zwei Stellen erweitern:
1. Auflösung zum Support hinzufügen
In der Nähe der _SUPPORTED_DISPLAYS
-Konstante fügst du den Eintrag für 240×280 hinzu:
_SUPPORTED_DISPLAYS = (
(240, 280, _DISPLAY_240x280), # <-- Diese Zeile ergänzt
(240, 320, _DISPLAY_240x320),
(240, 240, _DISPLAY_240x240),
...
)
2. Neue Display-Konfiguration anlegen
Definiere eine neue Rotations-Tabelle _DISPLAY_240x280
. Beispiel:
_DISPLAY_240x280 = (
(0x00, 240, 280, 0, 20, False),
(0x60, 280, 240, 20, 0, False),
(0xc0, 240, 280, 0, 0, False),
(0xa0, 280, 240, 20, 20, False)
)
Diese Tabelle legt fest, wie das Display je nach Rotation angesprochen wird – Breite, Höhe und Offset.
Schritt 4: Schriftart einbinden
Damit Texte auf dem LCD gut lesbar erscheinen – z. B. große Zahlen, Statusanzeigen oder Titel – können Bitmap-Schriftarten verwendet werden. Diese sind speziell für kleine Displays optimiert und verursachen wenig Speicher- und Rechenaufwand.
Für die Darstellung von Text benötigen wir eine passende Font-Datei. In diesem Beispiel verwenden wir die Schriftart vga1_16x32
, die aus dem GitHub-Repository russhughes/st7789_mpy stammt.
Die benötigte Font-Datei findest du im Verzeichnis fonts/bitmap
des Projekts:
Link zum Ordner:
https://github.com/russhughes/st7789_mpy/tree/master/fonts/bitmap
Dort befinden sich viele verschiedene Bitmap-Fonts. Für unseren Zweck eignet sich die gut lesbare Schrift vga1_16x32.py
.
So speicherst du die Datei
- Öffne den Link zur Datei:
vga1_16x32.py - Klicke auf „Raw“ (oben rechts im Dateibereich).
- Speichere die Datei mit Rechtsklick → „Speichern unter…“ oder per Strg+S auf deinem Computer ab. Wichtig: Die Datei muss genau
vga1_16x32.py
heißen.
Datei auf den Pi Pico kopieren
Um die Schriftart auf dem Raspberry Pi Pico zu nutzen, musst du sie per USB-Verbindung auf das Gerät übertragen:
- Öffne Thonny (oder ein vergleichbares MicroPython-Tool).
- Verbinde dich mit deinem Pi Pico.
- Wähle im Menü: „Dateien > Hochladen auf /“ (Stammverzeichnis des Geräts).
- Lade die Datei
vga1_16x32.py
hoch.
Wenn alles geklappt hat, befindet sich die Datei jetzt auf dem Pi Pico und kann später im Code eingebunden und verwendet werden.
Schritt 5: „Hello World!“ anzeigen
Nachdem das Display verkabelt wurde, die benötigte Bibliothek installiert und die Schriftart vga1_16x32.py
auf den Raspberry Pi Pico übertragen wurde, kannst du nun den ersten Text auf dem Bildschirm darstellen. Dieses Beispiel zeigt, wie du den Text „Hello, World!“ groß und zentriert auf dem Display ausgibst.

from machine import Pin, SPI
import st7789py as st7789
import vga1_16x32
from time import sleep
spi = SPI(0, baudrate=40000000, polarity=1, phase=1, sck=Pin(6), mosi=Pin(7))
# Output-Pins setzen
reset_pin = Pin(20, Pin.OUT)
dc_pin = Pin(16, Pin.OUT)
cs_pin = Pin(17, Pin.OUT)
tft = st7789.ST7789(spi, 240, 280, reset=reset_pin, dc=dc_pin, cs=cs_pin)
tft.fill(st7789.WHITE)
tft.text(vga1_16x32, "Hello,", 60, 100, st7789.BLACK, st7789.WHITE)
tft.text(vga1_16x32, "World!", 60, 140, st7789.BLACK, st7789.WHITE)
Hinweise:
- Die Koordinaten
60, 100
und60, 140
positionieren die beiden Textzeilen mittig im oberen Drittel des Bildschirms. - Die Farben
BLACK
(Text) undWHITE
(Hintergrund) sorgen für gute Lesbarkeit. - Wenn du andere Schriftarten nutzt, musst du die Positionen ggf. anpassen.
Schritt 6: Beispielhafte Display-Verwendungen
Farbwechsel: Bunte Bildschirmanimation
Mit diesem einfachen Beispiel wird das Display nacheinander mit verschiedenen Farben gefüllt. Das hilft, das Display zu testen und einen Eindruck von den verfügbaren Farben zu bekommen. Die Farben wechseln alle 0,5 Sekunden.

from machine import Pin, SPI
import st7789py as st7789
from time import sleep
# SPI und Display initialisieren
spi = SPI(0, baudrate=40000000, polarity=1, phase=1, sck=Pin(6), mosi=Pin(7))
tft = st7789.ST7789(spi, 240, 280, reset=Pin(20, Pin.OUT), dc=Pin(16, Pin.OUT), cs=Pin(17, Pin.OUT))
# Liste der Farben
colors = [st7789.RED, st7789.GREEN, st7789.BLUE, st7789.YELLOW, st7789.CYAN, st7789.MAGENTA, st7789.WHITE, st7789.BLACK]
# Endlosschleife: Bildschirm mit Farben füllen
while True:
for color in colors:
tft.fill(color)
sleep(0.5)
Erklärung:
tft.fill(color)
füllt den gesamten Bildschirm mit der angegebenen Farbe.- Die Schleife läuft unendlich und zeigt jede Farbe für 0,5 Sekunden.
- So sieht man alle Farben nacheinander auf dem Display.
Zähler: Zahlen hochzählen lassen
Dieses Beispiel zeigt, wie man eine fortlaufende Zahl von 0 an auf dem Display darstellen kann. Dabei wird der Hintergrund vor jedem Update gelöscht, damit keine Überreste vom vorherigen Text sichtbar sind.

from machine import Pin, SPI
import st7789py as st7789
import vga1_16x32
from time import sleep
spi = SPI(0, baudrate=40000000, polarity=1, phase=1, sck=Pin(6), mosi=Pin(7))
tft = st7789.ST7789(spi, 240, 280, reset=Pin(20, Pin.OUT), dc=Pin(16, Pin.OUT), cs=Pin(17, Pin.OUT))
count = 0
while True:
tft.fill(st7789.WHITE) # Bildschirm weiß füllen
tft.text(vga1_16x32, str(count), 110, 120, st7789.BLACK, st7789.WHITE) # Zahl zeichnen
count += 1
sleep(1)
Erklärung:
tft.fill(st7789.WHITE)
löscht den Bildschirm vor jeder neuen Zahl, damit keine Überlappungen entstehen.- Die Funktion
tft.text()
schreibt den aktuellen Wert voncount
in der großen Schriftvga1_16x32
. - Die Zahlen erscheinen in Schwarz auf weißem Hintergrund.
- Die Schleife erhöht die Zahl jede Sekunde um 1.
Vertikaler Füllbalken: Magenta von unten nach oben
In diesem Beispiel füllt sich der Bildschirm langsam von unten nach oben mit der Farbe Magenta. Das ist ein einfaches, aber effektvolles Beispiel für Bildschirmmanipulation mit fill_rect
.

from machine import Pin, SPI
import st7789py as st7789
from time import sleep_ms
spi = SPI(0, baudrate=40000000, polarity=1, phase=1, sck=Pin(6), mosi=Pin(7))
tft = st7789.ST7789(spi, 240, 280, reset=Pin(20, Pin.OUT), dc=Pin(16, Pin.OUT), cs=Pin(17, Pin.OUT))
tft.fill(st7789.BLACK) # Starte mit schwarzem Bildschirm
for y in range(279, -1, -1): # Von unten (279) nach oben (0)
tft.fill_rect(0, y, 240, 1, st7789.MAGENTA)
sleep_ms(5)
Erklärung:
- Der gesamte Bildschirm wird zuerst mit Schwarz gefüllt.
- Dann wird in jeder Schleifeniteration eine horizontale Linie (1 Pixel hoch, 240 Pixel breit) in Magenta gezeichnet.
- Das erfolgt von der unteren Bildschirmkante (
y = 279
) nach oben (y = 0
). - Durch das kurze
sleep_ms(5)
entsteht ein sanfter „Hochlauf“-Effekt.
Farbspirale: Bunte Spiralen-Animation auf dem Display
Dieses Beispiel zeichnet eine farbige Spirale aus kleinen Quadraten auf dem Display. Die Positionen der Quadrate werden mithilfe von Polarkoordinaten berechnet, wobei Radius und Winkel schrittweise erhöht werden. So entsteht eine dynamische, wachsende Spirale mit wechselnden Farben.

from machine import Pin, SPI
import st7789py as st7789
from time import sleep_ms
import math
spi = SPI(0, baudrate=40000000, polarity=1, phase=1, sck=Pin(6), mosi=Pin(7))
tft = st7789.ST7789(spi, 240, 280, reset=Pin(20, Pin.OUT), dc=Pin(16, Pin.OUT), cs=Pin(17, Pin.OUT))
colors = [st7789.RED, st7789.GREEN, st7789.BLUE, st7789.YELLOW, st7789.CYAN, st7789.MAGENTA, st7789.WHITE]
cx, cy = 120, 140 # Mittelpunkt der Spirale (Bildschirmmitte)
step = 0
radius = 0
angle = 0
while True:
x = int(cx + radius * math.cos(angle))
y = int(cy + radius * math.sin(angle))
color = colors[step % len(colors)]
tft.fill_rect(x, y, 4, 4, color) # Kleines farbiges Quadrat zeichnen
angle += 0.3 # Winkel erhöhen (Rotation)
radius += 0.5 # Radius erhöhen (Spiralwachstum)
step += 1
if radius > 140: # Wenn Spiralradius zu groß wird, Bildschirm löschen und neu starten
tft.fill(st7789.BLACK)
radius = 0
angle = 0
sleep_ms(30) # kurze Pause für Animation
Erklärung:
cx
undcy
bestimmen den Mittelpunkt der Spirale auf dem Display.radius
undangle
sind die Polarkoordinaten, die in x,y-Koordinaten umgerechnet werden, um die Position jedes Quadrats zu bestimmen.- Die Farbe wird zyklisch aus der
colors
-Liste ausgewählt. - Nach Erreichen des maximalen Radius wird der Bildschirm gelöscht und die Spirale neu gestartet.
sleep_ms(30)
steuert die Geschwindigkeit der Animation.
Schritt 6: Weiterführende Ideen & Ausblick
Sobald das Display erfolgreich läuft, eröffnen sich zahlreiche spannende Möglichkeiten für eigene Projekte. Die Kombination aus Textausgabe, Farben und kleinen Grafiken reicht bereits aus, um beeindruckende Anwendungen zu bauen. Hier einige konkrete Ideen:
1. Sensorwerte visualisieren
Nutze Sensoren wie Temperatur-, Feuchtigkeits- oder Lichtsensoren, um Live-Daten direkt auf dem Display anzuzeigen. Mit einer einfachen Textausgabe oder einem Balkendiagramm lässt sich ein kleines Dashboard bauen.
2. Digitale Uhr oder Timer
Mit Hilfe des time
-Moduls oder einer RTC (Echtzeituhr) kannst du eine Uhr auf dem Display anzeigen. Dank der größeren Schriftarten lassen sich auch Wecker, Timer oder sogar Stoppuhren mit wenigen Zeilen umsetzen.
3. Mini-Spiele
Dank der Möglichkeit, Pixel, Rechtecke und Texte darzustellen, kannst du einfache Spiele realisieren – zum Beispiel Snake, Pong oder ein Reaktionsspiel. Die Animationen lassen sich direkt im Hauptloop steuern.
4. Anzeige von Internetdaten
Wenn du deinen Raspberry Pi Pico W (mit WLAN) nutzt, kannst du aktuelle Wetterdaten, Nachrichten oder Börsenkurse aus dem Internet laden und auf dem Display anzeigen. Eine einfache textbasierte Darstellung genügt für viele Anwendungen.
Fazit
Mit dem Waveshare 1,69 Zoll ST7789 Display und dem Raspberry Pi Pico hast du ein leistungsfähiges Setup für farbige Grafik-Displays. Die Einrichtung ist dank MicroPython und der passenden Bibliotheken relativ unkompliziert – und mit etwas Übung kannst du schnell eigene Texte, Grafiken und Animationen realisieren. Die vorgestellten Beispiele und Tipps helfen dir, das Display optimal zu nutzen und auch ähnliche Module problemlos anzusteuern. Viel Spaß beim Experimentieren!
Hier findest du auf dem Blog weitere spannende Raspberry Pi Pico Projekte!