一、前言
这里使用python进行开发。图片显示的话暂时只能显示bmp格式的图片。需要将图片转换为240x240大小的bmp格式(也就是安装了st7789芯片的显示器的大小).
以下是转换地址
https://convertio.co/zh/download/8c0363a07b21bfb45834b96f0b1fdf8507864e/
还需要一个st7789的驱动
https://github.com/russhughes/st7789py_mpy/blob/master/lib/st7789py.py。
还有另外一种使用bin的方式驱动的,比较复杂就没尝试。
做到这里发现使用thonny在esp32上面使用python开发代码有个致命问题,如果有些功能固件不满足的话,需要找专门固件进行重新安装。所以如果想做一个功能,需要的功能没有一个都满足需求的固件还需要自己去做,这就很麻烦的,所以后面使用c++去进行开发,不使用python了。
二、前置准备
将图准备好,将驱动文件上传到esp32上的磁盘上。如何将电脑上的文件上传,参考下面方式,打开这个选项。然后可以看到电脑目录

然后如下操作,选择上传到/ 选项即可

上传完后,然后把st7789芯片的显示器接到esp32上,以下是一个示例接法。八根线,对应如下
GND->GND
VCC-> 3v3
SCL->D15
SDA->D4
RES->D5
DC->D21
CS->D22
BL->D23
其中GND、VCC可以随便换,只要引脚别冲突就好。
三、代码
import machine
import st7789py as st7789
import time
# --- 引脚配置(按照你的实际接线)---
SPI_SCK_PIN = 15 # SCL -> D15
SPI_MOSI_PIN = 4 # SDA -> D4
RST_PIN = 5 # RES -> D5
DC_PIN = 21 # DC -> D21
CS_PIN = 22 # CS -> D22
BL_PIN = 23 # BL -> D23
# --- 初始化 SPI(降低波特率提高稳定性)---
spi = machine.SPI(1, baudrate=20000000, polarity=1, phase=1,
sck=machine.Pin(SPI_SCK_PIN),
mosi=machine.Pin(SPI_MOSI_PIN))
# --- 初始化屏幕(加入 cs 引脚)---
tft = st7789.ST7789(
spi,
240, 240,
reset=machine.Pin(RST_PIN, machine.Pin.OUT),
dc=machine.Pin(DC_PIN, machine.Pin.OUT),
cs=machine.Pin(CS_PIN, machine.Pin.OUT), # 重要:片选引脚
backlight=machine.Pin(BL_PIN, machine.Pin.OUT),
rotation=0
)
tft.fill(st7789.BLACK) # 清屏
# --- 显示 24位 BMP 图片的函数(不变)---
def draw_bmp(tft, filename, x=0, y=0):
try:
with open(filename, "rb") as f:
if f.read(2) != b'BM':
print("不是有效的 BMP 文件")
return
f.seek(10)
data_offset = int.from_bytes(f.read(4), "little")
f.seek(18)
img_width = int.from_bytes(f.read(4), "little")
img_height = int.from_bytes(f.read(4), "little")
f.seek(data_offset)
for row in range(img_height - 1, -1, -1):
row_data = f.read(img_width * 3)
buffer = bytearray(img_width * 2)
for col in range(img_width):
b = row_data[col * 3]
g = row_data[col * 3 + 1]
r = row_data[col * 3 + 2]
color565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)
buffer[col * 2] = (color565 >> 8) & 0xFF
buffer[col * 2 + 1] = color565 & 0xFF
tft.blit_buffer(buffer, x, y + row, img_width, 1)
except Exception as e:
print("读取图片出错:", e)
# --- 调用显示(请确保 logo.bmp 已上传到 ESP32 根目录)---
print("开始显示图片...")
draw_bmp(tft, "image.bmp", 0, 0)
print("显示完成")

362

被折叠的 条评论
为什么被折叠?



