按鍵板的原理和實現--基於GPIO的按鍵板


   上篇介紹簡單的ADC實現,需要IC提供一個額外的ADC。但出於IC成本的考慮,無法提供這個的ADC時,但提供了多個額外的GPIO(General Purpose Input Output:雙向的:可以為輸入/輸出,只有兩個狀態High/Low),就可以使用本篇的實現方法了。

    基於GPIO的按鍵板
    基於GPIO的按鍵板實現,需要提供額外的GPIO口供使用。GPIO口足夠多的話可以一個按鍵對應一個GPIO,不夠多的時候可以使用矩陣掃描方式實現,若可供使用的GPIO連矩陣掃描方式都不滿足,還可以增加二極管來進一步擴展成2個GPIO實現6個按鍵,本節將簡單介紹這些方法。另外還可以通過擴展GPIO的方法來實現,將在下一篇幅中專門介紹。

    嵌入式開發中,GPIO是最常用的控制接口,普通GPIO只具有High/Low兩個狀態,我們可以對其進行Read/Write操作。

   1:足夠多的GPIO供使用
    則每個按鍵對應一個GPIO口,電路設計可以保證:無按鍵動作GPIO口為Low,有按鍵動作GPIO口為High,或者相反。軟件設計只需要逐個掃描每個GPIO口的狀態,就可以知道某個按鍵是否有動作。

    2:有限的GPIO供使用:使用矩陣掃描按鍵方式是最常見的方案。

    其原理如下:任意兩個GPIO之間連接一個按鍵,比如GPIO_1 & GPIO_2,其默認狀態為Low,按鍵按下的話,兩者就連通了,這就意味着,我們可以先給GPIO_1一個High信號,接着去讀取GOIO_2,如果得到High,則這個按鍵被按下了,否則就是沒有按鍵動作。

    數學告訴我們,基於這種方案的N個GPIO口,最多可以實現N*(N-1)/2個按鍵,也就是N的組合數。如下圖:4個GPIO(A/B/C/D)實現6(KEY_1…KEY_6)個按鍵的原理圖

 

      變成也是比較簡單了,給個C代碼如下:

 

    這里通過適當的流程設計,可以使得代碼緊湊有序。在按鍵比較少的情況下,一個挨着一個的去讀寫的方法也不錯,但在較多按鍵的時候,上面代碼的流程設計就比較具有優勢了。能夠在1分鍾內,看明白為什么使用 i*k+k-1 作為返回索引,我相信你的邏輯能力很OK。

    3:進一步擴展---2個GPIO實現6個按鍵

  如果在你的設計中,GPIO口的數量很有限,不能滿足矩陣掃描方式的需要,那么你有兩種選擇:1 擴展GPIO口,下一篇幅中將專門討論;2 增加一些二極管來進一步擴充矩陣掃描方式的能力。我們這里討論一個2個GPIO實現6個按鍵的方法,原理圖如下:

 

 

 

    這種實現方法實際上就是利用了二極管的單向導通特性,使得我們可以區分更多的按鍵,分析如下:

    1:Write GPIO_1=1 & GPIO_2=1,接着Read if GPIO_1==0 & GPIO_2==0,則為 KEY_3;

                                                              if GPIO_1==0 & GPIO_2==1,則為 KEY_1;

                                                              if GPIO_1==1 & GPIO_2==0,則為 KEY_2;

    2:Write GPIO_1=0 & GPIO_2=1, 接着Read  if GPIO_2==0,則為 KEY_4 or KEY_6;

              需要進一步判斷:Write GPIO_1=1 & GPIO_2=0 然后Read:if GPIO_1==0 則為 KEY_4;

                                                                                        if GPIO_1==1 則為 KEY_6;

    3:反序執行步驟2,可以區分出 KEY4 & KEY5。

    明白了原理,軟件編程實現就比較簡單了,給出一個實現如下:

 

 

在這個編程實現里,在寫操作之后,可能需要適當的Delay以使得其狀態穩定;若是基於總線的嵌入式系統,也需要在函數退出前釋放總線。

    3:總結與討論

    基於矩陣掃描方式的按鍵板實現,是很最常用的。在GPIO口比較緊缺的情況下,可以通過在電路中適當增加幾個二極管來解決。如果這樣還不能解決,就必須設法擴展GPIO了,稍后討論。

    下面給出了一個很不錯的 矩陣掃描+二極管擴展 的電路圖,你能為它寫一個驅動嗎?相當具有挑戰性哦,試試看吧……

 

 

原文鏈接:https://blog.csdn.net/nutriyang/article/details/4368050

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM