目前我在液晶屏上遇到了一些问题。我试着做一个倒数计时器,但是当我设置Hour = 0,Min = 1时,sec命中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;
}
}
答案 0 :(得分:1)
你的逻辑非常错误。 假设前提条件:
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
// ...
// ....
}
}
答案 1 :(得分:1)
我同意@nielsen的观点是错误的。您可以考虑采用以下方法在每毫秒刻度更新所有变量。
另外,考虑到你将设法获得16位变量,我已经将milli_sec指定为999。
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
}
}
}
}
答案 2 :(得分:0)
您有0H : 1M : 0S
。
你检查秒,秒是零。您设置了minutes = 0
。
你检查分钟,现在是0
。所以你从小时中减去1
。小时数已经为零。所以它可能包含~65k左右。
恕我直言,最好只有msecs,只有在更新显示器时才转换为hours:minutes:seconds
。(如果需要)。