古詩詞大全網 - 成語故事 - 如何計算按鍵板需要幾個gpio口

如何計算按鍵板需要幾個gpio口

看下完文妳就明白。

本文以循序漸進的思路,引導大家思考如何用最少的IO驅動更多的按鍵,並依次給出5種方案原理圖提供參考。在實際項目中我們經常會遇到有按鍵輸入的需求,但有的時候為了節省資源成本,我們都會選擇在不增加硬件的情況下使用最少的控制器IO驅動更多的按鍵,那麽具體是怎麽做的呢,下面我們就以用5個IO引腳為例,講下怎麽設計可以實現更多的按鍵?***有5種設計思路,下面依次介紹。

思路壹

首先通常想到的可能是下面這樣的設計:

上圖形式的按鍵就是我們通常說的行列式按鍵,它的驅動思路是這樣的:

1.?對IO1、2、3配置為推挽輸出,依次只讓其中壹個輸出為0其他輸出為1。

2.?對IO4、5進行讀操作,根據讀出的結果判斷哪個按鍵按下。

例如:配置IO1、2、3為011,讀IO4、5,若IO4為0則SW14按下,若IO5為0則SW15按下;

依次的配置IO1、2、3為101,讀IO4、5,若IO4為0則SW24按下,若IO5為0則SW25按下;

依次的配置IO1、2、3為110,讀IO4、5,若IO4為0則SW34按下,若IO5為0則SW35按下;

思路二

但是我們在不知道行列式按鍵之前我們肯定是依次將IO口接壹個按鍵到GND或者到VCC,然後去讀IO口去判斷哪個按鍵按下,這也是最簡單的方法,但是很浪費IO口,下面這種就結合了這種簡單方法和行列式的思路,實現了又多增加3個按鍵,如下圖:

這裏我們的思路是先依次讀IO1、2、3的電平來識別S1、2、3,哪個按鍵按下,其後的流程和思路壹是壹樣的,這樣就可以識別11個按鍵了。

思路三

按照掃描的思想,某壹時刻設置壹個IO口為0,其他IO口讀,如果有IO口讀到0,則有對應按鍵按下。比如IO1為0,然後讀到IO5也為0,那麽K15就是按下的。對照這樣的思路,我們可以有下面的設計:

這個電路按鍵識別思路是這樣的:

1.?只配置IO1為0,其他IO讀,若IO5讀到0,則K15按下,若IO4讀到0,則K14按下,依次識別K13,K12;

2.?只配置IO2為0,其他IO讀,若IO5讀到0,則K25按下,若IO4讀到0,則K24按下,依次識別K23;

3.?只配置IO3為0,其他IO讀,若IO5讀到0,則K35按下,若IO4讀到0,則K34按下;

4.?只配置IO4為0,其他IO讀,若IO5讀到0,則K45按下;

思路四

對於思路3我們發現,如果只配置IO5為0,其他IO讀,若IO1讀到0,則K15按下,若IO2讀到0,則K25按下,依次可識別K35和K45。這樣就存在重復,那麽有麽有好的方法,解決這樣的重復呢?我們發現,若配置IO1為0,K15按下,電流流向IO1的,若配置IO5為0,同樣K15按下,電流是流向IO5的。這樣我們就可以通過區分電流的流向來避免重復。於是就有了下圖的設計:

這樣就可以避免重復,IO5為0時,按K15,IO1是讀不到0的。那麽怎樣設計,IO5為0時對應壹個按鍵按下IO1為0呢?如是就有人想到下面的設計:

這個電路按鍵識別思路是這樣的:

1.?只配置IO1為0,其他IO讀,若IO5讀到0,則K51按下,若IO4讀到0,則K41按下,依次識別K31,K21;

2.?只配置IO2為0,其他IO讀,若IO5讀到0,則K52按下,若IO4讀到0,則K42按下,依次識別K32,K21';

3.?只配置IO3為0,其他IO讀,若IO5讀到0,則K53按下,若IO4讀到0,則K43按下,依次識別K32’,K31';

4.?只配置IO4為0,其他IO讀,若IO5讀到0,則K54按下,若IO4讀到0,則K43’按下,依次識別K42’,K41';

5.?只配置IO5為0,其他IO讀,若IO4讀到0,則K54’按下,若IO3讀到0,則K53’按下,依次識別K52’,K51'。

思路五

很多人可能認為思路四已經識別20個按鍵了,但是真的就沒有其他方法了嗎?不要忘了,我們還沒有將思路二妳介紹的那種最簡單的方法結合進去,於是又可以多5個按鍵,如下圖:

這樣我們可以先識別K01、K02、K03、K04、K05,若沒有按鍵按下然後再和思路四的設計壹樣去識別其他按鍵。但這樣存在壹個問題,如果IO1配置為0,IO5讀到0,那麽怎麽知道是K51按下還是K05按下呢,這裏只需要在程序裏做下判斷,先判斷下是不是K05按下,若不是就是K51,因為按鍵K01、K02、K03、K04、K05在5個IO口都為讀取的情況下,就可以識別,不需要掃描識別處理,相當於這5個按鍵優先級高與其他按鍵。

總結

綜合上述,5個IO口最多可以識別25個按鍵,思路五程序上處理比較麻煩,若實際中只按思路四設計,也可識別20個按鍵,那麽如果有N個IO口可識別多少按鍵呢?這裏給出如下公式:

假設有N個IO口按照思路三可以識別N*(N-1)/2個;

按照思路四可識別N*(N-1)個;

按照思路5可以識別N*(N-1)+N個。

最後再說下,如果實際設計時,還是按思路四設計好,軟件也沒那麽麻煩。如果是妳的話妳會選擇哪種方法呢?妳還有沒有其他的設計方法呢?