標(biāo)題: C語言程序while(!key)是循環(huán)哪? [打印本頁]

作者: 農(nóng)民阿伯    時(shí)間: 2023-8-14 23:20
標(biāo)題: C語言程序while(!key)是循環(huán)哪?
下面這個(gè)程序中while(!key),是指按鍵一直按著話,key=0,然后!key就=1嗎?然后就是while(1),但是這個(gè)是循環(huán)哪?是從上面if(key==0) dely(10)……這里開始一直到最后呢,還是說一直停在while(1)這句?這句while(!key)單獨(dú)出現(xiàn)的?沒有大括號(hào)里內(nèi)容的?
void scan_key(void)

{

uchar j;

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

delay(10);//按鍵消抖

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

{

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

j++;//J加1

}

}
作者: sgq657785    時(shí)間: 2023-8-15 00:08
停在當(dāng)前行
作者: cnfloatleaf    時(shí)間: 2023-8-15 01:03
不建議這么檢測(cè)按鍵,否則單片機(jī)一只在等按鍵,做不了其他事。
應(yīng)該設(shè)置一個(gè)定時(shí)器中斷,比如20mS,每20mS檢測(cè)一次按鍵,如果按鍵按下,(用一個(gè)寄存器)計(jì)數(shù)加1,按鍵放開后,讀測(cè)計(jì)數(shù)值,2次以下算是抖動(dòng),忽略。2次~50次是一秒,算是短按按鍵,50次~250次是1~5秒,算是長按,這樣檢測(cè)按鍵,不耽誤單片機(jī)跑其它程序。
作者: Hephaestus    時(shí)間: 2023-8-15 02:56
本質(zhì)上是循環(huán),但用途是等待。用循環(huán)查詢來實(shí)現(xiàn)阻塞等待功能。
作者: rayin    時(shí)間: 2023-8-15 08:13
while(!key); 就是常按按鍵不松手就一直死循環(huán), 直到放開按鍵.
作者: chxelc    時(shí)間: 2023-8-15 08:48
檢測(cè)sbit key定義的IO口,如果為低電平就死循環(huán)。一般是指這個(gè)IO所接的按鍵按下時(shí)一直循環(huán),松開后繼續(xù)執(zhí)行下一語句。
作者: 新昌小徐    時(shí)間: 2023-8-15 08:54
while(!key);
這是一個(gè)循環(huán)語句,只有一個(gè)分號(hào),表示這是一個(gè)空語句,如果循環(huán)體有多條語句,那么就要用大括號(hào)括起來。如果循環(huán)體只有一條語句,那么寫好這條語句后,分號(hào)結(jié)束就好了。
while(!key)這個(gè)是循環(huán)頭,用來判斷括號(hào)里面的值是否為零或非零,如果非零,執(zhí)行完循環(huán)體里的語句后再次判斷括號(hào)里面的值是否為零或是非零。如果為非零,再次執(zhí)行循環(huán)體,直到括號(hào)里面的值為0時(shí),去執(zhí)行循環(huán)語句后續(xù)的語句,這里就是去執(zhí)行j++;語句。
緊跟的;就是一個(gè)沒有語句的循環(huán)體,你也可以把它看成這樣
while(!key)
;
或是
while(!key)
{

}
作者: dyx811    時(shí)間: 2023-8-15 10:35
停止在(!key)這條語句,直到其值等于0,才會(huì)跳出。

作者: 鵜鶘    時(shí)間: 2023-8-15 18:09
樓主的這段程序很不老道,雖然編譯沒問題,執(zhí)行也沒問題,但過程卻有不確定性,會(huì)有時(shí)候你的原意沒有被正確表達(dá),這取決于按下按鍵的那個(gè)時(shí)刻,這樣改動(dòng)就完美了:

void scan_key(void)

{

uchar j;

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

{

delay(10);//按鍵消抖

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

{

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

j++;//J加1

}

}

}

這樣就能100%表達(dá)你的原意,跟按下按鍵的時(shí)刻沒關(guān)系。

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

void scan_key(void)
{
  uchar j;
  if(key==0)
    {
      delay(10);
      if(key==0)
       {
         while(!key);
         j++;
        }
     }
}
作者: liucan2020    時(shí)間: 2023-8-16 10:04
while()要慎用,這個(gè)是卡在當(dāng)前 ,如果一直卡著   程序就沒有辦法走下去了 ,最少要搞個(gè)超時(shí)判斷
作者: likejian    時(shí)間: 2023-8-16 22:59
還是建議用定時(shí)器判斷按鍵
作者: 農(nóng)民阿伯    時(shí)間: 2023-8-17 14:46
新昌小徐 發(fā)表于 2023-8-15 08:54
while(!key);
這是一個(gè)循環(huán)語句,只有一個(gè)分號(hào),表示這是一個(gè)空語句,如果循環(huán)體有多條語句,那么就要用大 ...

原來如此,原來這個(gè)分號(hào)這么大用途,我一直以為是少了點(diǎn)什么。
作者: 農(nóng)民阿伯    時(shí)間: 2023-8-17 14:47
cnfloatleaf 發(fā)表于 2023-8-15 01:03
不建議這么檢測(cè)按鍵,否則單片機(jī)一只在等按鍵,做不了其他事。
應(yīng)該設(shè)置一個(gè)定時(shí)器中斷,比如20mS,每20mS ...

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1