import machine
import time
import st7789py as st7789 # または st7789
# SPIの初期化(PicoのSPI0を使用)
spi = machine.SPI(
0,
baudrate=40_000_000, # 通信速度40MHz
polarity=1, # クロック極性
phase=1, # クロック位相
sck=machine.Pin(18), # SPIクロックピン(GP18)
mosi=machine.Pin(19), # SPIデータ出力ピン(GP19)
miso=None # 受信は使わないためNone
)
# 色の定義(16ビットカラー 565フォーマット)
BLACK = 0x0000
WHITE = 0xFFFF
# ST7789 320x240液晶ディスプレイの初期化
tft = st7789.ST7789(
spi,
240, # 横解像度
320, # 縦解像度
reset=machine.Pin(21, machine.Pin.OUT), # リセットピン(GP21)
dc=machine.Pin(20, machine.Pin.OUT), # D/Cピン(GP20)
cs=machine.Pin(22, machine.Pin.OUT), # チップセレクトピン(GP22)
xstart=0, # X方向のオフセット(調整可)
ystart=0 # Y方向のオフセット(調整可)
)
# ── 3. 全面を 1 回塗りつぶしてから描画 ─────────────────
tft.init()
tft.fill(BLACK) # ここで必ず全面クリア
# 5x8ドットの簡易フォントのビットマップ定義
# 文字ごとに5バイトあり、1バイトが1列、ビットが1行分
simple_font = {
' ' : [0x00, 0x00, 0x00, 0x00, 0x00 ],
'!' : [0x00, 0x00, 0x2f, 0x00, 0x00 ],
'"' : [0x00, 0x07, 0x00, 0x07, 0x00 ],
'#' : [0x14, 0x7f, 0x14, 0x7f, 0x14 ],
'$' : [0x24, 0x2a, 0x7f, 0x2a, 0x12 ],
'%' : [0x62, 0x64, 0x08, 0x13, 0x23 ],
'&' : [0x36, 0x49, 0x55, 0x22, 0x50 ],
'\'' : [0x00, 0x05, 0x03, 0x00, 0x00 ],
'(' : [0x00, 0x1c, 0x22, 0x41, 0x00 ],
')' : [0x00, 0x41, 0x22, 0x1c, 0x00 ],
'*' : [0x14, 0x08, 0x3e, 0x08, 0x14 ],
'+' : [0x08, 0x08, 0x3e, 0x08, 0x08 ],
',' : [0x00, 0x00, 0xa0, 0x60, 0x00 ],
'-' : [0x08, 0x08, 0x08, 0x08, 0x08 ],
'.' : [0x00, 0x60, 0x60, 0x00, 0x00 ],
'/' : [0x20, 0x10, 0x08, 0x04, 0x02 ],
'0' : [0x3E, 0x51, 0x49, 0x45, 0x3E ],
'1' : [0x00, 0x42, 0x7F, 0x40, 0x00 ],
'2' : [0x42, 0x61, 0x51, 0x49, 0x46 ],
'3' : [0x21, 0x41, 0x45, 0x4B, 0x31 ],
'4' : [0x18, 0x14, 0x12, 0x7F, 0x10 ],
'5' : [0x27, 0x45, 0x45, 0x45, 0x39 ],
'6' : [0x3C, 0x4A, 0x49, 0x49, 0x30 ],
'7' : [0x01, 0x71, 0x09, 0x05, 0x03 ],
'8' : [0x36, 0x49, 0x49, 0x49, 0x36 ],
'9' : [0x06, 0x49, 0x49, 0x29, 0x1E ],
':' : [0x00, 0x36, 0x36, 0x00, 0x00 ],
';' : [0x00, 0x56, 0x36, 0x00, 0x00 ],
'<' : [0x08, 0x14, 0x22, 0x41, 0x00 ],
':' : [0x14, 0x14, 0x14, 0x14, 0x14 ],
'>' : [0x00, 0x41, 0x22, 0x14, 0x08 ],
'?' : [0x02, 0x01, 0x51, 0x09, 0x06 ],
'@' : [0x32, 0x49, 0x59, 0x51, 0x3E ],
'A' : [0x7C, 0x12, 0x11, 0x12, 0x7C ],
'B' : [0x7F, 0x49, 0x49, 0x49, 0x36 ],
'C' : [0x3E, 0x41, 0x41, 0x41, 0x22 ],
'D' : [0x7F, 0x41, 0x41, 0x22, 0x1C ],
'E' : [0x7F, 0x49, 0x49, 0x49, 0x41 ],
'F' : [0x7F, 0x09, 0x09, 0x09, 0x01 ],
'G' : [0x3E, 0x41, 0x49, 0x49, 0x7A ],
'H' : [0x7F, 0x08, 0x08, 0x08, 0x7F ],
'I' : [0x00, 0x41, 0x7F, 0x41, 0x00 ],
'J' : [0x20, 0x40, 0x41, 0x3F, 0x01 ],
'K' : [0x7F, 0x08, 0x14, 0x22, 0x41 ],
'L' : [0x7F, 0x40, 0x40, 0x40, 0x40 ],
'M' : [0x7F, 0x02, 0x0C, 0x02, 0x7F ],
'N' : [0x7F, 0x04, 0x08, 0x10, 0x7F ],
'O' : [0x3E, 0x41, 0x41, 0x41, 0x3E ],
'P' : [0x7F, 0x09, 0x09, 0x09, 0x06 ],
'Q' : [0x3E, 0x41, 0x51, 0x21, 0x5E ],
'R' : [0x7F, 0x09, 0x19, 0x29, 0x46 ],
'S' : [0x46, 0x49, 0x49, 0x49, 0x31 ],
'T' : [0x01, 0x01, 0x7F, 0x01, 0x01 ],
'U' : [0x3F, 0x40, 0x40, 0x40, 0x3F ],
'V' : [0x1F, 0x20, 0x40, 0x20, 0x1F ],
'W' : [0x3F, 0x40, 0x38, 0x40, 0x3F ],
'X' : [0x63, 0x14, 0x08, 0x14, 0x63 ],
'Y' : [0x07, 0x08, 0x70, 0x08, 0x07 ],
'Z' : [0x61, 0x51, 0x49, 0x45, 0x43 ],
'' : [0x00, 0x7F, 0x41, 0x41, 0x00 ],
'\\' : [0x55, 0x2A, 0x55, 0x2A, 0x55 ],
'' : [0x00, 0x41, 0x41, 0x7F, 0x00 ],
'^' : [0x04, 0x02, 0x01, 0x02, 0x04 ],
'_' : [0x40, 0x40, 0x40, 0x40, 0x40 ],
'`' : [0x00, 0x01, 0x02, 0x04, 0x00 ],
'a' : [0x20, 0x54, 0x54, 0x54, 0x78 ],
'b' : [0x7F, 0x48, 0x44, 0x44, 0x38 ],
'c' : [0x38, 0x44, 0x44, 0x44, 0x20 ],
'd' : [0x38, 0x44, 0x44, 0x48, 0x7F ],
'e' : [0x38, 0x54, 0x54, 0x54, 0x18 ],
'f' : [0x08, 0x7E, 0x09, 0x01, 0x02 ],
'g' : [0x18, 0xA4, 0xA4, 0xA4, 0x7C ],
'h' : [0x7F, 0x08, 0x04, 0x04, 0x78 ],
'i' : [0x00, 0x44, 0x7D, 0x40, 0x00 ],
'j' : [0x40, 0x80, 0x84, 0x7D, 0x00 ],
'k' : [0x7F, 0x10, 0x28, 0x44, 0x00 ],
'l' : [0x00, 0x41, 0x7F, 0x40, 0x00 ],
'm' : [0x7C, 0x04, 0x18, 0x04, 0x78 ],
'n' : [0x7C, 0x08, 0x04, 0x04, 0x78 ],
'o' : [0x38, 0x44, 0x44, 0x44, 0x38 ],
'p' : [0xFC, 0x24, 0x24, 0x24, 0x18 ],
'q' : [0x18, 0x24, 0x24, 0x18, 0xFC ],
'r' : [0x7C, 0x08, 0x04, 0x04, 0x08 ],
's' : [0x48, 0x54, 0x54, 0x54, 0x20 ],
't' : [0x04, 0x3F, 0x44, 0x40, 0x20 ],
'u' : [0x3C, 0x40, 0x40, 0x20, 0x7C ],
'v' : [0x1C, 0x20, 0x40, 0x20, 0x1C ],
'w' : [0x3C, 0x40, 0x30, 0x40, 0x3C ],
'x' : [0x44, 0x28, 0x10, 0x28, 0x44 ],
'y' : [0x1C, 0xA0, 0xA0, 0xA0, 0x7C ],
'z' : [0x44, 0x64, 0x54, 0x4C, 0x44 ]
}
# 1文字を描画する関数
# x, y: 描画開始座標(左上)
# c: 描画する文字
# color: 文字色
# scale: 文字の拡大倍率(1=原寸、2=2倍など)
def draw_char(x, y, c, color=WHITE, scale=2):
if c not in simple_font:
return # フォント未定義文字は描画しない
bitmap = simple_font[c] # 5列のビットマップを取得
for col in range(5): # 5列分ループ
line = bitmap[col] # 各列のビットパターン
for row in range(8): # 8行分ループ
pixel_on = (line >> row) & 1 # そのビットが立っているか判定
px_color = color if pixel_on else BLACK # 1なら文字色、0なら背景色
# 拡大処理:1ドットをscale×scaleの四角に拡大描画
for dx in range(scale):
for dy in range(scale):
tft.pixel(x + col*scale + dx, y + row*scale + dy, px_color)
# 文字列を描画する関数
# x, y: 描画開始座標
# text: 描画する文字列
# color: 文字色
# spacing: 文字間隔(スケール単位)
# scale: 拡大倍率
def draw_text(x, y, text, color=WHITE, spacing=1, scale=1):
for i, c in enumerate(text):
# 1文字ごとに描画開始位置を計算し描画
draw_char(x + i * (5 * scale + spacing), y, c, color, scale)
# 最初の文字列を原寸(scale=1)で0,0に描画
text = "Hello World!"
x = 0
y = 0
draw_text(x, y, text, WHITE)
# 次の文字列を2倍サイズで、少し下の位置に描画
text = "Raspberry Pi Pico w"
x = 0
y = 20
draw_text(x, y, text, WHITE, scale=2)
# 以下はループで点滅させる例(コメントアウト中)
# while True:
# draw_text(x, y, text, WHITE)
# time.sleep(0.5)
# draw_text(x, y, text, BLACK)
# time.sleep(0.5)
コメント
コメントを投稿