和12歲小同志搞創(chuàng)客開發(fā):檢測(cè)按鍵狀態(tài)的兩件法寶
機(jī)緣巧合在網(wǎng)上認(rèn)識(shí)一位12歲小同志,從零開始系統(tǒng)輔導(dǎo)其創(chuàng)客開發(fā)思維和技巧。
按鍵是創(chuàng)客開發(fā)過程中必不可少的器件之一,用戶可以通過按鍵實(shí)現(xiàn)交互控制。例如:按鍵開關(guān)燈、長(zhǎng)按按鍵解除報(bào)警、按鍵實(shí)現(xiàn)設(shè)備控制等功能。
檢測(cè)按鍵狀態(tài)有兩種方式:第一種,檢測(cè)按鍵端口的輸出電壓信號(hào)變化,判斷按鍵的狀態(tài);第二種,按鍵狀態(tài)變化觸發(fā)中斷。
下面讓我們學(xué)習(xí)這兩種檢測(cè)按鍵狀態(tài)的方法~
1
檢測(cè)電平變化,判斷按鍵狀態(tài)
在如何驅(qū)動(dòng)各類型傳感器?這篇文章中講到:可以將傳感器進(jìn)行分類,主要包括:數(shù)字量輸出類型傳感器、數(shù)字量輸入類型傳感器、模擬量電壓類型傳感器、模擬量電流類型傳感器和協(xié)議類型傳感器。
按鍵本質(zhì)上并不是傳感器,但是按照驅(qū)動(dòng)方式來看,可當(dāng)作數(shù)字量輸出類型傳感器,進(jìn)行驅(qū)動(dòng)。
可以通過按鍵的設(shè)計(jì)圖明白其中的原理,如下圖所示,假設(shè)TP點(diǎn)接入單片機(jī)IO端口,當(dāng)按鍵未被按下時(shí),此處為5V高電平,當(dāng)按鍵被按下時(shí),此處就會(huì)變?yōu)?V低電平,通過這種高、低電平狀態(tài)變化判斷按鍵的狀態(tài)變化。
那么設(shè)計(jì)按鍵控制LED亮、滅的程序就非常好理解了,如下所示:
2
使用中斷觸發(fā),判斷按鍵狀態(tài)
我們?cè)谠O(shè)計(jì)功能時(shí),難免要用到延時(shí),如果延時(shí)時(shí)間過長(zhǎng),可以發(fā)現(xiàn)按鍵就不那么靈敏了,主要原因在于:延時(shí)消耗過多的處理器資源,程序大多時(shí)間都運(yùn)行在延時(shí)函數(shù)中,無法進(jìn)行按鍵狀態(tài)的判斷。
這時(shí)候就需要使用中斷觸發(fā)功能了~
當(dāng)控制器正在處理內(nèi)部數(shù)據(jù)時(shí),外界發(fā)生了緊急情況,要求CPU暫停當(dāng)前的工作轉(zhuǎn)去處理這個(gè)緊急事件。處理完畢后,再回到原來被中斷的地址,繼續(xù)原來的工作,這樣的過程稱為中斷,過程如下所示:
可通過監(jiān)測(cè)按鍵電平信號(hào)變化,觸發(fā)中斷,如下圖情況所示,當(dāng)按鍵未按下,此時(shí)是5V高電平信號(hào)。
當(dāng)按下按鍵瞬間,高電平會(huì)切換到低電平,產(chǎn)生下降沿信號(hào),此時(shí)可觸發(fā)下降沿中斷。
當(dāng)松開按鍵瞬間,低電平會(huì)切換到高電平,產(chǎn)生上降沿信號(hào),此時(shí)可觸發(fā)上降沿中斷。
中斷程序的實(shí)現(xiàn)也非常簡(jiǎn)單,無需在主程序中設(shè)計(jì)程序,選擇合適的中斷信號(hào)觸發(fā)模式,將需要實(shí)現(xiàn)的功能寫在中斷處理函數(shù)中,當(dāng)檢測(cè)到相應(yīng)的觸發(fā)信號(hào),中斷處理函數(shù)就可以運(yùn)行了,如下所示:
有一點(diǎn)需要注意,中斷處理函數(shù)適合處理“急件”,處理完畢后,再回到原來被中斷的地址,繼續(xù)原來的工作,所以不應(yīng)該在中斷程序中有大量長(zhǎng)時(shí)間的延時(shí),以免對(duì)主程序產(chǎn)生影響。
往期推薦
