原视频代码未经优化,触摸有些卡顿,这篇文章提供了优化后的完整代码,开发板固件参考文章《LVGL_MicroPython:在MicroPython上使用LVGL图形库一个第三方开源项目》。开发板为优奕视界5inch触摸屏esp32-s3开发板,屏幕分辨率480*800,屏幕驱动IC为ST7262,触摸驱动为GT911。
对视频中展示的代码进行了部分优化,这里分享给大家:
• 提高了触摸驱动I2C频率
• 减小了主循环中延迟时间
import lvgl as lv # 导入 LVGL 库
import lcd_bus # 导入 LCD 总线库
import rgb_display # 导入 RGB 显示库
import i2c # 导入 I2C 通信库
import gt911 # 导入 GT911 触摸屏驱动库
import time # 导入时间库
# 定义显示屏参数
_WIDTH = 800 # 显示屏宽度
_HEIGHT = 480 # 显示屏高度
# 定义 RGB 总线配置
rgb_bus = lcd_bus.RGBBus( # 创建 RGB 总线对象
hsync=39, # 水平同步信号引脚
vsync=41, # 垂直同步信号引脚
de=40, # 数据使能信号引脚
disp=-1, # 显示屏选择引脚(未使用)
pclk=42, # 像素时钟信号引脚
data0=8, data1=3, data2=46, data3=9, data4=1, # 数据信号引脚
data5=5, data6=6, data7=7, data8=15, data9=16, data10=4,
data11=45, data12=48, data13=47, data14=21, data15=14,
freq=12500000, # 像素时钟频率
hsync_front_porch=8, # 水平同步信号前沿脉冲宽度
hsync_pulse_width=4, # 水平同步信号脉冲宽度
hsync_back_porch=8, # 水平同步信号后沿脉冲宽度
hsync_idle_low=False, # 水平同步信号空闲状态为低电平
vsync_front_porch=8, # 垂直同步信号前沿脉冲宽度
vsync_pulse_width=4, # 垂直同步信号脉冲宽度
vsync_back_porch=8, # 垂直同步信号后沿脉冲宽度
)
# 分配帧缓冲区
_BUF1 = rgb_bus.allocate_framebuffer(_WIDTH * _HEIGHT * 2, lcd_bus.MEMORY_SPIRAM) # 分配第一个帧缓冲区,使用 SPIRAM 内存
_BUF2 = rgb_bus.allocate_framebuffer(_WIDTH * _HEIGHT * 2, lcd_bus.MEMORY_SPIRAM) # 分配第二个帧缓冲区,使用 SPIRAM 内存
# 初始化 RGB 显示屏
display = rgb_display.RGBDisplay( # 创建 RGB 显示屏对象
data_bus=rgb_bus, # 设置数据总线
display_width=_WIDTH, # 设置显示屏宽度
display_height=_HEIGHT, # 设置显示屏高度
frame_buffer1=_BUF1, # 设置第一个帧缓冲区
frame_buffer2=_BUF2, # 设置第二个帧缓冲区
backlight_pin=2, # 设置背光控制引脚
color_space=lv.COLOR_FORMAT.RGB565, # 设置颜色空间为 RGB565
rgb565_byte_swap=False, # 设置 RGB565 字节顺序为正常
)
display.set_power(True) # 打开显示屏电源
display.set_backlight(5) # 设置背光亮度
# 初始化 LVGL
lv.init() # 初始化 LVGL 库
# 创建屏幕和控件
scrn = lv.screen_active() # 获取当前活动屏幕
lslider = lv.slider(scrn) # 创建一个水平滑块
lslider.set_style_size(40, 480, lv.PART.MAIN) # 设置滑块大小
lslider.align(lv.ALIGN.TOP_LEFT, 50, 0) # 将滑块放置在屏幕左上角
rslider = lv.slider(scrn) # 创建一个垂直滑块
rslider.set_style_size(40, 480, lv.PART.MAIN) # 设置滑块大小
rslider.align(lv.ALIGN.TOP_RIGHT, -50, 0) # 将滑块放置在屏幕右上角
btn = lv.button(scrn) # 创建一个按钮
btn.align(lv.ALIGN.CENTER, 0, 0) # 将按钮放置在屏幕中央
label = lv.label(btn) # 创建一个标签
label.set_text('Hello World!') # 设置标签文本
arc2 = lv.arc(scrn) # 创建一个圆弧 仅作展示
arc2.align(lv.ALIGN.CENTER, 0, 0) # 将圆弧放置在屏幕中央
arc2.set_end_angle(135) # 设置圆弧结束角度
arc2.set_size(300, 300) # 设置圆弧大小
# 初始化触摸驱动
i2c_bus = i2c.I2CBus(scl=20, sda=19, freq=400000, host=None, use_locks=False) # 创建 I2C 总线对象
touch_driver = gt911.GT911(i2c_bus=i2c_bus, reset_pin=None, interrupt_pin=None, touch_cal=None) # 创建 GT911 触摸屏驱动对象
# 主循环
while True:
# 更新 LVGL
time.sleep_ms(1) # 延迟 1 毫秒
lv.tick_inc(1) # 更新 LVGL 时间
lv.task_handler() # 处理 LVGL 任务