找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2533|回復(fù): 12
收起左側(cè)

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

  [復(fù)制鏈接]
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

}

}
回復(fù)

使用道具 舉報

ID:227393 發(fā)表于 2023-8-15 00:08 來自觸屏版 | 顯示全部樓層
停在當(dāng)前行
回復(fù)

使用道具 舉報

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

使用道具 舉報

ID:883242 發(fā)表于 2023-8-15 02:56 | 顯示全部樓層
本質(zhì)上是循環(huán),但用途是等待。用循環(huán)查詢來實現(xiàn)阻塞等待功能。
回復(fù)

使用道具 舉報

ID:517951 發(fā)表于 2023-8-15 08:13 | 顯示全部樓層
while(!key); 就是常按按鍵不松手就一直死循環(huán), 直到放開按鍵.
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:34149 發(fā)表于 2023-8-15 10:35 | 顯示全部樓層
停止在(!key)這條語句,直到其值等于0,才會跳出。
回復(fù)

使用道具 舉報

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%表達你的原意,跟按下按鍵的時刻沒關(guān)系。

如果能書寫成這種格式,就非常明了了:

void scan_key(void)
{
  uchar j;
  if(key==0)
    {
      delay(10);
      if(key==0)
       {
         while(!key);
         j++;
        }
     }
}
回復(fù)

使用道具 舉報

ID:1040201 發(fā)表于 2023-8-16 10:04 | 顯示全部樓層
while()要慎用,這個是卡在當(dāng)前 ,如果一直卡著   程序就沒有辦法走下去了 ,最少要搞個超時判斷
回復(fù)

使用道具 舉報

ID:224580 發(fā)表于 2023-8-16 22:59 | 顯示全部樓層
還是建議用定時器判斷按鍵
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表