91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣使用LVGL中的timer對(duì)象顯示動(dòng)畫呢?

冬至子 ? 來(lái)源:安德魯?shù)脑O(shè)計(jì)筆記本 ? 作者:安德魯 ? 2023-08-22 11:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

設(shè)計(jì)GUI的顯示元素動(dòng)起來(lái),實(shí)際上是多張圖按照一定的節(jié)奏和變化依次刷屏實(shí)現(xiàn)的。LVGL在內(nèi)核設(shè)計(jì)了timer對(duì)象,用于實(shí)現(xiàn)周期回調(diào)的功能,開發(fā)者可以在周期調(diào)用的回調(diào)函數(shù)中,修改GUI顯示內(nèi)容的屬性,觸發(fā)LVGL顯示內(nèi)容的刷新,然后由LVGL的例行執(zhí)行程序重新刷屏,從而實(shí)現(xiàn)動(dòng)畫效果。

LVGL中的timer對(duì)象

LVGL的后臺(tái)是通過時(shí)間片輪詢對(duì)LVGL的交互任務(wù)進(jìn)行調(diào)度的。

在具體的MCU平臺(tái)上適配LVGL時(shí),通常會(huì)使用SysTick定時(shí)器中斷服務(wù)程序調(diào)用lv_tick_inc()函數(shù)驅(qū)動(dòng)LVGL內(nèi)部的計(jì)數(shù)器遞增,然后在主線程中調(diào)用lv_timer_handler()函數(shù)以時(shí)間片為節(jié)點(diǎn)執(zhí)行LVGL的日常任務(wù)(輸入事件、刷屏等操作)。從源碼上看,整個(gè)LVGL的程序框架,就是建立在定時(shí)器刻度的輪詢調(diào)度之上的,可見包含LVGL的MCU工程的頂級(jí)業(yè)務(wù)邏輯代碼如下:

lv_ui guider_ui;  
  
int main(void)  
{  
    BOARD_Init();  
    SysTick_Config(CLOCK_SYS_FREQ / 100); /* 10ms. */  
  
    lv_init();  
    lv_port_disp_init();  
    setup_ui(&guider_ui);  
    events_init(&guider_ui);  
    custom_init(&guider_ui);  
  
    while (1)  
    {  
        lv_timer_handler(); /* 執(zhí)行LVGL時(shí)間片輪詢. */  
    }  
}  
  
void SysTick_Handler(void)  
{  
    lv_tick_inc(10); /* 驅(qū)動(dòng)LVGL的定時(shí)器. */  
}

在LVGL中,當(dāng)需要實(shí)現(xiàn)一些基于時(shí)間變化顯示內(nèi)容的效果(動(dòng)畫),可以借用LVGL內(nèi)部的定時(shí)器對(duì)象來(lái)實(shí)現(xiàn)周期執(zhí)行程序的效果。關(guān)于LVGL應(yīng)用程序中使用定時(shí)器的API主要有兩個(gè):

  • lv_timer_create()
  • lv_timer_del()

其中,使用lv_timer_create()函數(shù)創(chuàng)建一個(gè)定時(shí)器實(shí)例,并會(huì)向其中傳送初始化參數(shù),指定本定時(shí)器的觸發(fā)周期觸發(fā)時(shí)執(zhí)行的回調(diào)函數(shù)。而lv_timer_del()函數(shù)會(huì)回收這個(gè)定時(shí)器的資源(包括變量,以及掛在定時(shí)器任務(wù)列表中的指針),以減輕LVGL后臺(tái)調(diào)度器的負(fù)擔(dān)。

基于timer對(duì)象實(shí)現(xiàn)儀表走針

這里以設(shè)計(jì)一個(gè)速度表盤指針轉(zhuǎn)動(dòng)的樣例,展示timer定時(shí)器對(duì)象的用法。實(shí)現(xiàn)原理,在定時(shí)器組件的回調(diào)函數(shù)中,會(huì)周期性地改變meter組件中speed_scale_1_ndline_0屬性的值。當(dāng)改變LVGL顯示組件的任何可視化組件的屬性后,LVGL會(huì)自動(dòng)刷新顯示內(nèi)容,從而形成動(dòng)畫效果。

在GUI Guider的編輯頁(yè)面中新建一個(gè)meter組件的對(duì)象,如圖x所示。

image.png

圖x 在GUI Guider中新建meter對(duì)象

將新建meter對(duì)象改名為meter_speed,這個(gè)名字將會(huì)在后面自定義編寫代碼時(shí),用于引用這個(gè)meter對(duì)象實(shí)例。手工調(diào)整一下表盤的尺寸。

