4 x 4 矩陣鍵盤識別實例分析 作者: 時間:2016-11-24 來源:網絡 加入技術交流群 掃碼加入和技術大咖面對面交流海量資料庫查詢 收藏 在單片機應用系統中,鍵盤是人機對話不可缺少的組件之一。在按鍵比較少時,我們可以一個單片機I/O口接一個按鍵,但當按鍵需要很多,I/O資源又比較緊張時,使用矩陣式鍵盤無疑是最好的選擇。4 x 4矩陣鍵盤是運用得最多的鍵盤形式,也是單片機入門必需掌握的一種鍵盤識別技術,下面我們就以實例來說明一下4 x 4矩陣鍵盤的識別方法。如下圖所示,我們把按鍵接成矩陣的形式,這樣用8個I/O口就可以對16個按鍵進行識別了,節(jié)省了I/O口資源。我們的識別思路是這樣的,初使化時我們先讓P1口的低四位輸出低電平,高四位輸出高電平,即讓P1口輸出0xF0。掃描鍵盤的時候,我們讀P1口,看P1是否還為0xF0,如果仍為0xF0,則表示沒有按鍵按下;如果不0xF0,我們先等待10ms左右,再讀P1口,再次確認是否為0xF0,這是為了防止是抖動干擾造成錯誤識別,如果不是那就說明是真的有按鍵按下了,我們就可以讀鍵碼來識別到底是哪一個鍵按下了。 以0鍵為例,初使化時P1輸出0xF0,當0鍵按下時,我們讀高四位的狀態(tài)應為1110,即P1為0xE0,然后讓P1輸出0x0F,讀低四位產狀態(tài)應為0111,即P1為0x07,讓兩次讀數相與得0xE7。現在我們在P2口和P3口分別接一個兩共陽極的數碼管,用來顯示我們按下去的鍵的鍵值,P2口接的數據輸出,P30與P31口接的位選。如0鍵按下顯示00,1鍵按下顯示01,15鍵按下顯示15……,實現的仿真電路與程序如下:#include // 頭文件unsigned char num[]={ 0xc0,0xf9,0xa4,0xb0,0x99, //數碼管共陽型 代碼 0x92,0x82,0xf8,0x80,0x90 };unsigned char Mykey=0; //保存當前的按鍵值void delay_nms(unsigned int t) //12M 的晶振大概1MS的延時{unsigned int i,j; for(i=t;i>0;i--) for(j=112;j>0;j--);}void GetKey(void) //掃描按鍵若得到按鍵值存放在 Mykey中{ unsigned char X,Y,Z ; P1=0xf0; if(P1!=0xf0) { delay_nms(10); P1=0xf0; if(P1!=0xf0){ X=P1; //保存第一次的讀到的數 0xe0 P1=0x0f; Y=P1;//保存第二次的讀到的數 0x07 Z=X|Y; //0xe7 P1=0xff ; while(P1!=0XFF);//等放開按鍵 switch(Z) { case 0xe7: Mykey=1;break; case 0xd7: Mykey=2;break; case 0xb7: Mykey=3;break; case 0x77: Mykey=4;break; case 0xeb: Mykey=5;break; case 0xdb: Mykey=6;break; case 0xbb: Mykey=7;break; case 0x7b: Mykey=8;break; case 0xed: Mykey=9;break; case 0xdd: Mykey=10;break; case 0xbd: Mykey=11;break; case 0x7d: Mykey=12;break; case 0xee: Mykey=13;break; case 0xde: Mykey=14;break; case 0xbe: Mykey=15;break; case 0x7e: Mykey=16;break; default : Mykey=0; break; }} }}//主函數void main(){unsigned char m,n ; delay_nms(1); while(1) //不斷循環(huán) { GetKey(); //掃描 鍵盤 m=Mykey/10; //取出鍵值的高位 n=Mykey; //取出鍵值的低位 P3=0X00 ;//數碼管消隱 P2=num[m]; P3=0X01; //顯示鍵值高位 P3=0X00 ; //數碼管消隱 P2=num[n]; P3=0X02; //顯示鍵值高位}}
評論