首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >atmega16单端口签入while()循环或if()

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

Stack Overflow用户
提问于 2017-08-28 11:32:23
回答 2查看 223关注 0票数 0

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

代码语言:javascript
运行
复制
#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)

我试着把它放进循环里

代码语言:javascript
运行
复制
while (OK_S);

代码语言:javascript
运行
复制
if (UP_S);

考虑的是什么?

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

但是,通过函数将键值取到变量中,我就可以检查它。

当我使用一个函数时,ch = Key_pressed(); while(ch==1)工作得很好。

代码语言:javascript
运行
复制
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中进行仿真时,显示了上述误差。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-29 15:01:04

这是错误的!=操作符的优先级高于&(位和)操作符I被用作,而(OK_S != 1)它的意思是

代码语言:javascript
运行
复制
while (PINC & ((1 << 6) != 1))

与C编译器相比,它更喜欢类似于

代码语言:javascript
运行
复制
while ((PINC & (1 << 6)) != 1)

但正确的方法是

代码语言:javascript
运行
复制
while ((PINC & (1 << 6)) != (1 << 6))

因此,我将宏定义更正为

代码语言:javascript
运行
复制
#define OK_S (PINC & (1 << 6))

而且工作正常。

票数 1
EN

Stack Overflow用户

发布于 2017-08-28 11:53:55

可能是Key_pressed();在内部进行了脱钩,而不必担心它。

如果您检查引脚状态,您可能会收到数十或数百个假的“按键”,因为金属触点弹出的时间很短:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45917987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档