然后,選中主編輯區(qū)的頁(yè)面區(qū)域(對(duì)應(yīng)選中當(dāng)前的screen對(duì)象),再在編輯區(qū)域的右側(cè),在事件(Events)頁(yè)面中,單擊加號(hào),創(chuàng)建一個(gè)事件,編輯事件。

編輯事件的觸發(fā)方式,即在什么時(shí)機(jī)產(chǎn)生當(dāng)前編輯的事件,常見的事件觸發(fā)方式有:Load Start(開始載入當(dāng)前對(duì)象時(shí))、Loaded(完成載入當(dāng)前對(duì)象時(shí))、Unload Start(開始從本對(duì)象切換到別處時(shí))、Unloaded(完成從本對(duì)象切換到別處時(shí))等,如圖x所示。每種顯示元素的對(duì)象都有各自的觸發(fā)方式,甚至還有一些顯示元素的對(duì)象沒有觸發(fā)事件可創(chuàng)建。

image.png

圖x 在GUI Guider中為事件編輯觸發(fā)方式

選定Trigger觸發(fā)方式后,還需要選定Target目標(biāo)對(duì)象。此時(shí),目標(biāo)對(duì)象的下拉列表中會(huì)自動(dòng)整理出當(dāng)前整個(gè)GUI Guider工程中已經(jīng)創(chuàng)建的有所顯示元素對(duì)象。如圖x所示。

image.png

圖x 在GUI Guider中為事件編輯目標(biāo)對(duì)象

這里需要重點(diǎn)說(shuō)明的是,觸發(fā)方式描述的當(dāng)前在編輯區(qū)域中選中的對(duì)象的動(dòng)作,當(dāng)選定觸發(fā)方式后,本事件的標(biāo)簽名稱也就自動(dòng)改成了<當(dāng)前對(duì)象名>_<觸發(fā)方式>。目標(biāo)對(duì)象反映的是即將改變屬性的對(duì)象,對(duì)應(yīng)部分可選的屬性也在事件頁(yè)面下方展示出來(lái),可在圖形頁(yè)面中配置。當(dāng)然,并不是所有的可編輯屬性都被做成了在對(duì)話框中可配置的,本例就在最后一行,選擇了執(zhí)行自定義程序,在彈出的代碼編輯對(duì)話框中添加了創(chuàng)建定時(shí)器對(duì)象timer_meter_speed的語(yǔ)句。如圖x所示。

image.png

圖x 在GUI Guider中為事件編輯自定義執(zhí)行的程序代碼

圖x中所示,自定義編寫C源碼,當(dāng)觸發(fā)Screen的Loaded事件時(shí),將執(zhí)行圖中代碼,創(chuàng)建timer_meter_speed定時(shí)器對(duì)象實(shí)例。保存工程后生成代碼,對(duì)應(yīng)地,可在GUI Guider工程中的./generated/event_init.c文件中看到對(duì)應(yīng)生成的代碼。

#include "events_init.h"  
#include < stdio.h >  
#include "lvgl.h"  
#include "custom.h"  
  
static lv_timer_t * timer_meter_speed;  
  
void events_init(lv_ui *ui)  
{  
}  
  
static void screen_event_handler(lv_event_t *e)  
{  
 lv_event_code_t code = lv_event_get_code(e);  
 switch (code)  
 {  
 case LV_EVENT_SCREEN_LOADED:  
 {  
  timer_meter_speed = lv_timer_create(timer_meter_speed_cb, 100, &guider_ui);  
 }  
  break;  
 case LV_EVENT_SCREEN_UNLOADED:  
 {  
  lv_timer_del(timer_meter_speed);  
 }  
  break;  
 default:  
  break;  
 }  
}  
  
void events_init_screen(lv_ui *ui)  
{  
 lv_obj_add_event_cb(ui- >screen, screen_event_handler, LV_EVENT_ALL, ui);  
}

但是回調(diào)函數(shù)timer_meter_speed_cb()仍需要開發(fā)者自行在custom.c文件中自行創(chuàng)建,GUI Guider不會(huì)自動(dòng)更新。代碼如下:

static int32_t speed = 50;  
static bool is_increase = true;  
  
  
/**  
 * Create a demo application  
 */  
  
void custom_init(lv_ui *ui)  
{  
    /* Add your codes here */  
}  
  
