在單片機系統裡,按鍵是常見的輸入設備,在本文將介紹幾種按鍵硬體、軟體設計方面的技巧。一般的在按鍵的設計上,一般有三種方案:
三是將按鍵接到外部中斷引腳上,利用按鍵按下產生的邊沿信號進行按鍵檢測,如圖1.3所示;第一種是最簡單和最基礎的,對於單片機初學者很容易理解和使用,但是缺點是,需要在主循環中不斷檢測按鍵是否按下,並且需要做消抖處理。若主循環中某個函數任務佔用時間較長,則按鍵會有不同程度的「失靈」。第二種,優點是能夠在有限的GPIO情況下,擴展儘可能多的按鍵。但缺點同上,需要不停檢測按鍵是否按下。第三種方式是效率最高,不需要循環檢測按鍵是否按下,但是缺點是,需要單片機有足夠的外部中斷接口以供使用;在以上的三種常見按鍵設計的基礎上,現在分享我學習和工作中總結的按鍵方案。改進一:在原方案一的基礎上,加上與門電路,使得任何一個按鍵按下,都能產生中斷,然後在中斷裡面識別是哪個按鍵被按下。因此不需要循環掃描,大大提高了效率。方案如圖1.5所示。只需要每個按鍵對應地增加一個二極體,利用二極體的線與特性,可以實現按下任何按鍵,都能產生中斷信號,但是按鍵之間互不影響。二極體選用普通整流二極體即可,本人親測可行。改進二:在原有的ADC按鍵的基礎上,也可用增加二極體的方式,實現按鍵中斷,並在中斷服務程序裡進行AD轉換,從而識別按鍵。電路如圖1.6所示。改進三:因為按鍵不可避免的有抖動,因此按鍵消抖可以通過硬體消抖和軟體消抖。現在分享一個十分簡單且有效的硬體消抖方法:給按鍵並聯一個104左右的電容。軟體上基本不用處理即可避免抖動。改進四:在按鍵掃描檢測的方案下,如果主循環中有某個函數佔用時間較長,則按鍵會發生或長或短的「失靈」,現分享我的一個解決方案。將按鍵掃描放到定時器中斷裡面,這樣就可周期性地檢測按鍵按下情況,不受主循環的影響。並且,能解析出按鍵的不同狀態,即按下、按住、彈起、為按下這四種狀態,用以實現更豐富的功能。但需注意兩點,
一是定時器的定時時間,不可過長也不可過短,過長容易檢測不到按下,過短會佔用大量時間資源。
二是中斷服務程序需簡單明了,只做檢測用,通過全局變量傳遞,在主循環內完成按鍵響應,中斷服務函數內儘量不要佔用太多時間。
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
免責聲明:內容整理自網絡,版權歸原作者所有,如涉及作品版權問題,請及時與我們聯繫,謝謝!
你和大牛工程師到底差了啥?
加入技術交流群,與高手面對面
添加發燒友小助手入群