物聯網智慧型網關 05 掃瞄鍵盤程式設計設計

2021-08-27 02:14:43 字數 3080 閱讀 5943

.net micro framework模擬器提供了5個模擬按鍵(上、下、左、右和確認按鍵),所以一般.net mf開發板也只需要提供5個按鍵就可以了,而這5個鍵,也是直接和cpu的pin腳相連,用gpio的輸入相關的函式就可以操作了,使用非常簡單。

但是對一些特殊的應用,如一些.net micro framework教育箱或一些工業實際用的系統,5個按鍵顯然太少了點。但是如果需要十幾個按鍵,如果直連晶元pin腳,顯然占用的資源比較多了,也會導致其它的功能無法使用了,這時候最常用的就是掃瞄鍵盤了。

上述掃瞄鍵盤的原理圖應該是最簡單的一種了,複雜一點的,在行或列上,通過乙個上拉電阻接vcc。這樣,我們只需要8個pin腳,就可以獲取16個按鍵的資訊了。

一般實現的思路也比較簡單:就是把行(或列)接晶元輸出pin腳,把列(或行)接晶元輸入pin腳,輸出pin腳依次輸出低(或高,需要看電路中接的上拉還是下拉電阻)電平,然後檢查輸入pin腳的電平變化。如果有變化,那麼就說明,該列和該行的按鍵被按下了。

往往這個判斷就放在while迴圈或執行緒裡,不斷的去執行。對一些單片而言,如果實現的功能單一,這樣做也無可厚非,但是對乙個系統平台來說,如果也這樣做,顯然對系統的資源占用還是比較厲害的。

所以最好的辦法還是要採用中斷的方式,平時的時候不去判斷,靠中斷觸發,一旦中斷觸發了,然後再啟動一輪判斷,確定是哪乙個按鍵被按下了。

1、掃瞄方式實現按鍵獲取

public

class

scankeypad ;

cols = new

inputport ;

threadthreadkeypad = new

thread(new

threadstart(keypadscan));

threadkeypad.start();

}voidkeypadscan()

}rows[i].write(true);

if(key > -1) break;

}if(key > -1 && key != oldkey)

else

if (oldkey > -1 && key == -1)

thread.sleep(100);}}

}2、中斷方式實現按鍵獲取

public

class

interruptkeypad ;

cols = new

interruptport[input_pins.length];

pins = input_pins;

for(int i = 0; i < input_pins.length; i++)

}private

uint getpinindex(uintpin)

return0;

}voidinterruptkeypad_oninterrupt(uint data1, uint data2, datetimetime)

//--

uintcol = getpinindex(data1);

for(int i = 0; i < rows.length; i++)

}//--

for(int i = 0; i < rows.length; i++)rows[i].write(false);

for(int i = 0; i < cols.length; i++)}}

voidkeypadrun()

}問題點1:由於我們採用的鍵盤並沒有加上拉(或下拉)電阻電路,在最初做這個程式的時候,inputport(input_pins[1], true,port.resistormode.pullup),最後乙個引數,底層並沒有實現內部上拉,下拉和懸空功能,所以設定是無效的。這就造成了,在按鈕沒有按下時,輸入pin腳的狀態是未知的,有時候是1,有時候是0,程式是無法正確執行的。

此外stm32f103和stm32f207的gpio暫存器差別很大,內部實現上拉、下拉的設定也是不同的。分別實現後,發現內部上拉正常,設定下拉效果不明顯,pin腳的狀態還是未知的。所以我們實現的程式都設定為上拉。

問題點2:在實現中斷方式的掃瞄鍵盤的**的時候,發現pb6、pc0和pb1三個pin腳觸發中斷異常,但是在nativesample層面又正常。目前沒有發現這三個pin腳有何特別之處,此問題以後待查。所以如果採用中斷方式,這三個pin腳不能使用。

注:該問題已修正,需要更新韌體(版本v1.6.10以上),另外示例需要參考最新的掃瞄鍵盤示例。

以上兩種方式都是在應用層面實現的,其實如果掃瞄鍵盤的pin腳固定,更好的方式可以在底層用c++實現,並且還可以把8個物理pin腳,虛擬出16個pin腳來,用法和物理的pin腳完全一樣。

public

sealed

class

gpiobuttoninputprovider );

dispatcher = dispatcher.currentdispatcher;

cpu.pin output_pins = ;

cpu.pin input_pins = ;

interruptkeypadkey = new

interruptkeypad(output_pins,input_pins);

key.oninterrupt += new

nativeeventhandler(key_oninterrupt);

}voidkey_oninterrupt(uint data1, uint data2, datetimetime)

buttongetbutton(uint data)

return

button.none;} }

把gpiobuttoninputprovider.cs裡面的程式這樣修改後,就可以使用了。

效果圖如下:

mf簡介: mf

資料:

邊緣計算閘道器 工業物聯網智慧型網關

工廠裡的每一台裝置都在產生資料。從裝置資料的視點,能夠從海量資料的背面發掘和剖析裝置非預期停機的原因 進步成品率的途徑等,找出更好的裝置維護方法,從而進步工廠的全體出產功率。邊緣計算閘道器是處理大資料而生的,同時把資料結果傳入雲端 這是大資料在工業領域的價值地點。然後裝置資料的收集 傳輸和監控成為關...

智慧型燈桿閘道器 物聯網黑科技

智慧型燈桿行業專用設計,實現杆載裝置接入自由。計訊物聯tg473二代智慧型燈桿專用閘道器採用航天接頭設計,具有超強防水效能,預留多功能介面,可接入更多感測器和杆載裝置。實現遠端聯動控制 協議轉換 聯接上雲 邊緣計算 供電輸出 集控管理等。航天介面,整合化設計,即插即用,安全便捷。支援5g 4g網路 ...

農業溫室大棚智慧型監控 物聯網智慧型網關應用

農業溫室大棚能透光 保溫,在不適宜植物生長的季節,能提供溫室生育期和增加產量,多用於低溫季節喜溫蔬菜 花卉 林木等植物栽培或育苗等。計訊物聯農業溫室大棚智慧型監控採用感測器技術 無線通訊技術,依託傳統溫室大棚生產工藝實現農業溫室的精準監測 科學種植 合理灌溉,具備高可靠性 安全性 可擴充套件性。物聯...