void timer_meter_speed_cb(lv_timer_t *t)  
{  
    lv_ui * gui = t- >user_data;  
    lv_meter_set_indicator_value(gui- >screen_meter_speed, gui- >screen_meter_speed_scale_1_ndline_0, speed);  
  
    if (speed >= 90)  
    {  
        is_increase = false;  
    }  
    if (speed <= 20)  
    {  
        is_increase = true;  
    }  
    if (is_increase)  
    {  
        speed++;  
    }  
    else  
    {  
        speed--;  
    }  
}

這里實(shí)現(xiàn)的內(nèi)容是,在MCU上運(yùn)行LVGL時(shí),一旦顯示完成當(dāng)前的屏幕頁(yè)面后,立即創(chuàng)建定時(shí)器對(duì)象timer_meter_speed,這個(gè)定時(shí)器將會(huì)每隔100ms調(diào)用一次回調(diào)函數(shù)timer_meter_speed_cb(),在timer_meter_speed_cb()函數(shù)中,更新變量speed的值,然后通過lv_meter_set_indicator_value()函數(shù),改變screen_meter_speed對(duì)象中screen_meter_speed_scale_1_ndline_0屬性的值。每隔100ms改變一次screen_meter_speed對(duì)象的屬性值,將會(huì)觸發(fā)顯示內(nèi)容的刷新,從而在顯示屏上顯現(xiàn)出動(dòng)畫效果。

將GUI Guider生成的程序下載到MCU之前,可以先在GUI Guider的工程中模擬運(yùn)行一次,一方面可以幫忙排除編譯錯(cuò)誤(GUI Guider使用armgcc將LVGL和生成的源碼一起編譯),另一方面也方便預(yù)覽運(yùn)行效果。使用LVGL組件的過程不涉及到對(duì)具體MCU硬件的依賴,因此完全可以在模擬環(huán)境中預(yù)覽實(shí)際執(zhí)行的效果。如圖x所示。

640.gif

圖x 預(yù)覽在GUI Guider中創(chuàng)建的表盤對(duì)象

最后,編譯Keil工程,下載到MCU開發(fā)板??梢钥吹皆贛CU開發(fā)板上運(yùn)行動(dòng)圖的效果,如圖x所示。

640 (1).gif

圖x 在MCU開發(fā)板上運(yùn)行轉(zhuǎn)動(dòng)指針的表盤

小結(jié)

