龙空技术网

龙芯+RT-Thread+LVGL实战笔记(9)——数码管倒计时

南耿先生 173

前言:

目前大家对“数码管倒计时程序”都比较关切,各位老铁们都想要剖析一些“数码管倒计时程序”的相关知识。那么小编也在网络上收集了一些对于“数码管倒计时程序””的相关文章,希望同学们能喜欢,朋友们一起来学习一下吧!

过去的大半年时间,一直带着学生备战全国职业院校技能大赛“嵌入式系统应用开发”赛项。由于是首次参加该赛项,很多东西都是从0到1的摸索和积累。作为指导教师,备赛期间除了给予学生必要的指导,自己也花了不少精力研究了大赛指定的龙芯1B200嵌入式开发板,并尝试使用RT-Thread操作系统LVGL图形组件,实现了样题的几十项任务,大大小小的版本也写了30多个,也算磕出点名堂了,部分效果如图1所示。

图1 带两级任务按钮和部分功能(密码锁)的效果

本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。

由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。

上一篇我们针对“子任务2.2”,完成了数码管交替显示年份和日期,靠的是一个定时器每2ms刷新一位数码管实现的。这一篇我们继续利用这个定时器,针对“子任务2.3”实现数码管的倒计时显示,具体效果描述如下:

倒计时显示格式为:“-XX-”,XX为倒计时时间,单位为秒,倒计时时长不超过99秒。要求倒计时剩余5秒时,数码管以500ms频率闪烁显示,当倒计时结束后,数码管应显示“----”,同时开启蜂鸣器,以便提示倒计时已结束。

一、准备工程和文件

还是老规矩,把上一版的工程目录复制另存一份,版本号为2.2,如图2所示,新功能就在新工程里添加,没有新增文件。

图2 复制另存一份新工程

二、编写源码

这个新任务的相关代码都依然补充在 task2.c 文件中,补充和修改的思路延续“子任务2.2”的套路。首先,需要在数码管显示定时器中补充“子任务2.3”相关的逻辑处理。此外,这个新任务用到了无源蜂鸣器,因此需要把“子任务1.3”里写好的蜂鸣器控制代码沿用过来。下面,分文件详细呈现有修改和补充的源码。

2.1 task1.c源码修改

还记得吗,前面针对“子任务1.3”蜂鸣器嘀嘀嘀的效果,我们把相关代码写在了 task1.c 文件中。现在,需要在 task2.c 文件中继续沿用同样的效果,即跨文件调用,因此相关变量和函数前面的 static 修饰就应该去掉了,改为整个工程的全局变量,如代码清单1所示。

代码清单1 task1.c源码的修改之处

2.2 task1.h源码修改

既然需要改成跨文件调用的全局变量,那么 task1.h 文件了里的变量和函数声明也要同步修改,如代码清单2所示。

代码清单2 task1.h源码的修改之处

2.3 task2.c源码修改

首先,我们在该文件中补充了必要的头文件、宏定义和全局变量,如代码清单3所示。

代码清单3 在task2.c中补充的头文件、宏定义和全局变量

其次,再来修改数码管显示定时器的回调函数 seg_disp_timer_cb,如代码清单4所示。该函数内部修改的较多,增加了用于倒计时计数的变量 count3,补充了针对“子任务2.3”的逻辑分支。此外,执行某个子任务的时候,需要把无关子任务的变量还原为初值。

代码清单4 修改后的seg_disp_timer_cb函数

最后,来修改任务2子线程入口函数 task2_thread_entry,我们在函数内部补充了蜂鸣器定时器的启动和退出的代码块,如代码清单5所示。

代码清单5 修改后的task2_thread_entry函数

三、编译与测试

编译并下载程序后,具体效果如【演示视频】所示。当然,在串口终端依然可以通过 list_timer 命令查看当前正在运行的线程和定时器,如图3所示。

图3 查看运行的线程和定时器

(本文完)

标签: #数码管倒计时程序