Using the WaveShare 1.47″ Curved SPI Display with a Raspberry Pi Pico and CircuitPython

I recently purchased (read: impulse bought) two of these Waveshare 1.47″ SPI Displays, with curved corners. Looks pretty great, and I thought it might be interesting to use in a project that I am working on using a Raspberry Pi Pico W, they have a picture of it wired up to a pico on the site, so great stuff.

Not so easy, digging through the waveshare site is a bit of a chore, but you can eventually find their product Wiki here and after a few attempts and failed downloads, you can grab zip file with some example code in it…

This is where things get frustrating… they have python code, but aimed at running on a Raspberry Pi where you can run apt-get commands etc. or some C++ code to run on Arduino. I already wanted to run CircuitPython or MicroPython on my pico, as the support for Neopixels (another part of this project) is a lot better in my mind, and I just don’t like C++ that much.

I committed to CircuitPython, and started digging through the Adafruit GitHub for some inspiration… I read the datasheet for the screen and saw that it had a ST7789V3 control chip, and found Adafruits ST7789 repository in there I found an example for a 1.47″ Screen!


Alas, it didn’t work….. the top of the example code from here, looks like this:

import board
import terminalio
import displayio
from adafruit_display_text import label
from adafruit_st7789 import ST7789


# Release any resources currently in use for the displays

spi = board.SPI()
tft_cs = board.D5
tft_dc = board.D6
tft_rst = board.D9

display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)

But that barfs when trying to run it on the Pico…. so a few changes are required.

For starters, you will need to load circuitpython onto your pico… download the appropriate UF2 file (a beta version of v8 at the time of writing) and hold the button on your pico and plug it into your computer… it will show up as a usb drive. Copy the UF2 over, and it will restart and show up as a CircuitPython device, in which is a lib folder.

Then you will need to download the circuitpython bundle to grab some extra libraries. You will need to copy:


over into the lib folder on your pico.

The only real changes to the code are in the first portion above… change it to this

import board
import busio
import terminalio
import displayio

from adafruit_display_text import label
from adafruit_st7789 import ST7789


# Release any resources currently in use for the displays

tft_cs = board.GP5
tft_dc = board.GP6
tft_rst = board.GP7

spi = busio.SPI(board.GP2, board.GP3, board.GP4)
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)

As you can see, there are a few minor changes (underlined). We are now using busio.SPI instead of board.SPI. This has a few arguments, namely your clock, MOSI and MOSO pins. Our pin references are different too.. instead of D6 etc we are now using GP6. I am not sure if this is the nature of it being on a pico, or the sample code is just out of date.

In my example here I am building the SPI connection from the Picos SPI0 using pins GP2,GP3 and GP4 (You can see this in the great pinout by Gadgetoid here) then further communication will be happening on GP5,GP6, and GP7.

The screen does come with a cable with some dupont connectors on one end, so you can just plug these in yourself using the variable names above as a guide. Mine looked like this:

Mine works like this:

VCC - 3v3 Rail
GND - GND Rail
CS - GP5
DC - GP6
BL - GP4

I must admit that took a bit of figuring out, but once I understood what was going on it was pretty simple. The MISO (Module in Sensor Out) and MOSI (Vice Versa) pins are the Tx (Transmit) and Rx (Receive) pins on the Pico. I stuck it all down on my PCB silk screen anyway so I don’t forget.

Because everyone knows, hours of work, £50 and waiting 2 weeks for a delivery from China is the best way to keep notes.

You can then power your pico via VSYS (3.3v) or via USB… up to you. I would recomment powering the display directly from a 3v3 rail and not the pico as when I drove mine from the Pico it was very dim.

Once you load the updated example code into place on your pico it will restart, and if you have everything connected ok, you should have a working 1.47″ screen.

And that’s about it. I haven’t delved into what the adafruit library is capable of just yet, but I have ordered a PCB with traces doing the wiring for the screen to make it a bit less of a cable tangle so I can just run 8 straight cables to the display.

Have fun hacking, and let me know if this was useful in the comments!

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Blog at

Up ↑

%d bloggers like this: