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中进行仿真时,显示了上述误差。
发布于 2017-08-29 15:01:04
这是错误的!=操作符的优先级高于&(位和)操作符I被用作,而(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))而且工作正常。
发布于 2017-08-28 11:53:55
可能是Key_pressed();在内部进行了脱钩,而不必担心它。
如果您检查引脚状态,您可能会收到数十或数百个假的“按键”,因为金属触点弹出的时间很短:

https://stackoverflow.com/questions/45917987
复制相似问题