標(biāo)記的用法,用一個(gè)按鍵控制1個(gè)LED燈的亮滅,按鍵去抖
我們學(xué)習(xí)一下用一個(gè)bit變量來做一個(gè)標(biāo)記,然后在按鍵的控制下,這個(gè)標(biāo)記會(huì)變化,再根據(jù)這個(gè)標(biāo)記的值,LED也輸出不同的狀態(tài)。
因?yàn)榘存I按下時(shí)可能會(huì)有抖動(dòng)的情況,每次按下時(shí),可能會(huì)發(fā)生了人難以覺察到的多次抖動(dòng),相當(dāng)于一下子按下了很多次。這會(huì)導(dǎo)致程序無法識(shí)別出您真正的按鍵意圖。
但是抖動(dòng)一般都是發(fā)生在剛按下鍵和松開鍵的時(shí)候,所以,我們只要避開這一段時(shí)間,等鍵穩(wěn)定按下或者松開時(shí),再去讀它的值,一般就可以正確讀取了。
所以,當(dāng)讀到第一次按鍵的值時(shí),要延時(shí)等待一會(huì),再處理。在松開后,也延時(shí)一會(huì),免得檢測(cè)到松開的抖動(dòng)以為又有按鍵。(注,更復(fù)雜的應(yīng)用,需要在按下延時(shí)之后重新驗(yàn)證按鍵,為了簡(jiǎn)化和方便理解,這個(gè)例程里沒有這樣做。)
另外,因?yàn)槌绦蚴茄h(huán)運(yùn)行的,當(dāng)一次按鍵處理后,又會(huì)再循環(huán)回來繼續(xù)檢測(cè),如果您的按鍵這時(shí)還沒有松開,又會(huì)被讀到一次新的按鍵,并做處理。所以我們還要做一個(gè)特殊的處理,識(shí)別到一個(gè)按鍵并處理完成之后,還要等待這個(gè)按鍵松開后,再繼續(xù)循環(huán)運(yùn)行。
看程序:
請(qǐng)根據(jù)例程里的注釋理解程序。
請(qǐng)編譯,進(jìn)入仿真,全速運(yùn)行,看結(jié)果。
全速后,由于light變量初始化時(shí)默認(rèn)為0,所以燈是亮的。按下K1,松開后,燈滅了;再按一次K1,松開后,燈滅了。
這個(gè)例子里,我們只用一個(gè)按鍵就控制了燈的亮滅,這種方法可以節(jié)省了硬件資源,也就是節(jié)省了硬件成本。在實(shí)際項(xiàng)目設(shè)計(jì)中,有成本優(yōu)勢(shì),產(chǎn)品就更具競(jìng)爭(zhēng)力。所以我們應(yīng)該多學(xué)習(xí)類似的可以節(jié)省資源的方法。
作業(yè):
改為4個(gè)按鍵,分別控制4個(gè)LED的亮和滅。相當(dāng)應(yīng)用到多個(gè)房間的單鍵開關(guān)燈共用一個(gè)cpu處理。
評(píng)論