C语言 为什么我的调试器在 switch 语句中的事例之间错误地转换?



>好的,所以对于下面的代码,一旦调试器输入 switch 语句,它就会从

41路 --> 38行 --> 26路

然后它永远在第 38 行和第 26 行之间振荡。它甚至没有输入第一个案例陈述,这让我感到困惑,因为我一直在做作业直到清晨。它不应输入任何其他情况,因为 PORTA 初始化为全部零,并且默认值应将调试器定向到第一种情况。你甚至可以自己尝试一下,看看我的意思。

#include <avr/io.h>

int main(void)
{
DDRA = 0x00; //PORTA = 0x00;
DDRB = 0xFF; //PORTB = 0x00;
typedef enum {
wtf, //wait for PA3 to be pressed
wth, //wait for PA2 to be pressed
dooropens, //yay
}doorstate;
doorstate state = wtf;
while (1) 
{
switch(state) 
{
case wtf:
if (PORTA == 0x04)  {
state = wth; 
PORTA = 0x00; //releases button
}
else 
state = wtf;  
break;
case wth:
if (PORTA == 0x02)  
state = dooropens; 
else 
state = wtf;  
break; 
case dooropens:
PORTB = 0x01;
if (PORTA == 0x80) {
state = wtf;
PORTB = 0x00;
}
break;
default:
state = wtf;
}
}
}

如果您需要更好地了解它应该做什么,以下是说明。

一个家庭在门口有一个数字组合锁舌锁系统。系统在键盘上有按钮。按钮"X"连接到 PA0,"Y"连接到 PA1,"#"连接到 PA2。按下并释放"#",然后按"Y",应通过将 PB0 设置为 1 来解锁门。任何其他序列都无法解锁。从屋内按下按钮 (PA7) 可锁定门 (PB0=0)。出于调试目的,请为每个状态提供一个数字,并始终将当前状态写入 PORTC(请考虑使用 enum 状态变量)。另外,请务必检查一次只按下一个按钮

PORTA == 0x04) 
{
state = wth; 
PORTA = 0x00; //releases button

不确定你做了你想做的事情。 您不会释放带有PORTA = 0x00的按钮

如果 PORTA 上的 1 引脚状态发生变化,您认为您会在 PORTA 上读到什么?

  • (PORTA & something)更改(PORTA == something)

  • 删除行PORTA = 0x00; //releases button

注意:

  • DDRA = 0x00;//使端口 A 作为输入

  • PORTA = 0x00;//禁用引体向上并使其成为三状态

相关内容

最新更新