单片机C编程 按键一下暂停再按一下继续,不用中断

deitydeSHIN 2012-07-01 01:21:18
主要的问题,应该是 抖动,
在 按键 按一下的时候,比如说P1_2==0.
但是 再 按一下 继续的时候,可能因为 按下去的时间过长,又进入到这个 函数里了。就死循环了。
if(P1_2==0)
{
while(1)
{
if(P1_2) ;//继续
}
}

怎么 解决 死循环问题?
...全文
4077 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiaofengq5 2012-08-12
  • 打赏
  • 举报
回复
这就是一个死循环
aydf1 2012-08-12
  • 打赏
  • 举报
回复
如果P1_2==0 是按下的话,在死循环里如果P1_2 没有变化,仍然是0(按下),则再次循环,直到为1(抬起),抬起后执行if语句里的代码,这里面当然应该有一个跳出循环的语句。
xgbing 2012-08-12
  • 打赏
  • 举报
回复
如果用户按下键不放会有问题,最好改为用户按下键再弹起为一次输入

int isPressed()
{
int i=0, j=0;
while(1)
{
if(i <= 50)
i++; //计数

if(P1_2==1)
{
for(j = 0; j < 50 && P1_2==1; j++);
if(j >= 50)
break;
}
}

if(i > 50)
return(1);
else
return(0);
}
xgbing 2012-08-12
  • 打赏
  • 举报
回复
int isPressed()
{
int i=0;
while(P1_2==0)
{
i++; //计数
if(i > 50)
return(1); //计数超过50就认为键按下了;不超过,就认为是抖动
}

return(0);
}


void main()
{
int press = 0;

while(1)
{
if(isPressed())
{
press++;
if(press == 1) //第一次按下是暂停

//调用暂停函数

else if(press == 2) //第二次按下是继续
{
//调用继续函数

press = 0; //重新置为初始值
}
}
}

}
tangjs208 2012-08-12
  • 打赏
  • 举报
回复
可以考虑加个超时处理
Seong2020 2012-08-01
  • 打赏
  • 举报
回复
这根本就是一个死循环程序,一旦有按键按下,不管按下去的时间长或短,程序都会进入while死循环,永远跳不出来的。
help_wei 2012-07-30
  • 打赏
  • 举报
回复
可以试试这样,严格来说去抖是一定要的,不管是什么场合:
char flag=0;
while(flag==0)
{
if(P1_2==0)flag=1;
else break;
}
while(flag==1)
{
if(P1_2==0)
{
flag=0;
break;//继续
}
}
lbing7 2012-07-05
  • 打赏
  • 举报
回复
while(!P1_2)
{

}

IO直接作为循环条件即可
空影 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
break能跳出while吗?
[/Quote]break可以跳出while ,for ,switch
galle 2012-07-05
  • 打赏
  • 举报
回复
增加一个按键的标志位就可以解决了!
没有按下为0,按下为1,
每次要判断按键的时候结合标志位进行。
xufeng0218 2012-07-03
  • 打赏
  • 举报
回复
break能跳出while吗?
jianxuanzi 2012-07-01
  • 打赏
  • 举报
回复
这个代码看起来不像是解决再按下一次按键的问题吧,应该是检查按下后抬起的问题的。
如果P1_2==0 是按下的话,在死循环里如果P1_2 没有变化,仍然是0(按下),则再次循环,直到为1(抬起),抬起后执行if语句里的代码,这里面当然应该有一个跳出循环的语句。

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