challis 发表于 2024-1-28 22:26:54

模式按钮中添加对新增的4中模式进行处理:
当前为 Mode_Change_Hour 时,按按钮后变为 Mode_Clock 模式
当前为 Mode_Clock 时,按按钮后变为 Mode_Clock_Change_Minute模式
当前为 Mode_Clock_Change_Minute时,按按钮后变为 Mode_Clock_Change_Hour模式
当前为 Mode_Clock_Change_Hour时,按按钮后变为 Mode_Normal模式
当前为 Mode_Clock_Alert时,按按钮后变为 Mode_Normal模式

uchar Btn_Mode_Click()
{
    switch(mode)
    {
      case Mode_Clock_Alert:
            mode = Mode_Normal;
            break;
      case Mode_Normal:
            mode = Mode_Change_Minute;
            break;
      case Mode_Change_Minute:
            mode = Mode_Change_Hour;
            break;
      case Mode_Change_Hour:
            mode = Mode_Clock;
            break;
      case Mode_Clock:
            mode = Mode_Clock_Change_Minute;
            break;
      case Mode_Clock_Change_Minute:
            mode = Mode_Clock_Change_Hour;
            break;
      case Mode_Clock_Change_Hour:
            mode = Mode_Normal;
            break;
    }
    return 1;
}

challis 发表于 2024-1-28 22:28:27

AddSec函数中,添加返回值,如果分钟变化,则返回1,否则返回0
以便在主函数中进行判断是否到了闹钟时间
//增加1s,如果分钟变动,返回1
uchar AddSec()
{
    if(second >= 59)
    {
      second = 0;
      if(minute >= 59)
      {
            minute = 0;
            if(hour >= 23)
                hour = 0;
            else
                ++hour;
      }
      else
            ++minute;
      return 1;
    }
    else
      ++second;
    return 0;
}

challis 发表于 2024-1-28 22:31:21

Timer3中添加对AddSec的后续处理:
只有模式不为Mode_Change_Minute和Mode_Change_Hour时才会增加秒数
AddSec如果返回1,代表分钟变了,则判断是否需要切换模式为Mode_Clock_Alert,或者切回Mode_Normal (闹钟响应提醒持续时间为1分钟)
//100毫秒@6.000MHz
void Timer3_Isr(void) interrupt 19
{
    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_Change_Minute && mode != Mode_Change_Hour )
      {
            if(AddSec())
            {
                //如果分钟变动:
                if(mode == Mode_Normal)
                {
                  if(minute == clock_minute && hour == clock_hour)
                        mode = Mode_Clock_Alert;
                }else if(mode == Mode_Clock_Alert)
                {
                  if(minute != clock_minute || hour != clock_hour)
                        mode = Mode_Normal;
                }
            }
      }
      is_show_dot = !is_show_dot;
      SetSeg4Bit();
      t3_iter = 0;
    }
    else if(need_update)
      SetSeg4Bit();
}

challis 发表于 2024-1-28 22:33:59

测试显示闹钟模式,以及修改闹钟时间:

challis 发表于 2024-1-28 22:34:28

测试闹钟到时间后的闪烁提醒效果:

challis 发表于 2024-1-28 22:35:02

忘记添加可以设置闹钟的开关了,我再去修改代码并调试一下

challis 发表于 2024-1-28 22:42:04

clock.h中新添加一个变量:clock_enable
uchar clock_minute = 0,clock_hour=0,clock_enable=0;

challis 发表于 2024-1-28 22:43:00

timer3中,分钟变化切换模式的代码中添加条件clock_enable
if(AddSec() && clock_enable)
            {
                //如果分钟变动:
                if(mode == Mode_Normal)
                {
                  if(minute == clock_minute && hour == clock_hour)
                        mode = Mode_Clock_Alert;
                }else if(mode == Mode_Clock_Alert)
                {
                  if(minute != clock_minute || hour != clock_hour)
                        mode = Mode_Normal;
                }
            }

challis 发表于 2024-1-28 22:43:48

按钮+中添加功能,如果是Mode_Clock模式,则修改clock_enable为!clock_enable
uchar Btn_Up_Pressed()
{
    switch(mode)
    {
    case Mode_Clock_Alert:
      mode = Mode_Normal;
            break;
    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;
    case Mode_Clock_Change_Minute:
      if(clock_minute>=59)
            clock_minute = 0;
      else
            ++clock_minute;
      break;
    case Mode_Clock_Change_Hour:
      if(clock_hour>=23)
            clock_hour = 0;
      else
            ++clock_hour;
      break;
    case Mode_Clock:
      clock_enable = !clock_enable;
      break;
    }
    second = 0;
    return 1;
}

challis 发表于 2024-1-28 22:44:17

烧录,测试-闹钟开关功能
页: 1 2 3 4 5 6 [7] 8 9 10 11
查看完整版本: 从零开始做一个数码管时钟-开天斧,程序开源 | 已完结