?

四個矩陣按鍵開關單片機檢測程序及其應用特點的分析

2021-06-30 01:43長沙市電子工業學校劉國云
電子世界 2021年11期
關鍵詞:鍵值電平按鍵

長沙市電子工業學校 劉國云

相對于獨立按鍵,矩陣按鍵開關具有占用單片機端口資源少的優點,也有其教學難的缺點。有多種方法實現矩陣按鍵開關檢測功能,作為經驗交流,筆者介紹了四個不同的矩陣按鍵開關檢測程序,并分析了它們的檢測方法和應用特點,與職教同行共同開拓編程思路、提高編程能力和教學能力。

按鍵是單片機控制的重要的指令開關,相對于獨立按鍵,矩陣按鍵開關具有占用單片機端口少的資源優勢,同時也給使用者帶來了難學、難記、難寫、檢測程序復雜的缺點。我在此介紹用四種不同方法編寫的4×4矩陣開關檢測程序,并對程序和它們優缺點進行分析,以加深大家對矩陣開關檢測原理和編程方法的理解,開拓編程思路,掌握多個可以在不同場合應用的矩陣開關檢測程序,以提高大家程序分析能力、編程能力和教學能力。

1 用switch-case語句編寫矩陣按鍵開關檢測程序

圖1所示程序用P3總線控制方式和switch-case語句,對4*4矩陣按鍵開關進行檢測,P3.4-P3.7和P3.3-P3.0分別為行線h0-h3和列線l0-l3的控制端口。其編程思路是用P3總線賦值方式,依次將4根行線電平拉低,每拉低一根行線電平,就依次對4根列線上的按鍵進行檢,如果哪根列線被檢測到低電平,就表示該行該列上的按鍵按下?,F以拉低第一行電平、依次檢測4列電平為例,來講解該程序是如何使用switch-case語句捕捉到按鍵和獲得鍵值的。

圖1 switch-case語句矩陣按鍵開關檢測程序

首先讓P3=0xff,排除干擾電平,然后迅速讓P3=0xef,拉低接在P3.4上的第一條行線h0的電平,并讓局部變量i=P3=0xef,接著i與0xf0逐位與(i=0xe0&0xf0=0xe0!=0xf0),執行if(i!=0xf0)條件語句,程序指針指向由switch-case語句組成的4條列線檢測程序。

因為按鍵按下會改變P3值,條件語句中i=P3的i值也會改變,通過switch(i){case 0xe7:jianzhi=1;break;case 0xeb:jianzhi=2;break;case 0xe7:jianzhi=1;break;case 0xeb:jianzhi=2;break;}來檢測列線電平,捕獲按下的按鍵開關和獲取鍵值。

至于while(i!=0xf0){xianshi();xianshi();xianshi();xianshi();

xianshi();i=0xf0;}的作用是通過調用顯示子程序起到延時作用,給按鍵提供釋放時間,最后讓i=0xf0,退出while循環。

該矩陣開關檢測程序的特點是:端口8位總線控制,控制端口選用靈活性不強;程序代碼多。

2 用數組檢測碼編寫矩陣開關檢測程序(圖2)

圖2 用數組檢測碼編寫的矩陣按鍵開關檢測程序

該檢測程序的特點也是端口8位總線控制,檢測端口選用不靈活,但程序代碼少了很多。它的編程思路是:定義了拉低行線電平的數組hl3[4]、依次檢測4條列線電平的二維數組hl1[4][4]及保存鍵值的二維數組hl2[4][4]。然后用兩個嵌套的for循環語句實現按鍵檢測,4次外循環是依次拉低4根行線電平(P3=0xff;P3=hl3[i];)。內循環是依次檢測4根列線,如果檢測到P3值等于檢測碼,就捕獲按鍵,獲取鍵值(if(P3==hl1[i][j])jianzhi=hl2[i][j];)。

語句while(P3==hl1[i][j]);是用來等待按鍵釋放。

3 用循環移動功能函數編寫矩陣按鍵開關檢測程序(圖3)

圖3 用循環功能函數編寫的矩陣開關檢測程序

該檢測程序的最大優點是代碼少。它定義了一個鍵值二維數組ka[4][4],也用兩級嵌套的for循環分別拉低行線電平和依次檢測列線電平。這個程序比圖2中用數組檢測檢測碼編寫的矩陣開關檢測程序代碼更少的原因就是利用了功能循環函數_crol_()來拉低行線電平和檢測列線電平。

外循環的P3=_crol_(0xef,i),通過將0xef左移1、2、3、4位來實現拉低行線電平的。內循環的列線檢測和獲取鍵值是通過if((P3&__cror_(0x08,j))==0)jianzhi=ka[i][j]實現的。

4 用位控制指令編寫矩陣按鍵開關檢測程序

上面3個矩陣按鍵開關檢測程序中的第三個程序最簡單,第一個程序最復雜,但它們都有一個共同特點:采用8位總線控制方式,所以單片機檢測端口選擇的靈活性不強?,F在介紹一個程序代碼不是最少,但檢測方法最直觀、編程思路最清晰、端口選用最靈活,如圖4所示的用位控制指令編寫的矩陣按鍵開關檢測程序。

圖4 位控制指令矩陣按鍵開關檢測程序

該程序的編程思路是:先聲明4行和4列位控信號h0-h3和l0-l3(sbit h0=P3^4;sbit h1=P3^5;sbit h2=P3^6;sbit h3=P3^7;sbit l0=P3^0;sbit l1=P3^1;sbit l2=P3^2;sbit l3=P3^3;),然后在矩陣開按鍵關檢測程序jzjc()中,首先讓所有行列信號置1,去除干擾信號,再逐行拉低一行電平,用if-else if-else if-if語句逐列檢測,并取出所檢測到的鍵值k。

還有一個需要特別提醒的是:該矩陣按鍵開關檢測程序不是空函數,而是帶返回值k的子程序。

圖4所示的矩陣按鍵開關檢測程序由于是用位控指令來編寫的,相較前面3個總線控制的矩陣按鍵開關檢測程序,它的最大優點就是檢測端口的選用非常靈活,美中不足就是程序代碼比稍多點,有意使用該程序的話,可以用圖5的形式來簡化。

圖5 圖4程序的簡化程序

結語:作為中職教師,在講解同一個任務的控制程序時,應該具有多種解決方案,以方便學生在不同的應用場合使用,培養他們的開放思維能力和創新應用能力。筆者通過介紹四種不同矩陣按鍵開關檢測程序,希望能與同行分享不同的編程方法,開闊編程視野,共同提高編程能力和教學能力。

猜你喜歡
鍵值電平按鍵
基于有限狀態機的按鍵檢測程序設計
非請勿進 為注冊表的重要鍵值上把“鎖”
一鍵直達 Windows 10注冊表編輯高招
一種多方向導光按鍵結構設計
NPC五電平Z源逆變器的設計研究
基于三電平光伏并網逆變器控制系統的研究與實踐
基于NPC三電平變換器的STATCOM研究
一種多電平逆變器及其并網策略
基于有限狀態機的STM32系統按鍵識別方法
解析某型號手機按鍵檢測程序的缺陷
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合