新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 4 x 4 矩陣鍵盤識(shí)別實(shí)例分析

4 x 4 矩陣鍵盤識(shí)別實(shí)例分析

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
單片機(jī)應(yīng)用系統(tǒng)中,鍵盤是人機(jī)對(duì)話不可缺少的組件之一。在按鍵比較少時(shí),我們可以一個(gè)單片機(jī)I/O口接一個(gè)按鍵,但當(dāng)按鍵需要很多,I/O資源又比較緊張時(shí),使用矩陣式鍵盤無疑是最好的選擇。
4 x 4矩陣鍵盤是運(yùn)用得最多的鍵盤形式,也是單片機(jī)入門必需掌握的一種鍵盤識(shí)別技術(shù),下面我們就以實(shí)例來說明一下4 x 4矩陣鍵盤的識(shí)別方法。如下圖所示,我們把按鍵接成矩陣的形式,這樣用8個(gè)I/O口就可以對(duì)16個(gè)按鍵進(jìn)行識(shí)別了,節(jié)省了I/O口資源。

我們的識(shí)別思路是這樣的,初使化時(shí)我們先讓P1口的低四位輸出低電平,高四位輸出高電平,即讓P1口輸出0xF0。掃描鍵盤的時(shí)候,我們讀P1口,看P1是否還為0xF0,如果仍為0xF0,則表示沒有按鍵按下;如果不0xF0,我們先等待10ms左右,再讀P1口,再次確認(rèn)是否為0xF0,這是為了防止是抖動(dòng)干擾造成錯(cuò)誤識(shí)別,如果不是那就說明是真的有按鍵按下了,我們就可以讀鍵碼來識(shí)別到底是哪一個(gè)鍵按下了。
以0鍵為例,初使化時(shí)P1輸出0xF0,當(dāng)0鍵按下時(shí),我們讀高四位的狀態(tài)應(yīng)為1110,即P1為0xE0,然后讓P1輸出0x0F,讀低四位產(chǎn)狀態(tài)應(yīng)為0111,即P1為0x07,讓兩次讀數(shù)相與得0xE7。
現(xiàn)在我們?cè)赑2口和P3口分別接一個(gè)兩共陽極的數(shù)碼管,用來顯示我們按下去的鍵的鍵值,P2口接的數(shù)據(jù)輸出,P30與P31口接的位選。如0鍵按下顯示00,1鍵按下顯示01,15鍵按下顯示15……,實(shí)現(xiàn)的仿真電路與程序如下:




#include // 頭文件
unsigned char num[]={ 0xc0,0xf9,0xa4,0xb0,0x99, //數(shù)碼管共陽型 代碼
0x92,0x82,0xf8,0x80,0x90
};
unsigned char Mykey=0; //保存當(dāng)前的按鍵值
void delay_nms(unsigned int t) //12M 的晶振大概1MS的延時(shí)
{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; //保存第一次的讀到的數(shù) 0xe0
P1=0x0f;
Y=P1;//保存第二次的讀到的數(shù) 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;
}

}
}
}
//主函數(shù)
void main()
{
unsigned char m,n ;
delay_nms(1);
while(1) //不斷循環(huán)
{
GetKey(); //掃描 鍵盤
m=Mykey/10; //取出鍵值的高位
n=Mykey; //取出鍵值的低位
P3=0X00 ;//數(shù)碼管消隱
P2=num[m]; P3=0X01; //顯示鍵值高位
P3=0X00 ; //數(shù)碼管消隱
P2=num[n]; P3=0X02; //顯示鍵值高位
}
}


關(guān)鍵詞: 4x矩陣鍵盤

評(píng)論


技術(shù)專區(qū)

關(guān)閉