按键¶
例程¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import lvgl as lv
import lvgl_helper as lv_h
import lcd
import time
from machine import Timer
import touchscreen as ts
lcd.init()
ts.init()
lv.init()
disp_buf1 = lv.disp_buf_t()
buf1_1 = bytearray(320*10)
lv.disp_buf_init(disp_buf1, buf1_1, None, len(buf1_1)//4)
disp_drv = lv.disp_drv_t()
lv.disp_drv_init(disp_drv)
disp_drv.buffer = disp_buf1
disp_drv.flush_cb = lv_h.flush
disp_drv.hor_res = 320
disp_drv.ver_res = 240
lv.disp_drv_register(disp_drv)
indev_drv = lv.indev_drv_t()
lv.indev_drv_init(indev_drv)
indev_drv.type = lv.INDEV_TYPE.POINTER
indev_drv.read_cb = lv_h.read
lv.indev_drv_register(indev_drv)
btn_count = 0
def on_btn_cb(obj, event):
global btn_count
if event == lv.EVENT.CLICKED:
btn_count += 1
label.set_text(str(btn_count))
print("Button Press:", btn_count)
scr = lv.obj()
btn = lv.btn(scr)
btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0)
label = lv.label(btn)
label.set_text("Button")
label.set_size(20,20)
btn.set_event_cb(on_btn_cb)
lv.scr_load(scr)
tim = time.ticks_ms()
while True:
if time.ticks_ms()-tim > 5:
tim = time.ticks_ms()
lv.task_handler()
lv.tick_inc(5)
|
实验准备¶
将
野火K210 AI视觉相机
连接到CanMV IDE
执行程序
运行结果¶
1.运行程序后,可以看到 野火K210 AI视觉相机
会显示下面内容

2.点击一下 button
按键后,可以看到 button
变成 1

3.再点击一下,可以看到 1
变成 2

4.终端也会打印出信息

讲解¶
1 2 3 4 5 6 | import lvgl as lv
import lvgl_helper as lv_h
import lcd
import time
from machine import Timer
import touchscreen as ts
|
导入所需的库和模块:
lvgl:LVGL图形库的主模块。
lvgl_helper:可能是一个提供辅助功能的自定义模块,用于简化LVGL的使用。
lcd:用于控制LCD显示的模块。
time:Python的时间模块,用于实现延时和计时功能。
machine:提供与硬件相关的功能的模块,如定时器。
touchscreen:用于处理触摸屏输入的模块。
1 2 3 | lcd.init()
ts.init()
lv.init()
|
初始化硬件:
lcd.init():初始化LCD显示。
ts.init():初始化触摸屏。
lv.init():初始化LVGL库。
1 2 3 4 5 6 7 8 9 10 | disp_buf1 = lv.disp_buf_t()
buf1_1 = bytearray(320*10)
lv.disp_buf_init(disp_buf1, buf1_1, None, len(buf1_1)//4)
disp_drv = lv.disp_drv_t()
lv.disp_drv_init(disp_drv)
disp_drv.buffer = disp_buf1
disp_drv.flush_cb = lv_h.flush
disp_drv.hor_res = 320
disp_drv.ver_res = 240
lv.disp_drv_register(disp_drv)
|
设置显示缓冲区和显示驱动:
创建一个显示缓冲区disp_buf1,并分配内存buf1_1。
初始化显示驱动disp_drv,设置缓冲区、刷新回调函数、水平分辨率和垂直分辨率。
注册显示驱动lv.disp_drv_register(disp_drv)。
1 2 3 4 5 | indev_drv = lv.indev_drv_t()
lv.indev_drv_init(indev_drv)
indev_drv.type = lv.INDEV_TYPE.POINTER
indev_drv.read_cb = lv_h.read
lv.indev_drv_register(indev_drv)
|
设置输入设备驱动:
创建一个输入设备驱动indev_drv,并初始化。
设置输入设备类型为指针(触摸屏),并设置读取回调函数。
注册输入设备驱动lv.indev_drv_register(indev_drv)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | btn_count = 0
def on_btn_cb(obj, event):
global btn_count
if event == lv.EVENT.CLICKED:
btn_count += 1
label.set_text(str(btn_count))
print("Button Press:", btn_count)
scr = lv.obj()
btn = lv.btn(scr)
btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0)
label = lv.label(btn)
label.set_text("Button")
label.set_size(20,20)
btn.set_event_cb(on_btn_cb)
|
创建一个按钮和标签,并设置事件回调函数:
创建一个屏幕对象scr。
在屏幕上创建一个按钮btn,并将其居中。
创建一个标签label,设置其文本为”Button”,并设置大小。
设置按钮的事件回调函数on_btn_cb,当按钮被点击时,会增加btn_count的值,并更新标签文本。
1 2 3 4 5 6 7 8 | lv.scr_load(scr)
tim = time.ticks_ms()
while True:
if time.ticks_ms()-tim > 5:
tim = time.ticks_ms()
lv.task_handler()
lv.tick_inc(5)
|
加载屏幕并进入主循环:
lv.scr_load(scr):加载屏幕,使其成为活动屏幕。
在主循环中,定期调用lv.task_handler()来处理LVGL的任务,并调用lv.tick_inc(5)来增加LVGL的内部时钟。