找回密码
 立即注册
楼主: challis

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 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. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 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();
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

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

VID_20240127_223931~1.mp4

2.35 MB, 下载次数: 39

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 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, 2025-5-2 04:39 , Processed in 0.147662 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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