新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 4 x 4 矩陣鍵盤識別實例分析

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; //顯示鍵值高位
}
}


關鍵詞: 4x矩陣鍵盤

評論


技術專區(qū)

關閉