为什么我的调试器在switch语句中的大小写之间转换不正确?

时间:2019-04-12 11:19:58

标签: c debugging embedded atmelstudio

好的,因此对于以下代码,一旦调试器输入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状态变量)。另外,请确保一次只按下一个按钮

1 个答案:

答案 0 :(得分:0)

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; //禁用上拉并使其处于三态