好的,因此对于以下代码,一旦调试器输入了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;
//禁用上拉并使其处于三态