atmega16 单端口检查 while() 循环或 if()

atmega16 single port checking in while() loop or if()

Atmega16 PORTC 用于按钮,并重命名为

#define LEFT_S       PINC&(1<<2)
#define RIGHT_S      PINC&(1<<3)
#define UP_S         PINC&(1<<4)
#define DOWN_S       PINC&(1<<5)
#define OK_S         PINC&(1<<6)

我正在尝试将其放入

之类的循环中
while (OK_S);

if (UP_S);

考虑的是什么?

while (OK_S)if (UP_S) 在函数中不起作用。

但是通过函数将键值取到变量,然后我可以检查它。
当我使用函数时 ch = Key_pressed(); while(ch==1) 运行良好。

int Key_pressed(void)
{   
   while(1) {
      if (LEFT_S)  { while (LEFT_S);  return 1; }             
      if (RIGHT_S) { while (RIGHT_S); return 2; }
      if (UP_S)    { while (UP_S);    return 3; }
      if (DOWN_S)  { while (DOWN_S);  return 4; }
      if (OK_S)    { while (OK_S);    return 5; }
   }
}

在Proteus中模拟时出现上述错误

可能您 Key_pressed(); 在内部进行去抖动,您不必担心。

如果您检查引脚状态,您可能会收到数十或数百个假货 "key presses",因为金属触点会在很短的时间内反弹:

错误的是!=运算符的优先级高于&(按位与)运算符的优先级 我被用作 而 (OK_S != 1) 这意味着

while (PINC & ((1 << 6) != 1))

C 编译器更喜欢

while ((PINC & (1 << 6)) != 1)

但正确的做法是

while ((PINC & (1 << 6)) != (1 << 6))

所以我将宏定义更正为

#define OK_S (PINC & (1 << 6))

并且工作正常。