|
本帖最后由 hicccp 于 2025-6-3 22:03 编辑
使用EKT043B实现的带幸运数字功能的温湿度显示仪,能够自动显示温度和湿度数据,点击幸运按钮图标能够随机生成幸运数字,点击底部卡通图标能够切换背景显示主题;
1.设备方案
显示屏使用EKT043B开发板,800*480的分辨率,工程文件CFG配置为竖屏480*800使用;
通过DHT11数字温湿度传感器采集温度湿度数据;
主控为T5L,通过写C51驱动OS核读写DGUS接口实现功能逻辑;
2.功能简介
最上面为温度和湿度数据,2S更新一次温湿度数据;
点击中间的幸运数字图标,会更换一次幸运数字,数字为三位数,默认开机幸运数为666;
点击底部的卡通图标,会切换显示主题,已预置6种主题;
3.实现逻辑
首先确定基本的功能框架,即按指定的周期获取数据或者执行相关功能;
可以基于几个基本硬件定时器实现一个自动软定时器,这里使用T0,在此基础上实现8个软件定时器,软件定时器支持一次性和自动重载2种模式;
DHT11为单总线,微秒延时需要精准,这里的软件阻塞延时函数已通过逻辑分析仪测量IO验证,如果改了优化参数,需要重新调试;
调试过程中需要打印一些信息,故另外实现一个基于串口打印的printf函数;
幸运数字的生成需要依赖随机数,此处可以粗略使用时间戳来做随机数种子,由于没有使用硬件时钟,故基于硬件定时器生成一个毫秒时间戳,基本满足要求;
主函数和3个页面子功能程序如下:
- void main(void)
- {
- uart_init_printf(115200); // uart initialize to printf with uart3
- timer_hw_init(TIMER_HW_0); // timer hardware initialize
- timer_soft_init(); // timer soft initialize
- interrupt_all_enable(); // enable all interrupt
- printf("APP Version:%s & Build:%s %s\r\n",
- APP_VER, __TIME__, __DATE__); // print version information
- timer_soft_start(TIMER0, 20, TIMER_AUTO); // start TIMER0 in TIMER_AUTO mode
- timer_soft_start(TIMER1, 2000, TIMER_AUTO); // start TIMER1 in TIMER_AUTO mode
- timer_soft_start(TIMER2, 1000, TIMER_AUTO); // start TIMER2 in TIMER_AUTO mode
- while (1)
- {
- if (timer_soft_check(TIMER0)) // check whether timeout
- {
- ui_execute(); // execute ui framework
- }
- if (timer_soft_check(TIMER1)) // check whether timeout
- {
- dht11_read_repet(); // read dht11 sensor data
- }
- if (timer_soft_check(TIMER2)) // check whether timeout
- {
- // printf("systime.ts:%ld\r\n", systime.ts); // print system now timesample
- }
- }
- }
复制代码- void display_humi_temp(void)
- {
- dgus_write_vp(VP_HUMI, (u8 *)&dht11_val.hum, 1);
- dgus_write_vp(VP_TEMP, (u8 *)&dht11_val.temp, 1);
- }
- void display_lucknum(void)
- {
- u16 lucknum = 0;
- u16 button = KEY0;
- dgus_read_vp(VP_BUTTON, (u8 *)&button, 1);
- if (KEY2 == button)
- {
- button = KEY0;
- dgus_write_vp(VP_BUTTON, (u8 *)&button, 1);
- srand(systime.ts);
- lucknum = rand() % 1000;
- dgus_write_vp(VP_LUCKNUM, (u8 *)&lucknum, 1);
- }
- }
- void display_jump_page(void)
- {
- static u16 page_num = 0;
- u16 button = KEY0;
- dgus_read_vp(VP_BUTTON, (u8 *)&button, 1);
- if (KEY1 == button)
- {
- button = KEY0;
- dgus_write_vp(VP_BUTTON, (u8 *)&button, 1);
- page_num++;
- if (page_num > 5)
- {
- page_num = 0;
- }
- page_jump(page_num);
- }
- }
复制代码 4.其他说明
其他实现细节参考工程文件;
烧录的bin文件在代码工程目录的output目录;
代码使用的开源许可证为GPL V3.0;
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|