介紹簡(jiǎn)單的ADC實(shí)現(xiàn),需要IC提供一個(gè)額外的ADC。但出于IC成本的考慮,無(wú)法提供這個(gè)的ADC時(shí),但提供了多個(gè)額外的GPIO(General Purpose Input Output:雙向的:可以為輸入/輸出,只有兩個(gè)狀態(tài)High/Low),就可以使用本篇的實(shí)現(xiàn)方法了。
基于GPIO的按鍵板
基于GPIO的按鍵板實(shí)現(xiàn),需要提供額外的GPIO口供使用。GPIO口足夠多的話可以一個(gè)按鍵對(duì)應(yīng)一個(gè)GPIO,不夠多的時(shí)候可以使用矩陣掃描方式實(shí)現(xiàn),若可供使用的GPIO連矩陣掃描方式都不滿足,還可以增加二極管來(lái)進(jìn)一步擴(kuò)展成2個(gè)GPIO實(shí)現(xiàn)6個(gè)按鍵,本節(jié)將簡(jiǎn)單介紹這些方法。另外還可以通過(guò)擴(kuò)展GPIO的方法來(lái)實(shí)現(xiàn),將在下一篇幅中專門(mén)介紹。
嵌入式開(kāi)發(fā)中,GPIO是最常用的控制接口,普通GPIO只具有High/Low兩個(gè)狀態(tài),我們可以對(duì)其進(jìn)行Read/Write操作。
1:足夠多的GPIO供使用
則每個(gè)按鍵對(duì)應(yīng)一個(gè)GPIO口,電路設(shè)計(jì)可以保證:無(wú)按鍵動(dòng)作GPIO口為L(zhǎng)ow,有按鍵動(dòng)作GPIO口為High,或者相反。軟件設(shè)計(jì)只需要逐個(gè)掃描每個(gè)GPIO口的狀態(tài),就可以知道某個(gè)按鍵是否有動(dòng)作。
2:有限的GPIO供使用:使用矩陣掃描按鍵方式是最常見(jiàn)的方案。
其原理如下:任意兩個(gè)GPIO之間連接一個(gè)按鍵,比如GPIO_1 & GPIO_2,其默認(rèn)狀態(tài)為L(zhǎng)ow,按鍵按下的話,兩者就連通了,這就意味著,我們可以先給GPIO_1一個(gè)High信號(hào),接著去讀取GOIO_2,如果得到High,則這個(gè)按鍵被按下了,否則就是沒(méi)有按鍵動(dòng)作。
數(shù)學(xué)告訴我們,基于這種方案的N個(gè)GPIO口,最多可以實(shí)現(xiàn)N*(N-1)/2個(gè)按鍵,也就是N的組合數(shù)。如下圖:4個(gè)GPIO(A/B/C/D)實(shí)現(xiàn)6(KEY_1…KEY_6)個(gè)按鍵的原理圖
變成也是比較簡(jiǎn)單了,給個(gè)C代碼如下:
這里通過(guò)適當(dāng)?shù)牧鞒淘O(shè)計(jì),可以使得代碼緊湊有序。在按鍵比較少的情況下,一個(gè)挨著一個(gè)的去讀寫(xiě)的方法也不錯(cuò),但在較多按鍵的時(shí)候,上面代碼的流程設(shè)計(jì)就比較具有優(yōu)勢(shì)了。能夠在1分鐘內(nèi),看明白為什么使用 i*k+k-1 作為返回索引,我相信你的邏輯能力很OK。
3:進(jìn)一步擴(kuò)展---2個(gè)GPIO實(shí)現(xiàn)6個(gè)按鍵
如果在你的設(shè)計(jì)中,GPIO口的數(shù)量很有限,不能滿足矩陣掃描方式的需要,那么你有兩種選擇:1 擴(kuò)展GPIO口,下一篇幅中將專門(mén)討論;2 增加一些二極管來(lái)進(jìn)一步擴(kuò)充矩陣掃描方式的能力。我們這里討論一個(gè)2個(gè)GPIO實(shí)現(xiàn)6個(gè)按鍵的方法,原理圖如下:
這種實(shí)現(xiàn)方法實(shí)際上就是利用了二極管的單向?qū)ㄌ匦?,使得我們可以區(qū)分更多的按鍵,分析如下:
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;
需要進(jìn)一步判斷:Write GPIO_1=1 & GPIO_2=0 然后Read:if GPIO_1==0 則為 KEY_4;
if GPIO_1==1 則為 KEY_6;
3:反序執(zhí)行步驟2,可以區(qū)分出 KEY4 & KEY5。
明白了原理,軟件編程實(shí)現(xiàn)就比較簡(jiǎn)單了,給出一個(gè)實(shí)現(xiàn)如下:
在這個(gè)編程實(shí)現(xiàn)里,在寫(xiě)操作之后,可能需要適當(dāng)?shù)腄elay以使得其狀態(tài)穩(wěn)定;若是基于總線的嵌入式系統(tǒng),也需要在函數(shù)退出前釋放總線。
3:總結(jié)與討論
基于矩陣掃描方式的按鍵板實(shí)現(xiàn),是很最常用的。在GPIO口比較緊缺的情況下,可以通過(guò)在電路中適當(dāng)增加幾個(gè)二極管來(lái)解決。如果這樣還不能解決,就必須設(shè)法擴(kuò)展GPIO了,稍后討論。
下面給出了一個(gè)很不錯(cuò)的 矩陣掃描+二極管擴(kuò)展 的電路圖,你能為它寫(xiě)一個(gè)驅(qū)動(dòng)嗎?相當(dāng)具有挑戰(zhàn)性哦,試試看吧……
編輯:hfy
-
矩陣
+關(guān)注
關(guān)注
0文章
422瀏覽量
34504 -
軟件編程
+關(guān)注
關(guān)注
1文章
41瀏覽量
11286 -
GPIO
+關(guān)注
關(guān)注
16文章
1196瀏覽量
51934
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論