4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键
按鍵是一種常開型按鈕開關,與單片機的常見接法如圖所示。按鍵未按下時兩個觸點斷開,單片機I/O口輸入高電平;當按鍵閉合時,I/O口輸入低電平。
一、按鍵講解
當I/O口為P0口時,由于沒有內部上拉電阻,所以必須外接上拉電阻,當I/O口為P1、P2和P3口時,由于內部已有上拉電阻,因此可省略外接的上拉電阻。
二、按鍵消抖
單片機系統中所使用的鍵盤都是機械式的彈性按鍵,因為存在機械觸點的彈性作用,在按鍵閉合和彈起的瞬間都會出現抖動,如圖所示。按鍵抖動一般會持續5~10ms,為使一次按鍵僅被處理一次,必須消除按鍵抖動。消除按鍵抖動可以采用軟件消抖或硬件消抖。
軟件消抖指在檢測到有按鍵閉合時,延時一小段時間之后再次檢測,如果仍然檢測到按鍵閉合,則認為按鍵真正閉合。
硬件消抖方法
1.R-S觸發器
一旦有鍵按下,觸發器立即反轉,觸點的抖動便不會再對輸出產生影響,按鍵釋放時也一樣。
2.電容濾波
將電容并聯在按鍵的兩端,利用電容放電的延時特性,將產生抖動的電平通過電容吸收掉,從而達到消抖的作用;
三、獨立按鍵
獨立鍵盤指每個按鍵都占據一個獨立的引腳。
四、矩陣按鍵
同一行上的所有按鍵都連接到一個引腳,同一列上的所有按鍵都連接到一個引腳。
(1)列掃描方式所有行線都輸出高電平,列線依次輸出低電平;查詢該列上行的值,若為0,則說明該行上的按鍵被按下;若該列上所有行的值都為1,則進行下一列行值的查詢;循環往復。
(2)反轉法所有行線都輸出0,查詢列線上的值,若某列線上的值為0,則說明該列線上的按鍵被按下;然后所有列線都輸出0,查詢行線上的值,若某行線上的值為0,則說明該行線上的按鍵被按下;從而確定某行某列的按鍵被按下。
五、程序舉例
#include #define uint unsigned int#define uchar unsigned charuint key,key_num;//鍵盤掃描值,鍵盤鍵值/********************************************************************///函數名:delay_1ms(uint x)//功能:利用定時器0精確定時1ms;自加 time_t的值為后面時間調整函數服務//調用函數://輸入參數:x,1ms計數//輸出參數://說明:延時的時間為1ms乘以x/********************************************************************/void delay_1ms(uint x){ TMOD=0X01;//開定時器0,工作方式為1 TR0=1;//啟動定時器0; while(x--) { TH0=0Xfc;//定時1ms初值的高8位裝入TH0 TL0=0X18;//定時1ms初值的低8位裝入TL0 while(!TF0);//等待,直到TF0為1 TF0=0; } TR0=0;//停止定時器0;} /**********************************************************///函數名:keyscan()//功能:得出4x4鍵盤的行列掃描值//調用函數:delay_1ms(uint x)//輸入參數://輸出參數://說明:通過P1口的掃描得出掃描值key,無鍵按下key為16/**********************************************************/uchar keyscan(){ uchar code_h; //行掃描值 uchar code_l; //列掃描值 P1=0XF0; //P1.0-P1.3全為0,(行狀態全為低電平) if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全為1,可能有鍵按下(為準確識別按鍵動作) { delay_1ms(5); //廷時去抖動,為準確識別按鍵動作 if((P1&0xF0)!=0XF0)//重讀高4位(列狀態),若還是不全為1,定有鍵按下 { code_h=0xfe; //開始行掃描 (0xfe:11111110) while((code_h&0x10)!=0x00)//判斷是否掃描四行(X0~X3)完畢,若不是,繼續掃描(0x10:00010000) { P1=code_h; //第1次P1.0置為0,其余高電平;第2次P1.1置為0,其余高電平 ;第3次P1.2置為0,其余高電平;第4次P1.3置為0,其余高電平 if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全為1,該行有鍵按下(0xF0:11110000) { code_l=(P1&0xF0|0x0F);//保留P1口高4位,低4位變為1,作為列值 return((~code_h)+(~code_l));//鍵盤編碼=行掃描值+列掃描值 (取反后用,相當于改為按下按鍵對應的行、列標識為1,其它為0) } else //左移后補0,但是我們需要將其他位置1,所以+1 code_h=(code_h<<1)|0x01; //若該行無鍵按下,行掃描值左移+1,掃描下一行 } } } return(16); //無鍵按下,返回16 } /**********************************************************///函數名:keynum()//功能:得出4x4按鍵的鍵值//調用函數:keyscan()//輸入參數://輸出參數://說明:通過key的值確定按鍵鍵值/**********************************************************/void keynum(){ uchar i,j; uchar code tab[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; //4x4鍵盤各鍵值標注 key=16; key = keyscan();//引入key值 if((key&0x01)!=0) i=0; //判斷出按下按鍵的行列號 (即找出低電平的行、列) if((key&0x02)!=0) i=1; if((key&0x04)!=0) i=2; if((key&0x08)!=0) i=3; if((key&0x10)!=0) j=0; if((key&0x20)!=0) j=1; if((key&0x40)!=0) j=2; if((key&0x80)!=0) j=3; if(key!=16) { key_num = tab[i][j];//通過比較得出4x4鍵盤的鍵值 } } void main(){ uint shi,ge; shi = 0; ge = 0; P2 = 0x16;//初始值 為16 while(1) { keynum(); //獲取到鍵值 if(key!=16) { shi = key_num/10;//獲得十位 ge = key_num%10;//獲得個位 if(shi) { P2 = 0x10|ge; } else { P2 = ge; } } delay_1ms(10);//延時 }}往期回顧
01 |ESP8266模塊詳解 |
02 |DA轉換器是什么?快來一起學習一下吧! |
03 |STM32中斷優先級詳解 |
04 |STM32下載程序新思路--使用串口下載程序 |
總結
以上是生活随笔為你收集整理的4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在html中 正确的嵌套方式是( ).,
- 下一篇: gitee如何搭建mysql_Windo