challis 发表于 2024-1-27 23:02:36

接下来是通过按钮控制模式切换以及修改时间,新建一个button.h的文件,用来处理按钮功能

challis 发表于 2024-1-27 23:04:41

按钮+的功能为:正常模式(Mode_Normal)无响应,如果是修改分钟(Mode_Change_Minute)的话,则增加1分钟,到60自动置0,如果是修改小时(Mode_Change_Hour)的话,则增加1小时,到24自动置0
uchar Btn_Up_Pressed()
{
    switch(mode)
    {
    case Mode_Normal:
      return 0;
    case Mode_Change_Minute:
      if(minute>=59)
            minute = 0;
      else
            ++minute;
      break;
    case Mode_Change_Hour:
      if(hour>=23)
            hour = 0;
      else
            ++hour;
      break;
    }
    second = 0;
    return 1;
}

challis 发表于 2024-1-27 23:05:44

模式按钮就比较简单了,直接根据当前模式,来切换到下一个模式,按钮响应函数的返回值都是代表了是否需要刷新显示
uchar Btn_Mode_Click()
{
    switch(mode)
    {
      case Mode_Normal:
            mode = Mode_Change_Minute;
            break;
      case Mode_Change_Minute:
            mode = Mode_Change_Hour;
            break;
      case Mode_Change_Hour:
            mode = Mode_Normal;
            break;
    }
    return 1;
}

challis 发表于 2024-1-27 23:07:57

按钮响应函数准备放在timer3中进行调用,简单起见,没有添加按键防抖动,timer3是100ms调用一次,好像加不加抖动的影响都不大

challis 发表于 2024-1-27 23:17:15

添加Button_OnTimeOut函数,当mode键按下时,btn_mode_ts置一.当按钮释放时,检测btn_mode_ts如果为1,则响应mode_click函数,且将btn_mode_ts置一,按钮+的逻辑也一样uchar Button_OnTimeOut(uchar btn_up,uchar btn_mode)
{
    need_update = 0;
    if(btn_mode)
    {
      if(btn_mode_ts)
      {
            need_update += Btn_Mode_Click();
            btn_mode_ts = 0;
      }
    }else
      btn_mode_ts += 1;
        if(btn_up)
    {
      if(btn_up_ts)
      {
            need_update += Btn_Up_Pressed();
            btn_up_ts = 0;
      }
    }else
      btn_up_ts += 1;
    return need_update;
}

challis 发表于 2024-1-27 23:21:10

在timer3中添加函数调用,并且判断是否需要刷新,如果需要,则调用SetSeg4Bit()函数来刷新
    uchar need_update;
    need_update = Button_OnTimeOut(BTN_UP,BTN_MODE);
    ++t3_iter;
    if(t3_iter == 5)
    {
      is_show_dot = !is_show_dot;
      SetSeg4Bit();
    }
    else if(t3_iter == 10)
    {
      if(mode == Mode_Normal)
            AddSec();
      is_show_dot = !is_show_dot;
      SetSeg4Bit();
      t3_iter = 0;
    }
    else if(need_update)
      SetSeg4Bit();

challis 发表于 2024-1-27 23:28:06

接下来是动手时间,将2个按钮一端接地,另一端分别接P10和P11
如图:

challis 发表于 2024-1-27 23:28:57

烧录,测试,发现功能正常

challis 发表于 2024-1-27 23:29:55

有个问题,就是按钮一次一次按,在大量调整时间的时候比较麻烦,要是按钮+能持续响应就好了,这块调整逻辑代码就行,硬件部分不用动

challis 发表于 2024-1-27 23:31:59

每次当按钮按下时检测,当btn_up_ts=0时才允许调用对应功能函数,且将btn_up_ts设置为0x01<<3,并且每次都将btn_up_ts = btn_up_ts>>1,这样,持续按键的话就是300ms响应一次函数了
btn_up_ts = btn_up_ts>>1;
    if(btn_up)
    {
      btn_up_ts = 0;
    }else
    {
      if(!btn_up_ts)
      {
            need_update += Btn_Up_Pressed();
            btn_up_ts = 0x01<<3;
      }
    }
页: 1 2 3 4 [5] 6 7 8 9 10 11
查看完整版本: 从零开始做一个数码管时钟-开天斧,程序开源 | 已完结