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

C atmega16单端口签入while()循环或if(),c,microcontroller,atmega,avr-gcc,C,Microcontroller,Atmega,Avr Gcc,Atmega16PORTC用于按钮,并重命名为 #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) 或 考虑因素是什么

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(正常)
if(向上)
在函数中不工作

但是,通过函数将键值带到变量,我就可以检查它了。
当我使用一个函数时,
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中模拟时会显示上述错误

可能是您按下了
键()在内部执行去抖动,您不必担心

如果检查pin状态,当金属触点在很短的时间内反弹时,您可能会收到数十次或数百次假“按键”:

可能是您按下了
键()在内部执行去抖动,您不必担心

如果检查pin状态,当金属触点在很短的时间内反弹时,您可能会收到数十次或数百次假“按键”:

这是错误的优先顺序!=运算符的值高于&(按位and)运算符的值 我被用作 而
(确定=1)
意思是

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

while(PINC&(1这是错误的!=运算符的优先级高于&(按位and)运算符的优先级
我被用作
而
(确定=1)
意思是

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

while(PINC&((1)在我看来,你应该得到一些。你问的问题非常不清楚。什么是“不起作用”?行为是什么?你能举个例子吗?
当(…)
你在那里旋转循环,如果(…)
是验证声明。您可以决定您需要对应用程序的需求执行什么。A将非常有助于使这个问题变得更好。在我看来,您应该获得一些。您所问的问题非常不清楚。什么是“不起作用”?行为是什么?您能举个例子吗?
while(…)
是您在那里旋转的循环,
if(…)
是验证语句。您可以决定根据应用程序的需要执行哪些操作。A将非常有助于改进此问题。
而((PINC&(1)我现在不想更改端口,请说明如何针对0或false进行测试。在这种情况下,
if(S_确定)
如果(!S_OK)
如果(S_OK==false)
如果(S_OK==0)
。最后三个是相同的。
而((PINC&(1)我现在不想更改端口,请说明如何针对0或false进行测试。在这种情况下
如果(S_OK)
如果(!S_OK)
如果(S_OK==false)
(S_OK==0)
。最后三个是相同的。
while (PINC & ((1 << 6) != 1))
while ((PINC & (1 << 6)) != 1)
while ((PINC & (1 << 6)) != (1 << 6))
#define OK_S (PINC & (1 << 6))