8051单片机液晶倒计时定时器

8051 microcontroller lcd countdown timer

目前我的液晶屏遇到了一些问题。我尝试做一个倒数计时器,但是当我设置 Hour = 0,Min = 1 时,秒数为 0,我的小时数变为某个未知字符,min = 59,sec = 59。我错过了什么吗?

void Timer1(void) interrupt 3
{
    TF1 = 0;
    TH1 = 0xB1;
    TL1 = 0XE0;
    cd_msec--;

    if(cd_msec == 0)
    {
        cd_msec = 99;
        cd_sec--;
    }
    if(cd_sec == 0)
    {
        cd_sec = 59;
        cd_min--;
    }
    if(cd_min == 0) 
    {
        cd_min = 59;
        cd_hour--;
    }
    if(cd_hour == 0)
    {
        cd_hour = 0;
    }
    if(cd_hour == 0 && cd_min == 0)
    {
        cd_hour = 0;
        cd_min = 0;
    }
    if(cd_hour == 0 && cd_min == 0 && cd_sec == 0)
    {
        cd_hour = 0;
        cd_min = 0;
        cd_sec = 0;
        cd_msec = 0;
    }     

}

您有 0H : 1M : 0S.

你查秒,秒为零。你设置 minutes = 0。 你查看会议记录,现在是 0。所以你从小时数中减去 1。小时数已经为零。所以它环绕到大约 65k。

恕我直言,最好只有毫秒并仅在更新显示时(如果需要)转换为 hours:minutes:seconds

你的逻辑是错误的。 假设前置条件:

cd_msec=1; cd_sec=1; cd_min=5;

当代码执行时,您将得到:

cd_msec=99; cd_sec=59; cd_min=4;

所以一个滴答声改变了倒计时超过 1 秒。

请记住,零是一个有效值!我建议您重写代码,以便在 递减之前检查零

类似于:

if (cd_msec > 0) {
  cd_msec--;
}
else
{
  if (cd_sec > 0) {
    cd_sec--;
    cd_msec = 99; // Assummes 10ms ticks
  }
  else
  {
     // Handle case with both cd_msec and cd_sec being zero
     // ...
     // ....
  }
}

我同意@nielsen 的逻辑错误。您可以考虑采用以下方法在每毫秒滴答时正确更新所有变量。

此外,我已将 milli_sec 分配给 999,因为您将设法为其获取一个 16 位变量。

if (milli_sec > 0)
{
    milli_sec--
} else {
    if (second > 0) {
        milli_sec = 999;
        second--;
    } else {
        if (minute > 0) {
            milli_sec = 999;
            second = 59
            minute--
        } else {
            if (hour > 0) {
                milli_sec = 999;
                second = 59;
                minute = 59;
                hour--
            }
            else {
                //COUNTDOWN REACHED TO 0
                //hour,minute,second,milli_second is zero
            }

        }
    }
}