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

时间:2017-08-28 11:32:23

标签: c microcontroller atmega avr-gcc

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

中进行模拟时会显示上述错误

2 个答案:

答案 0 :(得分:1)

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

如果您检查引脚状态,您可能会收到数十或数百个假按键&#34;由于金属触点在很短的时间内反弹: enter image description here

答案 1 :(得分:1)

错误的优先级!=运算符高于&amp; (按位和)运算符 我被用作 而(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))

工作正常。