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
}
}
}
}
目前我的液晶屏遇到了一些问题。我尝试做一个倒数计时器,但是当我设置 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
}
}
}
}