找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1815|回复: 12
打印 上一主题 下一主题
收起左侧

C语言程序while(!key)是循环哪?

  [复制链接]
跳转到指定楼层
楼主
ID:1087674 发表于 2023-8-14 23:20 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这个程序中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

}

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:227393 发表于 2023-8-15 00:08 来自手机 | 只看该作者
停在当前行
回复

使用道具 举报

板凳
ID:1085441 发表于 2023-8-15 01:03 | 只看该作者
不建议这么检测按键,否则单片机一只在等按键,做不了其他事。
应该设置一个定时器中断,比如20mS,每20mS检测一次按键,如果按键按下,(用一个寄存器)计数加1,按键放开后,读测计数值,2次以下算是抖动,忽略。2次~50次是一秒,算是短按按键,50次~250次是1~5秒,算是长按,这样检测按键,不耽误单片机跑其它程序。
回复

使用道具 举报

地板
ID:883242 发表于 2023-8-15 02:56 | 只看该作者
本质上是循环,但用途是等待。用循环查询来实现阻塞等待功能。
回复

使用道具 举报

5#
ID:517951 发表于 2023-8-15 08:13 | 只看该作者
while(!key); 就是常按按键不松手就一直死循环, 直到放开按键.
回复

使用道具 举报

6#
ID:712097 发表于 2023-8-15 08:48 | 只看该作者
检测sbit key定义的IO口,如果为低电平就死循环。一般是指这个IO所接的按键按下时一直循环,松开后继续执行下一语句。
回复

使用道具 举报

7#
ID:496636 发表于 2023-8-15 08:54 | 只看该作者
while(!key);
这是一个循环语句,只有一个分号,表示这是一个空语句,如果循环体有多条语句,那么就要用大括号括起来。如果循环体只有一条语句,那么写好这条语句后,分号结束就好了。
while(!key)这个是循环头,用来判断括号里面的值是否为零或非零,如果非零,执行完循环体里的语句后再次判断括号里面的值是否为零或是非零。如果为非零,再次执行循环体,直到括号里面的值为0时,去执行循环语句后续的语句,这里就是去执行j++;语句。
紧跟的;就是一个没有语句的循环体,你也可以把它看成这样
while(!key)

或是
while(!key)
{

}
回复

使用道具 举报

8#
ID:34149 发表于 2023-8-15 10:35 | 只看该作者
停止在(!key)这条语句,直到其值等于0,才会跳出。
回复

使用道具 举报

9#
ID:397054 发表于 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++;
        }
     }
}
回复

使用道具 举报

10#
ID:1040201 发表于 2023-8-16 10:04 | 只看该作者
while()要慎用,这个是卡在当前 ,如果一直卡着   程序就没有办法走下去了 ,最少要搞个超时判断
回复

使用道具 举报

11#
ID:224580 发表于 2023-8-16 22:59 | 只看该作者
还是建议用定时器判断按键
回复

使用道具 举报

12#
ID:1087674 发表于 2023-8-17 14:46 来自手机 | 只看该作者
新昌小徐 发表于 2023-8-15 08:54
while(!key);
这是一个循环语句,只有一个分号,表示这是一个空语句,如果循环体有多条语句,那么就要用大 ...

原来如此,原来这个分号这么大用途,我一直以为是少了点什么。
回复

使用道具 举报

13#
ID:1087674 发表于 2023-8-17 14:47 来自手机 | 只看该作者
cnfloatleaf 发表于 2023-8-15 01:03
不建议这么检测按键,否则单片机一只在等按键,做不了其他事。
应该设置一个定时器中断,比如20mS,每20mS ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表