标题: C语言程序while(!key)是循环哪? [打印本页]

作者: 农民阿伯    时间: 2023-8-14 23:20
标题: C语言程序while(!key)是循环哪?
下面这个程序中while(!key),是指按键一直按着话,key=0,然后!key就=1吗?然后就是while(1),但是这个是循环哪?是从上面if(key==0) dely(10)……这里开始一直到最后呢,还是说一直停在while(1)这句?这句while(!key)单独出现的?没有大括号里内容的?
void scan_key(void)

{

uchar j;

if(key==0)//判断按键是否被按下

delay(10);//按键消抖

if(key==0)//再次判断是否被下

{

while(!key);//等待按键释放

j++;//J加1

}

}
作者: sgq657785    时间: 2023-8-15 00:08
停在当前行
作者: cnfloatleaf    时间: 2023-8-15 01:03
不建议这么检测按键,否则单片机一只在等按键,做不了其他事。
应该设置一个定时器中断,比如20mS,每20mS检测一次按键,如果按键按下,(用一个寄存器)计数加1,按键放开后,读测计数值,2次以下算是抖动,忽略。2次~50次是一秒,算是短按按键,50次~250次是1~5秒,算是长按,这样检测按键,不耽误单片机跑其它程序。
作者: Hephaestus    时间: 2023-8-15 02:56
本质上是循环,但用途是等待。用循环查询来实现阻塞等待功能。
作者: rayin    时间: 2023-8-15 08:13
while(!key); 就是常按按键不松手就一直死循环, 直到放开按键.
作者: chxelc    时间: 2023-8-15 08:48
检测sbit key定义的IO口,如果为低电平就死循环。一般是指这个IO所接的按键按下时一直循环,松开后继续执行下一语句。
作者: 新昌小徐    时间: 2023-8-15 08:54
while(!key);
这是一个循环语句,只有一个分号,表示这是一个空语句,如果循环体有多条语句,那么就要用大括号括起来。如果循环体只有一条语句,那么写好这条语句后,分号结束就好了。
while(!key)这个是循环头,用来判断括号里面的值是否为零或非零,如果非零,执行完循环体里的语句后再次判断括号里面的值是否为零或是非零。如果为非零,再次执行循环体,直到括号里面的值为0时,去执行循环语句后续的语句,这里就是去执行j++;语句。
紧跟的;就是一个没有语句的循环体,你也可以把它看成这样
while(!key)

或是
while(!key)
{

}
作者: dyx811    时间: 2023-8-15 10:35
停止在(!key)这条语句,直到其值等于0,才会跳出。

作者: 鹈鹕    时间: 2023-8-15 18:09
楼主的这段程序很不老道,虽然编译没问题,执行也没问题,但过程却有不确定性,会有时候你的原意没有被正确表达,这取决于按下按键的那个时刻,这样改动就完美了:

void scan_key(void)

{

uchar j;

if(key==0)//判断按键是否被按下

{

delay(10);//按键消抖

if(key==0)//再次判断是否被下

{

while(!key);//等待按键释放

j++;//J加1

}

}

}

这样就能100%表达你的原意,跟按下按键的时刻没关系。

如果能书写成这种格式,就非常明了了:

void scan_key(void)
{
  uchar j;
  if(key==0)
    {
      delay(10);
      if(key==0)
       {
         while(!key);
         j++;
        }
     }
}
作者: liucan2020    时间: 2023-8-16 10:04
while()要慎用,这个是卡在当前 ,如果一直卡着   程序就没有办法走下去了 ,最少要搞个超时判断
作者: likejian    时间: 2023-8-16 22:59
还是建议用定时器判断按键
作者: 农民阿伯    时间: 2023-8-17 14:46
新昌小徐 发表于 2023-8-15 08:54
while(!key);
这是一个循环语句,只有一个分号,表示这是一个空语句,如果循环体有多条语句,那么就要用大 ...

原来如此,原来这个分号这么大用途,我一直以为是少了点什么。
作者: 农民阿伯    时间: 2023-8-17 14:47
cnfloatleaf 发表于 2023-8-15 01:03
不建议这么检测按键,否则单片机一只在等按键,做不了其他事。
应该设置一个定时器中断,比如20mS,每20mS ...

我要编的很简单,就是不想它做其他事,要它停着等下一步命令




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1