>好的,所以对于下面的代码,一旦调试器输入 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;
//禁用引体向上并使其成为三状态