按鍵電路居然還能這樣設計

在單片機系統裡,按鍵是常見的輸入設備,在本文將介紹幾種按鍵硬件、軟件設計方面的技巧和

改進的方案。一般的在按鍵的設計上,一般有四種方案。

利用GPIO口直接檢測單個按鍵

按鍵電路居然還能這樣設計

這種連接是最簡單和最基礎的,對於單片機初學者很容易理解和使用。但是缺點是:需要在主循環中不斷檢測按鍵是否按下,並且需要做消抖處理。若主循環中某個函數任務佔用時間較長,則按鍵會有不同程度的“失靈”。

按鍵較多則使用矩陣鍵盤

按鍵電路居然還能這樣設計

這種的優點是能夠在有限的GPIO情況下,擴展儘可能多的按鍵。但缺點同上,需要不停檢測按鍵是否按下。

利用中斷

將按鍵接到外部中斷引腳上,利用按鍵按下產生的邊沿信號進行按鍵檢測。

按鍵電路居然還能這樣設計

利用中斷檢測是效率最高,不需要循環檢測按鍵是否按下。但是缺點是,需要單片機有足夠的外部中斷接口以供使用。

利用ADC

利用單片機的ADC,在不同的按鍵按下後,能夠使得ADC接口上的電壓不同,根據電壓的不同,則可以識別按鍵。

按鍵電路居然還能這樣設計


利用ADC的優點是,只需要單片機的一個ADC接口,一根線,就能對多個按鍵進行識別。缺點是按鍵一旦內部接觸不良,則可能按鍵串位,且按鍵產生的抖動,會造成一定的識別錯誤。

改進方案

改進一:在原方案一的基礎上,加上與門電路,使得任何一個按鍵按下,都能產生中斷,然後在中斷裡面識別是哪個按鍵被按下。因此不需要循環掃描,大大提高了效率。方案如圖1.5所示。只需要每個按鍵對應地增加一個二極管,利用二極管的線與特性,可以實現按下任何按鍵,都能產生中斷信號,但是按鍵之間互不影響。二極管選用普通整流二極管即可,本人親測可行。

按鍵電路居然還能這樣設計

圖1.5 改進一


改進二:在原有的ADC按鍵的基礎上,也可用增加二極管的方式,實現按鍵中斷,並在中斷服務程序裡進行AD轉換,從而識別按鍵。電路如圖1.6所示。


按鍵電路居然還能這樣設計

圖1.6 改進二

改進三:因為按鍵不可避免的有抖動,因此按鍵消抖可以通過硬件消痘和軟件消抖。現在分享一個十分簡單且有效的硬件消痘方法:給按鍵並聯一個104左右的電容。軟件上基本不用處理即可避免抖動。

改進四:在按鍵掃描檢測的方案下,如果主循環中有某個函數佔用時間較長,則按鍵會發生或長或短的“失靈”,現分享我的一個解決方案。將按鍵掃描放到定時器中斷裡面,這樣就可週期性地檢測按鍵按下情況,不受主循環的影響。並且,能解析出按鍵的不同狀態,即按下、按住、彈起、為按下這四種狀態,用以實現更豐富的功能。


但需注意兩點:一是定時器的定時時間,不可過長也不可過短,過長容易檢測不到按下,過短會佔用大量時間資源。二是中斷服務程序需簡單明瞭,只做檢測用,通過全局變量傳遞,在主循環內完成按鍵響應,中斷服務函數內儘量不要佔用太多時間。


分享到:


相關文章: