3725|6

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

GD32E231 DIY大赛(5)——完成DS1302的驱动和设置及长短按键识别 [复制链接]

    节前就完成了DS1302的驱动,可以从DS1302读出日期时间,也能够写入日期时间,可调整日期时间就需要使用按键,为了让一个按键能够发挥多个作用却花费了近一周的时间。下图是测试过程:




    为了减少与DS1302通讯,我采取了每分钟一次DS1302的日期时间值并更新显示,秒数则通过系统滴答产生毫秒时钟作为计秒依据和读DS1302的定时依据,这样尽管时间会有一定的差异(不超过1分钟),好在我的应用中对时间准确性要求不高,足以满足需要。下面是计秒和定时读DS1302的代码,这段代码放在循环中。

  1.                 if(ms >999)
  2.                 {
  3.                         flag = !flag;
  4.                         ms = 0;
  5.             /* turn on LED1 */
  6.             gpio_bit_toggle(GPIOA,GPIO_PIN_7);
  7.                 seco++;            //秒计时
  8.                        
  9.                     if(seco > 59)
  10.                     {
  11.                         if(mode==0)
  12.                                         DS1302_read_date(); //每分钟读一次DS302数据
  13.                         }
  14.                         display_date();    //显示日期时间  
  15.                 if(mode > 0)
  16.                                 display_flash();//闪烁显示调整项目
  17.                 }
复制代码


    全局变量ms是在系统滴答中断里自增计数的,在主循环中判断其是否超过999,由于主循环中还受按键处理等事务影响,这个计秒肯定不准确,不过每分钟会从DS1302读入一次正确的时间,也就不在乎这个误差了。
    由于我使用的LCD5100每行只能显示14个字符(我是用5*8点阵加一空列),年月日时分秒全部显示的话正好可以显示出来,但没有分隔符号,不容易辨认,我只好采取年份和月日轮流显示,时分秒固定显示的方式来解决,如下图:
显示年份和时间




显示月日和时间



    在识别长短按键时,我掉进了坑里,一连5~6天都毫无进展,由于开发板上仅有一个用户按键,而我又至少需要识别两个按键状态,开始我使用的是按键中断方式,反复尝试都没有找到可靠的识别方法,期间还发帖求助,同时在网上搜索了多个模块化的按键处理代码,但因各种原因都没有成功,折腾了近一周后,最后决定用最原始的轮询方式,通过循环加延时来达到目的,虽然这样做效率低,但在我的项目中毫无影响,我现在使用了4种按键状态,即点按、稍长按(小于一秒)、长按(略大于一秒)、超长按(大于两秒)。下面是按键获取的代码:
  1.         keys = 0;
  2.                 while(gd_eval_key_state_get(KEY_WAKEUP))
  3.                 {
  4.                     keys++;
  5.                         delay_1ms(50);
  6.                 }
  7.                 if(keys > 0)          //有键按下
  8.             key_processing();
  9. [/code

  10.     经过实际测试,点按时得到的keys值约为2~3,稍长按的值为6~9左右,长按的值约为13~17左右,我在程序中检查keys的值,小于5认为是点按,5~10之间判定为稍长按,11~20之间判定为长按,超过20则认为是超长按。
  11.     解决了长短按键识别问题,日期时间的调整代码很容易就调试通过了,下面这段是日期、时间设置时数值范围检查的代码,可以确保不会输入非法的日期和时间。
  12. [code]                            switch(mode)
  13.                                 {
  14.                             case 1:
  15.                                         year++;
  16.                                             if(keys>5)
  17.                                                     year += 4;
  18.                         if(year > 2030)
  19.                                                 year = 2019;
  20.                                         break;
  21.                                 case 2:
  22.                                     mon++;
  23.                                             if(keys>5)
  24.                                                     mon += 4;
  25.                                         if(mon > 12)
  26.                                                 mon = 1;
  27.                                         break;
  28.                             case 3:
  29.                                         day++;
  30.                                             if(keys>5)
  31.                                                     day += 4;
  32.                         if(day > 31)
  33.                                                 day = 1;
  34.                                         if((day>30) & (mon==4 | mon==6 | mon==9 | mon==11))
  35.                                                 day = 1;
  36.                                         if((mon==2) & (day>28)){
  37.                                                 if(year%4 != 0){
  38.                                                     day = 1;
  39.                                             }
  40.                                             else{
  41.                                                     if(day>29)
  42.                                                                 day = 1;
  43.                                         }
  44.                                     }
  45.                                         break;
  46.                                 case 4:
  47.                                     hour++;
  48.                                             if(keys>5)
  49.                                                     hour += 4;
  50.                                         if(hour > 23)
  51.                                                 mon = 0;
  52.                                         break;
  53.                                 case 5:
  54.                                     minu++;
  55.                                             if(keys>5)
  56.                                                     minu += 4;
  57.                                         if(minu > 59)
  58.                                                 minu = 0;
  59.                                                 break;
复制代码


    为了简化操作,我将年份值限定在2019~2030范围,按键点按对应数值加1,稍长按则加5,长按则改变调整项目,调整项目则按照年月日时分的顺序进行,秒默认为0。
下图为设置年份:



这是设置月份:





这是设置日期:





设置时间:









保存设置数据:






下面是整个工程项目文件包

Alarm.rar (483.61 KB, 下载次数: 23)





此帖出自GD32 MCU论坛

最新回复

谢谢大佬  详情 回复 发表于 2024-5-9 16:19
点赞 关注
 

回复
举报

103

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
此帖出自GD32 MCU论坛

点评

谢谢鼓励!  详情 回复 发表于 2019-5-8 10:27
 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

172

帖子

0

TA的资源

宇宙尘埃

板凳
 
谢谢分享!
此帖出自GD32 MCU论坛

点评

相互交流,共同进步!  详情 回复 发表于 2019-5-8 10:27
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

4
 
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

5
 

相互交流,共同进步!
此帖出自GD32 MCU论坛
 
 
 

回复

124

帖子

1

TA的资源

一粒金砂(中级)

6
 
感谢分享!~
此帖出自GD32 MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢大佬
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表