找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2502|回復: 12
打印 上一主題 下一主題
收起左側

C語言程序while(!key)是循環(huán)哪?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1087674 發(fā)表于 2023-8-14 23:20 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
下面這個程序中while(!key),是指按鍵一直按著話,key=0,然后!key就=1嗎?然后就是while(1),但是這個是循環(huán)哪?是從上面if(key==0) dely(10)……這里開始一直到最后呢,還是說一直停在while(1)這句?這句while(!key)單獨出現(xiàn)的?沒有大括號里內(nèi)容的?
void scan_key(void)

{

uchar j;

if(key==0)//判斷按鍵是否被按下

delay(10);//按鍵消抖

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

{

while(!key);//等待按鍵釋放

j++;//J加1

}

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:227393 發(fā)表于 2023-8-15 00:08 來自觸屏版 | 只看該作者
停在當前行
回復

使用道具 舉報

板凳
ID:1085441 發(fā)表于 2023-8-15 01:03 | 只看該作者
不建議這么檢測按鍵,否則單片機一只在等按鍵,做不了其他事。
應該設置一個定時器中斷,比如20mS,每20mS檢測一次按鍵,如果按鍵按下,(用一個寄存器)計數(shù)加1,按鍵放開后,讀測計數(shù)值,2次以下算是抖動,忽略。2次~50次是一秒,算是短按按鍵,50次~250次是1~5秒,算是長按,這樣檢測按鍵,不耽誤單片機跑其它程序。
回復

使用道具 舉報

地板
ID:883242 發(fā)表于 2023-8-15 02:56 | 只看該作者
本質(zhì)上是循環(huán),但用途是等待。用循環(huán)查詢來實現(xiàn)阻塞等待功能。
回復

使用道具 舉報

5#
ID:517951 發(fā)表于 2023-8-15 08:13 | 只看該作者
while(!key); 就是常按按鍵不松手就一直死循環(huán), 直到放開按鍵.
回復

使用道具 舉報

6#
ID:712097 發(fā)表于 2023-8-15 08:48 | 只看該作者
檢測sbit key定義的IO口,如果為低電平就死循環(huán)。一般是指這個IO所接的按鍵按下時一直循環(huán),松開后繼續(xù)執(zhí)行下一語句。
回復

使用道具 舉報

7#
ID:496636 發(fā)表于 2023-8-15 08:54 | 只看該作者
while(!key);
這是一個循環(huán)語句,只有一個分號,表示這是一個空語句,如果循環(huán)體有多條語句,那么就要用大括號括起來。如果循環(huán)體只有一條語句,那么寫好這條語句后,分號結束就好了。
while(!key)這個是循環(huán)頭,用來判斷括號里面的值是否為零或非零,如果非零,執(zhí)行完循環(huán)體里的語句后再次判斷括號里面的值是否為零或是非零。如果為非零,再次執(zhí)行循環(huán)體,直到括號里面的值為0時,去執(zhí)行循環(huán)語句后續(xù)的語句,這里就是去執(zhí)行j++;語句。
緊跟的;就是一個沒有語句的循環(huán)體,你也可以把它看成這樣
while(!key)
;
或是
while(!key)
{
;
}
回復

使用道具 舉報

8#
ID:34149 發(fā)表于 2023-8-15 10:35 | 只看該作者
停止在(!key)這條語句,直到其值等于0,才會跳出。
回復

使用道具 舉報

9#
ID:397054 發(fā)表于 2023-8-15 18:09 | 只看該作者
樓主的這段程序很不老道,雖然編譯沒問題,執(zhí)行也沒問題,但過程卻有不確定性,會有時候你的原意沒有被正確表達,這取決于按下按鍵的那個時刻,這樣改動就完美了:

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 發(fā)表于 2023-8-16 10:04 | 只看該作者
while()要慎用,這個是卡在當前 ,如果一直卡著   程序就沒有辦法走下去了 ,最少要搞個超時判斷
回復

使用道具 舉報

11#
ID:224580 發(fā)表于 2023-8-16 22:59 | 只看該作者
還是建議用定時器判斷按鍵
回復

使用道具 舉報

12#
ID:1087674 發(fā)表于 2023-8-17 14:46 來自觸屏版 | 只看該作者
新昌小徐 發(fā)表于 2023-8-15 08:54
while(!key);
這是一個循環(huán)語句,只有一個分號,表示這是一個空語句,如果循環(huán)體有多條語句,那么就要用大 ...

原來如此,原來這個分號這么大用途,我一直以為是少了點什么。
回復

使用道具 舉報

13#
ID:1087674 發(fā)表于 2023-8-17 14:47 來自觸屏版 | 只看該作者
cnfloatleaf 發(fā)表于 2023-8-15 01:03
不建議這么檢測按鍵,否則單片機一只在等按鍵,做不了其他事。
應該設置一個定時器中斷,比如20mS,每20mS ...

我要編的很簡單,就是不想它做其他事,要它停著等下一步命令
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表