找回密码
 立即注册
楼主: cha***

从零开始做一个数码管时钟-开天斧,程序开源 | 已完结

[复制链接]
  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:02:36 | 显示全部楼层
    接下来是通过按钮控制模式切换以及修改时间,新建一个button.h的文件,用来处理按钮功能
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:04:41 | 显示全部楼层
    按钮+的功能为:正常模式(Mode_Normal)无响应,如果是修改分钟(Mode_Change_Minute)的话,则增加1分钟,到60自动置0,如果是修改小时(Mode_Change_Hour)的话,则增加1小时,到24自动置0
    1. uchar Btn_Up_Pressed()
    2. {
    3.     switch(mode)
    4.     {
    5.     case Mode_Normal:
    6.         return 0;
    7.     case Mode_Change_Minute:
    8.         if(minute>=59)
    9.             minute = 0;
    10.         else
    11.             ++minute;
    12.         break;
    13.     case Mode_Change_Hour:
    14.         if(hour>=23)
    15.             hour = 0;
    16.         else
    17.             ++hour;
    18.         break;
    19.     }
    20.     second = 0;
    21.     return 1;
    22. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:05:44 | 显示全部楼层
    模式按钮就比较简单了,直接根据当前模式,来切换到下一个模式,按钮响应函数的返回值都是代表了是否需要刷新显示
    1. uchar Btn_Mode_Click()
    2. {
    3.     switch(mode)
    4.     {
    5.         case Mode_Normal:
    6.             mode = Mode_Change_Minute;
    7.             break;
    8.         case Mode_Change_Minute:
    9.             mode = Mode_Change_Hour;
    10.             break;
    11.         case Mode_Change_Hour:
    12.             mode = Mode_Normal;
    13.             break;
    14.     }
    15.     return 1;
    16. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:07:57 | 显示全部楼层
    按钮响应函数准备放在timer3中进行调用,简单起见,没有添加按键防抖动,timer3是100ms调用一次,好像加不加抖动的影响都不大
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:17:15 | 显示全部楼层
    添加Button_OnTimeOut函数,当mode键按下时,btn_mode_ts置一.当按钮释放时,检测btn_mode_ts如果为1,则响应mode_click函数,且将btn_mode_ts置一,按钮+的逻辑也一样
    1. uchar Button_OnTimeOut(uchar btn_up,uchar btn_mode)
    2. {
    3.     need_update = 0;
    4.     if(btn_mode)
    5.     {
    6.         if(btn_mode_ts)
    7.         {
    8.             need_update += Btn_Mode_Click();
    9.             btn_mode_ts = 0;
    10.         }
    11.     }else
    12.         btn_mode_ts += 1;
    13.         if(btn_up)
    14.     {
    15.         if(btn_up_ts)
    16.         {
    17.             need_update += Btn_Up_Pressed();
    18.             btn_up_ts = 0;
    19.         }
    20.     }else
    21.         btn_up_ts += 1;
    22.     return need_update;
    23. }
    复制代码

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:21:10 | 显示全部楼层
    在timer3中添加函数调用,并且判断是否需要刷新,如果需要,则调用SetSeg4Bit()函数来刷新
    1.     uchar need_update;
    2.     need_update = Button_OnTimeOut(BTN_UP,BTN_MODE);
    3.     ++t3_iter;
    4.     if(t3_iter == 5)
    5.     {
    6.         is_show_dot = !is_show_dot;
    7.         SetSeg4Bit();
    8.     }
    9.     else if(t3_iter == 10)
    10.     {
    11.         if(mode == Mode_Normal)
    12.             AddSec();
    13.         is_show_dot = !is_show_dot;
    14.         SetSeg4Bit();
    15.         t3_iter = 0;
    16.     }
    17.     else if(need_update)
    18.         SetSeg4Bit();
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:28:06 | 显示全部楼层
    接下来是动手时间,将2个按钮一端接地,另一端分别接P10和P11
    如图:
    微信截图_20240127232750.png
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:28:57 | 显示全部楼层
    烧录,测试,发现功能正常

    VID_20240127_223931~1.mp4

    2.35 MB, 下载次数: 6

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:29:55 | 显示全部楼层
    有个问题,就是按钮一次一次按,在大量调整时间的时候比较麻烦,要是按钮+能持续响应就好了,这块调整逻辑代码就行,硬件部分不用动
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 86 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    531

    积分

    高级会员

    积分
    531
     楼主| 发表于 2024-1-27 23:31:59 | 显示全部楼层
    每次当按钮按下时检测,当btn_up_ts=0时才允许调用对应功能函数,且将btn_up_ts设置为0x01<<3,并且每次都将btn_up_ts = btn_up_ts>>1,这样,持续按键的话就是300ms响应一次函数了
    1. btn_up_ts = btn_up_ts>>1;
    2.     if(btn_up)
    3.     {
    4.         btn_up_ts = 0;
    5.     }else
    6.     {
    7.         if(!btn_up_ts)
    8.         {
    9.             need_update += Btn_Up_Pressed();
    10.             btn_up_ts = 0x01<<3;
    11.         }
    12.     }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 19:44 , Processed in 0.108400 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表