timer對(duì)象本身只是一個(gè)實(shí)現(xiàn)周期調(diào)度的機(jī)制,開發(fā)者可以在周期回調(diào)的函數(shù)內(nèi)部,修改和重置顯示各種對(duì)象的屬性,觸發(fā)LVGL刷屏,從而實(shí)現(xiàn)動(dòng)畫的效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2316

    瀏覽量

    98210
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3368

    瀏覽量

    123701
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    697

    瀏覽量

    43486
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    5685
  • LVGL
    +關(guān)注

    關(guān)注

    2

    文章

    124

    瀏覽量

    4576
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何正確的將lv_port_esp32的LVGL部分合并到ESP_IDF?

    我使用lv_port_esp32測(cè)試LVGL顯示正常,但是在將其合并到我自己基于ESP_IDF(v4.2.1)工程的時(shí)候遇見了問題。我將lv_examples、lvgl
    發(fā)表于 06-21 12:43

    rt-threadlvgl怎樣才使用外部RAM?

    我想問一下rt-threadlvgl怎樣才使用外部RAM,我想把lvgl的繪圖緩沖區(qū)搬到外部RAM上,我是這么做的,直接在lv_port_disp.c
    發(fā)表于 07-15 07:29

    dlpc3433怎樣修改固件會(huì)將開機(jī)時(shí)顯示的為無(wú)啟動(dòng)畫面且為外部輸入模式?

    怎樣修改固件會(huì)將開機(jī)時(shí)顯示的為無(wú)啟動(dòng)畫面且為外部輸入模式?或者說(shuō)有什么工具可以修改?
    發(fā)表于 02-27 06:08

    【EASY EAI Orin Nano開發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動(dòng)畫)控件實(shí)現(xiàn)動(dòng)畫播放以及

    【EASY EAI Orin Nano開發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動(dòng)畫)控件實(shí)現(xiàn)動(dòng)畫播放以及使用LVGL定時(shí)器實(shí)現(xiàn)攝像頭圖像
    發(fā)表于 07-22 00:34

    `lv_obj_tree.h` 在 **LVGL v9** 的位置和作用

    )已經(jīng)封裝了這些邏輯,無(wú)需直接包含 lv_obj_tree.h。 總結(jié) lv_obj_tree.h 是 LVGL 內(nèi)部管理對(duì)象樹結(jié)構(gòu)的核心頭文件,位于 src/core/ 目錄,主要供 LVGL 自身模塊調(diào)用,上層應(yīng)用開發(fā)
    發(fā)表于 11-13 15:49

    LVGL工具使用

    文章所有資料以及代碼下載途徑LVGL工具使用:主要介紹下模擬器的使用/電腦組態(tài)軟件(我通常把電腦拖控件軟件叫做組態(tài)軟件)LVGL概念概述:主要對(duì)LVGL對(duì)象/事件/風(fēng)格/輸入設(shè)備/
    發(fā)表于 12-15 07:17

    請(qǐng)問一下ESP8266播放動(dòng)畫的設(shè)計(jì)該怎樣去實(shí)現(xiàn)

    請(qǐng)問一下ESP8266播放動(dòng)畫的設(shè)計(jì)該怎樣去實(shí)現(xiàn)?
    發(fā)表于 01-21 06:25

    RK3288顯示LOGO過后沒有動(dòng)畫會(huì)是什么原因造成的

    RK3288顯示LOGO過后沒有動(dòng)畫會(huì)是什么原因造成的怎樣去解決?
    發(fā)表于 03-03 11:29

    RK3288系統(tǒng)的開機(jī)動(dòng)畫時(shí)間該怎樣去延長(zhǎng)

    RK3288系統(tǒng)的開機(jī)動(dòng)畫時(shí)間該怎樣去延長(zhǎng)?有何解決方法?
    發(fā)表于 03-10 08:37

    開源輕量級(jí)顯示框架LVGL簡(jiǎn)介

    啟動(dòng)嵌入式GUI設(shè)計(jì),同時(shí)LVGL作為一個(gè)圖形庫(kù),它自帶著接近三十多種小工具可以供開發(fā)者使用。這些強(qiáng)大的構(gòu)建塊按鈕搭配上帶有非常絲滑的動(dòng)畫以及可以做到平滑滾動(dòng)的高級(jí)圖形,同時(shí)兼具著不高的配置要求以及
    發(fā)表于 03-14 09:28

    開源輕量級(jí)顯示框架LVGL簡(jiǎn)介

    啟動(dòng)嵌入式GUI設(shè)計(jì),同時(shí)LVGL作為一個(gè)圖形庫(kù),它自帶著接近三十多種小工具可以供開發(fā)者使用。這些強(qiáng)大的構(gòu)建塊按鈕搭配上帶有非常絲滑的動(dòng)畫以及可以做到平滑滾動(dòng)的高級(jí)圖形,同時(shí)兼具著不高的配置要求以及
    發(fā)表于 03-31 18:49

    如何使用lvgl定時(shí)器實(shí)現(xiàn)動(dòng)畫效果

    LVGL,如何使用lvgl定時(shí)器實(shí)現(xiàn)動(dòng)畫效果
    發(fā)表于 12-15 15:23

    DLP顯示器件的色輪視頻動(dòng)畫

    DLP顯示器件的色輪視頻動(dòng)畫
    發(fā)表于 07-31 11:30 ?1054次閱讀

    簡(jiǎn)析LVGL基礎(chǔ)知識(shí)之對(duì)象模塊

    LVGL ,用戶界面的基本構(gòu)建塊是對(duì)象,也稱為小部件(widget)。本文主要是介紹LVGL對(duì)象模塊。
    的頭像 發(fā)表于 06-11 10:47 ?1.1w次閱讀
    簡(jiǎn)析<b class='flag-5'>LVGL</b>基礎(chǔ)知識(shí)之<b class='flag-5'>對(duì)象</b>模塊

    【RISC-V &amp;amp; LVGL】現(xiàn)象級(jí)爆紅的開源顯示框架——LVGL究竟蘊(yùn)藏怎樣的魔力

    #01LVGL簡(jiǎn)介實(shí)用自行車碼表具有科技感的獎(jiǎng)杯實(shí)現(xiàn)這些DIY作品的背后,都有同樣一個(gè)功能強(qiáng)大的GUI——LVGL。LVGL的作者是來(lái)自匈牙利的GaborKiss-Vamosikisvegabor
    的頭像 發(fā)表于 03-15 09:50 ?5755次閱讀
    【RISC-V &amp;amp; <b class='flag-5'>LVGL</b>】現(xiàn)象級(jí)爆紅的開源<b class='flag-5'>顯示</b>框架——<b class='flag-5'>LVGL</b>究竟蘊(yùn)藏<b class='flag-5'>怎樣</b>的魔力