按键

例程

 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)

实验准备

  1. 野火K210 AI视觉相机 连接到 CanMV IDE

  2. 执行程序

运行结果

1.运行程序后,可以看到 野火K210 AI视觉相机 会显示下面内容

野火logo

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

野火logo

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

野火logo

4.终端也会打印出信息

野火logo

讲解

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的内部时钟。