LVGL学习(二)- 定时器

一、简介

上一章,我们尝鲜了一下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,更多关于定时器的功能,就需要大家自己动手操作一下了。

相关推荐
t_guest3 小时前
LVGL学习(三)- 日志
入门·lvgl
zhbi981 个月前
LVGL8.3标签Label高级应用
ui·lvgl
The_superstar62 个月前
衡山派lvgl小练
串口·lvgl·衡山派·ds133ebs
The_superstar62 个月前
衡山派LVGL注意点
单片机·lvgl·衡山派·俊杰
xzl042 个月前
LVGL显示移植:lv_port_disp.c 详情介绍
rt-thread·lvgl·ra6m3-hmi-board
xzl042 个月前
LVGL输入移植:lv_port_indev.c 详情介绍
lvgl·ra6m3-hmi-board
10Eugene2 个月前
LVGL V9增加实体按键 驱动层和应用层的处理
c·lvgl
xzl042 个月前
LVGL 启动流程全解析:RT-Thread 下的界面渲染链路
rt-thread·lvgl
xzl042 个月前
LVGL Coffee UI 接入实战:问题解决全记录
ui·rt-thread·lvgl