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))
并且工作正常。
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))
并且工作正常。