emWin 2天速成实例教程004_软件定时器(Timer)和位图片动画

本文介绍了emWin的软件定时器原理及其在实现位图动画中的应用。通过示例代码,讲解了如何设置定时器、处理定时事件,以及优化定时刷新频率以避免过度消耗资源。同时,提供了利用BmpCvt工具转换BMP图片为C文件的方法,以实现每隔100ms自动切换IMAGE控件中的位图,创建动画效果。
摘要由CSDN通过智能技术生成

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。

  emWin的TIMER是一个软件定时器,它以OS_TimeMS变量的值作为定时基准,而OS_TimeMS则通过一个硬件定时器每1ms中断加1,在emWin内部程序不断查询OS_TimeMS的变化实现软件定时。

  在很多应用场合,我们需要用到定时器,比如每隔一定时间查询某一事件有没有被触发,每隔一定时间改变数字显示以实现动态计数,每隔一定时间显示一幅图片实现图片动画等等….

  TIMER的使用是比较简单的(请阅读例程源码),不过有几个地方需要注意:(1)使用TIMER实现定时的精度是比较差的(但OS_TimeMS的值是精确的),如果需要精确定时请使用硬件定时器产生中断实现。(2)用TIMER定时刷新数字或图片显示时,时间间隔不宜过短,比如需要实现一个毫秒级的计数器显示,你当然不能每1

非常抱歉,我的回答还是有误。`GUI_TIMER_TIME_MSECS()` 函数并不是 emWin 图形库自带的函数,而是一个自定义的宏定义,用于将以毫秒为单的时间转换成 `GUI_TIMER_TIME` 结构体。 下面是一个示例代码,演示如何手动定义 `GUI_TIMER_TIME_MSECS()` 宏: ```c #include "GUI.h" typedef struct { int Time; int Repeat; } GUI_TIMER_TIME; #define GUI_TIMER_TIME_MSECS(msec) {(msec), (msec)} static GUI_TIMER_HANDLE hTimer; static int cnt = 0; void myTimerCallback(GUI_TIMER_MESSAGE* pTM) { cnt++; char buf[32]; sprintf(buf, "Count: %d", cnt); GUI_DispStringAt(buf, 100, 100); } int main(void) { GUI_Init(); // 使用自定义的宏定义来指定定时器触发时间和周期 GUI_TIMER_TIME timerTime = GUI_TIMER_TIME_MSECS(1000); // 创建一个定时器,并指定定时器回调函数、定时器触发时间和周期、以及定时器属性 hTimer = GUI_TIMER_Create(&myTimerCallback, timerTime, 0, GUI_TIMER_CF_RESTART); while (1) { GUI_Exec(); } } ``` 在这个示例代码中,我们手动定义了一个 `GUI_TIMER_TIME` 结构体,包含了 `Time` 和 `Repeat` 字段,用于表示定时器的触发时间和周期。然后,我们通过一个宏定义 `GUI_TIMER_TIME_MSECS()` 来将以毫秒为单的时间值转换成 `GUI_TIMER_TIME` 结构体。最后,我们在创建定时器时,使用这个自定义的宏定义来指定定时器的触发时间和周期。 需要注意的是,这里的 `GUI_TIMER_TIME` 结构体和 `GUI_TIMER_TIME_MSECS()` 宏定义都是自定义的,如果你使用的是官方提供的 emWin 图形库版本,可能需要根据实际情况进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值