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

10-08 07:33