一. 所需器件工具
1.ESP32-CAM开发板。开发板购买链接
2.TFT-1.44寸屏。TFT-1.44寸屏购买链接
二. 硬件SPI接口简介
有两个硬件SPI通道允许更快的传输速率(最高80Mhz)。
|
HSPI (id=1) |
VSPI (id=2) |
sck |
14 |
18 |
mosi |
13 |
23 |
miso |
12 |
19 |
三. TFT-1.44寸屏简介
对于1.44寸TFT屏幕,驱动芯片ST7735是常用的选择之一。ST7735是一款低功耗的彩色TFT液晶屏驱动芯片,广泛应用于各种嵌入式系统和电子设备中,具有低功耗和高性能的特点。它支持SPI接口,可以与STM32微控制器等嵌入式系统集成。
四. 分段代码
首先需要导入需要的模块函数。
from machine import Pin, SPI
import time
import struct
然后是对IO接口进行定义,以及SPI接口的初始化,TFT-1.44寸屏的初始化等。
# 定义SPI引脚
MISO = Pin(12) #RST/DO
MOSI = Pin(13) #DI
SCLK = Pin(14) #SC
dc = Pin(15,Pin.OUT) #RS
cs = Pin(2,Pin.OUT) #CS
blk= Pin(4,Pin.OUT) #BLK
# 初始化SPI对象
spi = SPI(1)
spi.init(baudrate=40000000, miso=MISO, mosi=MOSI, sck=SCLK, polarity=0, phase=0)
# 初始化显示屏
def init_screen():
blk.on()
send_command(0x01)
time.sleep_ms(200)
time.sleep_ms(50)
send_command(0x11) # 退出睡眠
time.sleep_ms(120)
#ST7735R Frame Rate
send_command(0xB1)
spi.write(bytes([0x01, 0x2C, 0x2D]))
send_command(0xB2)
spi.write(bytes([0x01, 0x2C, 0x2D]))
send_command(0xB3)
spi.write(bytes([0x01, 0x2C, 0x2D]))
send_command(0xB4) #颜色反转
send_data(0x07)
send_command(0x2A) # 设置列地址
spi.write(bytes([0x00, 0x00, 0x00, 0x70]))
send_command(0x2B) # 设置行地址
spi.write(bytes([0x00, 0x00, 0x00, 0x90]))
send_command(0x36) # 设置显示方向
send_data(0x48)
send_command(0x3A) # 设置颜色模式
send_data(0x05) # 16位色彩模式
send_command(0x29) # 打开显示
显示字符,我们就需要有字模,这里使用的字模为5*8的字体大小。
font = [
[0x00, 0x00, 0x00, 0x00, 0x00],#空格
[0x00, 0x00, 0x5F, 0x00, 0x00],#'!'
[0x00, 0x07, 0x00, 0x07, 0x00],#'"':
[0x14, 0x7F, 0x14, 0x7F, 0x14],#'#':
[0x24, 0x2A, 0x7F, 0x2A, 0x12],#'$':
[0x23, 0x13, 0x08, 0x64, 0x62],#'%':
[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, 0x50, 0x30, 0x00, 0x00],#',':
[0x08, 0x08, 0x08, 0x08, 0x08],#'-':
[0x00, 0x60, 0x60, 0x00, 0x00],#'.':
[0x20, 0x10, 0x08, 0x04, 0x02],#'/':
[0x3E, 0x51, 0x49, 0x45, 0x3E],#'0':
[0x00, 0x42, 0x7F, 0x40, 0x00],#'1':
[0x42, 0x61, 0x51, 0x49, 0x46],#'2':
[0x21, 0x41, 0x45, 0x4B, 0x31],#'3':
[0x18, 0x14, 0x12, 0x7F, 0x10],#'4':
[0x27, 0x45, 0x45, 0x45, 0x39],#'5':
[0x3C, 0x4A, 0x49, 0x49, 0x30],#'6':
[0x01, 0x71, 0x09, 0x05, 0x03],#'7':
[0x36, 0x49, 0x49, 0x49, 0x36],#'8':
[0x06, 0x49, 0x49, 0x29, 0x1E],#'9':
[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, 0x79, 0x41, 0x3E],#'@':
[0x7E, 0x11, 0x11, 0x11, 0x7E],#'A':
[0x7F, 0x49, 0x49, 0x49, 0x36],#'B':
[0x3E, 0x41, 0x41, 0x41, 0x22],#'C':
[0x7F, 0x41, 0x41, 0x22, 0x1C],#'D':
[0x7F, 0x49, 0x49, 0x49, 0x41],#'E':
[0x7F, 0x09, 0x09, 0x09, 0x01],#'F':
[0x3E, 0x41, 0x49, 0x49, 0x7A],#'G':
[0x7F, 0x08, 0x08, 0x08, 0x7F],#'H':
[0x00, 0x41, 0x7F, 0x41, 0x00],#'I':
[0x20, 0x40, 0x41, 0x3F, 0x01],#'J':
[0x7F, 0x08, 0x14, 0x22, 0x41],#'K':
[0x7F, 0x40, 0x40, 0x40, 0x40],#'L':
[0x7F, 0x02, 0x04, 0x02, 0x7F],#'M':
[0x7F, 0x04, 0x08, 0x10, 0x7F],#'N':
[0x3E, 0x41, 0x41, 0x41, 0x3E],#'O':
[0x7F, 0x09, 0x09, 0x09, 0x06],#'P':
[0x3E, 0x41, 0x51, 0x21, 0x5E],#'Q':
[0x7F, 0x09, 0x19, 0x29, 0x46],#'R':
[0x46, 0x49, 0x49, 0x49, 0x31],#'S':
[0x01, 0x01, 0x7F, 0x01, 0x01],#'T':
[0x3F, 0x40, 0x40, 0x40, 0x3F],#'U':
[0x1F, 0x20, 0x40, 0x20, 0x1F],#'V':
[0x7F, 0x20, 0x10, 0x20, 0x7F],#'W':
[0x63, 0x14, 0x08, 0x14, 0x63],#'X':
[0x03, 0x04, 0x78, 0x04, 0x03],#'Y':
[0x61, 0x51, 0x49, 0x45, 0x43],#'Z':
[0x00, 0x7F, 0x41, 0x41, 0x00],#'[':
[0x02, 0x04, 0x08, 0x10, 0x20],#'\\':
[0x00, 0x41, 0x41, 0x7F, 0x00],#']':
[0x04, 0x02, 0x01, 0x02, 0x04],#'^':
[0x40, 0x40, 0x40, 0x40, 0x40],#'_':
[0x00, 0x01, 0x02, 0x04, 0x00],#'`':
[0x20, 0x54, 0x54, 0x54, 0x78],#'a':
[0x7F, 0x48, 0x44, 0x44, 0x38],#'b':
[0x38, 0x44, 0x44, 0x44, 0x20],#'c':
[0x38, 0x44, 0x44, 0x48, 0x7F],#'d':
[0x38, 0x54, 0x54, 0x54, 0x18],#'e':
[0x08, 0x7E, 0x09, 0x01, 0x02],#'f':
[0x0C, 0x52, 0x52, 0x52, 0x3E],#'g':
[0x7F, 0x08, 0x04, 0x04, 0x78],#'h':
[0x00, 0x44, 0x7D, 0x40, 0x00],#'i':
[0x20, 0x40, 0x44, 0x3D, 0x00],#'j':
[0x7F, 0x10, 0x28, 0x44, 0x00],#'k':
[0x00, 0x41, 0x7F, 0x40, 0x00],#'l':
[0x7C, 0x04, 0x18, 0x04, 0x78],#'m':
[0x7C, 0x08, 0x04, 0x04, 0x78],#'n':
[0x38, 0x44, 0x44, 0x44, 0x38],#'o':
[0x7C, 0x14, 0x14, 0x14, 0x08],#'p':
[0x08, 0x14, 0x14, 0x18, 0x7C],#'q':
[0x7C, 0x08, 0x04, 0x04, 0x08],#'r':
[0x48, 0x54, 0x54, 0x54, 0x20],#'s':
[0x04, 0x3F, 0x44, 0x40, 0x20],#'t':
[0x3C, 0x40, 0x40, 0x20, 0x7C],#'u':
[0x1C, 0x20, 0x40, 0x20, 0x1C],#'v':
[0x3C, 0x40, 0x30, 0x40, 0x3C],#'w':
[0x44, 0x28, 0x10, 0x28, 0x44],#'x':
[0x0C, 0x50, 0x50, 0x50, 0x3C],#'y':
[0x44, 0x64, 0x54, 0x4C, 0x44],#'z':
[0x00, 0x08, 0x36, 0x41, 0x00],#'{':
[0x00, 0x00, 0x7F, 0x00, 0x00],#'|':
[0x00, 0x41, 0x36, 0x08, 0x00],#'}':
[0x08, 0x04, 0x08, 0x10, 0x08]#'~':
]
显示字符与图像数据等代码。
# 字符串显示
def set_pixel(x, y, color):
send_command(0x2A) # 设置列地址
send_data(0x00)
send_data(x)
send_data(0x00)
send_data(x)
send_command(0x2B) # 设置行地址
send_data(0x00)
send_data(y)
send_data(0x00)
send_data(y)
send_command(0x36) # 设置显示方向
send_data(0xC8)
send_command(0x2C) # 写入RAM
send_data(color >> 8)
send_data(color & 0xFF)
def display_text(text, x, y, color):
for char in text:
ascii_code = ord(char)
if ascii_code < 32 or ascii_code > 126: # 不支持的字符
continue
data = font[ascii_code - 32]
for i in range(5):
for j in range(8):
if (data[i] >> j) & 0x01:
set_pixel(x + i, y + j, color)
else:
set_pixel(x + i, y + j, 0x0000) # 背景色
x += 6 # 字符间距
# 清屏
def clear_screen():
send_command(0x2c) # 内存写入命令
dc.on() # 数据模式
cs.off() # 选中片选
buf = [0x00]*398*2
spi.write(bytes(buf)) # 写入黑色像素数据
buf = [0x00]*128*2
for i in range(128):#显示范围x为128,地址有132个,
spi.write(bytes(buf)) # 写入黑色像素数据
buf1 = [0x00]*4*2
spi.write(bytes(buf1)) # 写入黑色像素数据
cs.on() # 取消片选
# 显示图片
def draw_image_Vite(image):
send_command(0x2c) # 内存写入命令
dc.on() # 数据模式
cs.off() # 选中片选
buf = [0x00]*398*2
spi.write(bytes(buf)) # 写入黑色像素数据
spi.write(image)
cs.on() # 取消片选
五. 完整代码下载链接
例程下载链接:https://download.csdn.net/download/qq_26043945/88205208