單片機(jī) 4*4 矩陣鍵盤(pán)應(yīng)用
圖5-4(4*4矩陣式按鍵的接法)
本文引用地址:http://m.butianyuan.cn/article/201611/321822.htm首先,不斷循環(huán)地給低四位獨(dú)立的低電平,然后判斷鍵盤(pán)中有無(wú)鍵按下。將低位中其中一列線(P1.0~P1.3中其中一列)置低電平然后檢測(cè)行線的狀態(tài)(高4位,即P1.4~P1.7,由于線與關(guān)系,只要與低電平列線接通,即跳變成低電平),只要有一行的電平為低就延時(shí)一段時(shí)間以消除抖動(dòng),然后再次判斷,假如依然為低電平,則表示鍵盤(pán)中真的有鍵被按下而且閉合的鍵位于低電平的4個(gè)按鍵之中任其一,若所有行線均為高電平則表示鍵盤(pán)中無(wú)鍵按下。再其次,判斷閉合鍵所在的具體位置。在確認(rèn)有鍵按下后 ,即可進(jìn)入確定具體閉合鍵的過(guò)程。其方法是: 依次將列線置為低電平,即在置某一根列線為低電平時(shí),其它列線為高電平。同時(shí)再逐行檢測(cè)各行線的電平狀態(tài) ;若某行為低 ,則該行線與置為低電平的列線交叉處的按鍵就是閉合的按鍵。下面圖5-5是4*4矩陣式按鍵接法的軟件算法操作流程。
下面程序按照上述算法流程去編寫(xiě)的,其電路如圖5-6,只是在圖5-5的基礎(chǔ)上多加了P0端口的8只LED燈。從鍵盤(pán)中檢測(cè)到一個(gè)鍵值,然后將這個(gè)值寫(xiě)到LED數(shù)碼管上顯示。
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar temp,num;
uchar code Dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}
//0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,0ff
void delay(uchar ms)
{
int i;
while(ms--)
{
for(i=0;i<100;i++) ;
}
}
uchar keyscan()
{
P1=0xfe;
temp=P1;
while(temp!=0xfe)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
delay(100);
}
P1=0xfd;
temp=P1;
while(temp!=0xfd)
{
temp=P1;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
delay(100);
}
P1=0xfb;
temp=P1;
while(temp!=0xfb)
{
temp=P1;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
delay(100);
}
P1=0xf7;
temp=P1;
while(temp!=0xf7)
{
temp=P1;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
delay(100);
}
return num;
}
void Display(uchar Wei_8,uchar Wei_7,uchar Wei_6,uchar Wei_5,uchar Wei_4,uchar Wei_3,uchar Wei_2,uchar Wei_1)
{
P2=0xfe;
P0=Dis_code[Wei_8];
delay(1);
P2=0xfd;
P0=Dis_code[Wei_7];
delay(1);
P2=0xfb;
P0=Dis_code[Wei_6];
delay(1);
P2=0xf7;
P0=Dis_code[Wei_5];
delay(1);
P2=0xef;
P0=Dis_code[Wei_4];
delay(1);
P2=0xdf;
P0=Dis_code[Wei_3];
delay(1);
P2=0xbf;
P0=Dis_code[Wei_2];
delay(1);
P2=0x7f;
P0=Dis_code[Wei_1];
delay(1);
}
void main()
{
while(1)
{
Display(keyscan(),16,16,16,16,16,16,16)
}
}
評(píng)論