Raspberry Pi Pico + microPythonでST7789を制御する
外部ライブラリを使うことなく、microPythonでST7789を制御してカラー液晶に表示できたので、メモ。
使用したのはこちらの安価なIPSカラー液晶ディスプレイ。
https://www.amazon.co.jp/gp/product/B07SZC2PSP/
ソースは以下の通り。
動作内容は、初期化で全域赤で塗りつぶしてから、ランダムな位置に白点を打っていくというもの。4096色モードを使用している。
# --------------------------------------------
# Raspberry Pi Pico + microPython IPS液晶
# 2022.3
# --------------------------------------------
from machine import Pin, SPI
import utime
import random
import struct
#---- ピンの定義
led = Pin(25, Pin.OUT)
#---- SPIの定義 IPS液晶
dc_ips = Pin(4, mode=Pin.OUT, value=1)
spi_ips = SPI(0, baudrate=50000000, polarity=1, phase=1, bits=8, firstbit=SPI.MSB, sck=Pin(2), mosi=Pin(3), miso=Pin(0))
print(spi_ips)
#---- グローバル変数
led_count = 0 # LED点滅制御用
#---- LED点滅制御
def control_led_blink():
global led_count
if led_count == 100:
led_count = 0
else:
led_count += 1
led.value(1 if led_count < 50 else 0)
#---- IPS初期化
def spi_ips_write_cmd(cmd):
dc_ips.value(0)
spi_ips.write(cmd)
def spi_ips_write_data(data):
dc_ips.value(1)
spi_ips.write(data)
def init_ips():
# リセット
spi_ips_write_cmd(b"\x01")
utime.sleep_ms(150)
# スリープOUT
spi_ips_write_cmd(b"\x11")
utime.sleep_ms(100)
# カラーモード=4096色
spi_ips_write_cmd(b"\x3A")
spi_ips_write_data(b"\x33")
utime.sleep_ms(100)
# メモリデータアクセス制御=RGB
spi_ips_write_cmd(b"\x36")
spi_ips_write_data(b"\x00")
utime.sleep_ms(100)
# カラムアドレス=先頭
spi_ips_write_cmd(b"\x2A")
spi_ips_write_data(b"\x00\x00")
spi_ips_write_data(b"\x01\x00")
utime.sleep_ms(100)
# ロウアドレス=先頭
spi_ips_write_cmd(b"\x2B")
spi_ips_write_data(b"\x00\x00")
spi_ips_write_data(b"\x01\x00")
utime.sleep_ms(100)
# ディスプレイ表示反転=ON
spi_ips_write_cmd(b"\x21")
utime.sleep_ms(100)
# 全域を赤で塗りつぶす
spi_ips_write_cmd(b"\x2C")
i = 0
while i < 32768:
spi_ips_write_data(b"\xf0\x0f\x00")
i += 1
utime.sleep_ms(100)
# パーシャルOFF
spi_ips_write_cmd(b"\x13")
utime.sleep_ms(100)
# 表示ON
spi_ips_write_cmd(b"\x29")
utime.sleep_ms(100)
#---- 起動ウェイト
utime.sleep_ms(200)
#---- IPS初期化
init_ips()
#---- メインループ
while True:
utime.sleep_ms(10)
# 10ms周期
control_led_blink() # 10ms毎にLEDブリンク制御
# ランダム座標を生成する
x = random.randrange(239)
y = random.randrange(239)
xbytes = struct.pack(">H", x)
ybytes = struct.pack(">H", y)
# ロウにX座標をセット
spi_ips_write_cmd(b"\x2A")
spi_ips_write_data(xbytes)
spi_ips_write_data(xbytes)
# カラムにY座標をセット
spi_ips_write_cmd(b"\x2B")
spi_ips_write_data(ybytes)
spi_ips_write_data(ybytes)
# フレームメモリにデータをライト(白)
spi_ips_write_cmd(b"\x2C")
spi_ips_write_data(b"\xFF\xFF\xFF")