一、简介
上一章,我们尝鲜了一下LVGL,如果没看过的,可以先了解一下:LVGL学习(一)- 初体验-CSDN博客
这一篇,来了解一下LVGL中非常重要的一个概念,定时器。
二、什么是定时器
如果学习过RTOS或者其他操作系统的, 肯定对定时器已经很熟悉了。LVGL中的定时器跟RTOS中的定时器是很接近的,都是软件定时器。
看一个实际的例子
cpp
static int s_cnt = 0;
static lv_timer_t * s_timer;
static void timer_cb(lv_timer_t * t)
{
lv_obj_t * label = lv_timer_get_user_data(t);
s_cnt++;
lv_label_set_text_fmt(label, "Hello, LVGL,cnt:[%d]",s_cnt);
}
int main(void)
{
/* 初始化 LVGL 核心库 */
lv_init();
/* ---- 创建显示设备 ---- */
/* lv_sdl_window_create() 内部会调用 SDL_Init 初始化 SDL,
* 创建窗口,注册刷新定时器,并设置 lv_tick */
lv_display_t * display = lv_sdl_window_create(500, 500);
if(display == NULL) {
return 1;
}
/* 在屏幕中央显示一行文字 */
lv_obj_t * counter_label = lv_label_create(lv_screen_active());
lv_label_set_text_fmt(counter_label, "Hello, LVGL,cnt:[%d]",s_cnt);
lv_obj_center(counter_label); /* 居中对齐 */
s_timer = lv_timer_create(timer_cb, 100, counter_label);
while(1) {
lv_timer_handler();
lv_delay_ms(5);
}
return 0;
}
lv_timer_create
cpp
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data);
创建软件定时器。
timer_xcb 定时器回调函数。
period 定时周期
user_data 用户数据
返回创建好的定时器实例、
cpp
static lv_timer_t * s_timer;
lv_obj_t * counter_label;
s_timer = lv_timer_create(timer_cb, 100, counter_label);
lv_timer_get_user_data
cpp
void * lv_timer_get_user_data(lv_timer_t * timer);
获取在定时器创建时传入的用户数据。
timer定时器结构体。
cpp
lv_obj_t * label = lv_timer_get_user_data(t);
lv_label_set_text_fmt
cpp
void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3);
设置带参数的文本。
cpp
lv_label_set_text_fmt(label, "Hello, LVGL,cnt:[%d]",s_cnt);
运行结果可以看到,窗口上一个数字以100ms周期在计数,一直跳动。
如果我希望创建一个单次运行的定时器要怎么做?
有很多种方式,我们一一介绍。
lv_timer_pause
cpp
void lv_timer_pause(lv_timer_t * timer);
定时器暂停。
timer:要操作的定时器。
例如我们希望这个定时器运行10次就停止,可以在定时器的回调中这么写。
cpp
static void timer_cb(lv_timer_t * t)
{
lv_obj_t * label = lv_timer_get_user_data(t);
s_cnt++;
lv_label_set_text_fmt(label, "Hello, LVGL,cnt:[%d]",s_cnt);
if(s_cnt >= 50) {
lv_timer_pause(s_timer);
}
}
该接口并不会删除定时器,只是让定时器停止了。该定时器占用的资源并没有被释放。
lv_timer_resume
cpp
void lv_timer_pause(lv_timer_t * timer);
暂停的定时器恢复运行。
暂停的定时器可以通过该接口恢复运行。
lv_timer_delete
cpp
void lv_timer_delete(lv_timer_t * timer);
删除指定的定时器。删除后,定时器占用的资源也将被释放。
lv_timer_set_repeat_count
cpp
void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count);
定时器运行多少次之后会暂停。
timer:要操作的定时器。
repeat_count:周期。-1,一直运行。0 停止。>1 运行次数。
作用等价于lv_timer_pause,也不会删除定时器。
lv_timer_set_auto_delete
cpp
void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete);
与lv_timer_set_repeat_count配套使用。当触发repeat_count后是否删除定时器。
timer:要操作的定时器。
auto_delete: true 自动删除,false 到期后暂停。
OK,更多关于定时器的功能,就需要大家自己动手操作一下了。
