我正在为我的字时钟编写程序,我的一个函数检查当前小时并根据当前小时将某个字节推送到我的移位寄存器。如果当前分钟在区间[28:57]中,它会将小时值增加1,以计算使用小时数的差异(8:40变为"二十九分钟和#34;,而8 :20是"二十八")。此外,如果小时值从12增加到13,它应该回滚到1,因为时钟仅使用12小时模式。下面的代码段显示了我的代码的相关部分,在6:20执行。
//Hours. If current minute in [28:57], hours number is increased by one
//Additionally, if 13, reset to 1
Serial.println(currHour);
if(28 <= currMin && currMin <= 57) {
currHour += 1;
if (currHour == 13) {
currHour = 1;
};
Serial.println("currMin in [28:57], currHour increased by one");
Serial.print("currHour is now: ");
Serial.println(currHour);
} else {
Serial.print("currMin not in [28:57], currHour is still: ");
Serial.println(currHour);
};
Serial.println(currHour);
以上代码打印if-statement评估之前和之后存储在currHour中的值,并将以下内容输出到我的串行监视器:
6
currMin not in [28:57], currHour is still: 6
1
如果我注释掉if-statement检查currHour == 13,我得到以下输出:
6
currMin not in [28:57], currHour is still: 6
6
以上所有代码都在函数void checkHour(int currHour, int currMin);
这个函数的参数currHour和currMin是我的RTC模块返回的两个整数。通常,我通过RTC返回的变量调用函数:checkHour(rtcHour, rtcMin);
如果我手动输入其中任何一个值,问题就会消失并且函数会正确评估。也就是说,以下两个语句都能正常工作:
checkHour(6, rtcMin);
checkHour(rtcHour, 20);
只有当我使用从RTC返回的两个变量时才会遇到问题。
我在这里完全不知所措。我怀疑可能与错误的引用/解引用变量有关,因为这通常是我的问题的原因。但是我无法理解为什么会导致if语句在false语句中评估true。
更新 在Barmar的评论之后,第一个if语句现在是:
if(28 <= currMin && currMin <= 57) {
currHour = currHour + 1;
Serial.println("currMin in [28:57], currHour increased by one");
Serial.print("currHour is now: ");
Serial.println(currHour);
if (currHour == 13) {
Serial.println("currHour is 13");
currHour = 1;
};
}
串口监视器现在输出:
6
currMin in [28:57], currHour increased by one
currHour is now: 7
1
也就是说,&#34; currHour是13&#34;行不打印。
更新2 我找到了解决问题的方法。
检查小时值后,另一个if语句检查小时的值,并选择正确的字节转移到移位寄存器。最初,这只考虑了值1-12,但我已将其更新为包括13,因此从上面的if语句中删除了if (currHour == 13) {
语句。
int toShift = 0x00;
if(currHour == 1){
toShift |= _ONE;
Serial.println("One hour");
} else if (currHour == 2) {
toShift |= _TWO;
Serial.println("Two hours");
} else if(currHour == 3){
toShift |= _THREE;
Serial.println("Three hours");
} // yadda yaddda
} else if (currHour == 13) {
toShift |= _ONE;
Serial.println("Thirteen / one hour");
}