矩陣鍵盤掃描
矩陣鍵盤的原理圖
根據(jù)矩陣鍵盤的原理圖可知,當(dāng)沒有按鍵按下時(shí),P1=0xf0;然后依次將P1^0~P1^3單獨(dú)置低電平,其他置高,再掃描各列的狀態(tài),來判斷是哪個(gè)按鍵按下,比如,將P1^0輸出低電平,其他的引腳都輸出高電平,即P1=0xfe,那么當(dāng)?shù)?行有按鍵按下時(shí)P1的相應(yīng)值為,
1X1(01111110=0x7e)1X2(10111110=0xbe)1x3(11011110=0xde)1X4(11101110=0xee)
將P1^1輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當(dāng)?shù)?行有按鍵按下時(shí)P1的相應(yīng)值為,
2X1(01111101=0x7d)2X2(10111101=0xbd)2x3(11011101=0xdd)2X4(11101101=0xed)
將P1^2輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當(dāng)?shù)?行有按鍵按下時(shí)P1的相應(yīng)值為,
3X1(01111011=0x7b)3X2(10111011=0xbb)3x3(11011011=0xdb)3X4(11101011=0xeb)
將P1^3輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當(dāng)?shù)?行有按鍵按下時(shí)P1的相應(yīng)值為,
4X1(01110111=0x77)4X2(10110111=0xb7)4x3(11010111=0xd7)4X4(11100111=0xe7)
/*
程序中用到了置位,如果檢測第一行時(shí)置位為0xfe,是為了初始化一下P1口,初始化后
*/
#include《reg52.h》
unsignedintVal;
voidDelay(unsignedintt);
voidmain(void)
{
while(1)
{
if(P1!=0xf0)//當(dāng)沒有按鍵按下時(shí),P0=0xf0;
{
Delay(1500);//去抖
if(P1!=0xf0)//表示按鍵還在按下,判斷是哪個(gè)按鍵
{
P1=0xfe;//置位為fe,檢測第一行11111110
//根據(jù)矩陣鍵盤原理圖,當(dāng)非第一行有按鍵按下時(shí)P1一直保持為0xfe
if(P1!=0xfe)//將P1置為0xfe后,經(jīng)過一個(gè)指令周期后如果它還是0xfe說明按下的鍵不在第一行
{
Val=P1;
Delay(1500);//去抖
while(P1!=0xfe);//等待按鍵彈起
P0=Val;
}
P1=0xfd;//置位為fd,檢測第二行11111101
if(P1!=0xfd)
{
Val=P1;
Delay(1500);
while(P1!=0xfd)
P0=Val;
}
P1=0xfb;//置位為fb,檢測第三行11111011
if(P1!=0xfb)
{
Val=P1;
Delay(1500);
while(P1!=0xfb)
P0=Val;
}
P1=0xf7;//置位為f7,檢測第四行11110111
if(P1!=0xf7)
{
Val=P1;
Delay(1500);
while(P1!=0xf7)
P0=Val;
}
}
}
}
}
voidDelay(unsignedintt)
{
while(--t);
}
4X4矩陣鍵盤掃描
1. 4根行線的GIO均設(shè)為Output,根列線的GIO均設(shè)為Input;
2. 4根行線的GIO分別置為0111、1011、1101、1110,讀逐一讀取列線GIO的值,可確定是哪一個(gè)按鍵;
電路圖如下:
注意:
1. 圖中用作輸入的GIO,一定要有一個(gè)上拉電阻。
2. 芯片中的每一個(gè)引腳是否用作了GPIO口來用,需配置芯片的寄存器,使引腳當(dāng)作GPIO口來使用,才會(huì)有效。
4x4矩陣鍵盤工作原理及程序
矩陣鍵盤的動(dòng)態(tài)掃描確實(shí)略顯復(fù)雜,不可能就是讀一個(gè)端口數(shù)據(jù),然后馬上就出來結(jié)果。這需要對(duì)依次每一行的按鍵進(jìn)行掃描、判斷,然后得出結(jié)果。如上圖所示,先掃描第一行,也就是S1,S2,S3,S4四個(gè)按鍵的狀態(tài)。在PA口輸入0XFE。
0XFE變成二進(jìn)制是11111110,為了方便使用,記得每四個(gè)數(shù)之間加一個(gè)空格。11111110這個(gè)數(shù)據(jù)放到PA口上,假設(shè)這個(gè)時(shí)候S1被按下了,會(huì)出現(xiàn)什么情況?因?yàn)镻A0是低電平,S1被按下之后S1導(dǎo)通,導(dǎo)致PA4的電平從1降到0,于是PA端口的數(shù)據(jù)就變成了11101110,換算成16進(jìn)制就是0XEE。于是我們知道S1被按下了。
假設(shè)是S3被按下,會(huì)出現(xiàn)什么情況?沒錯(cuò),PA6的電平被拉低,PA的端口數(shù)據(jù)變成了10111110,也就是0XBE。這樣,我們就知道了,每一行的每一個(gè)按鍵被按下的時(shí)候,都會(huì)有一個(gè)對(duì)應(yīng)的獨(dú)一無二的值。這就是矩陣鍵盤的掃描原理!送上一段源碼。
voidmatrixkeyscan()
{
uchartemp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;
break;
case0xbe:
key=2;
break;
case0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
break;
case0xdd:
key=5;
break;
case0xbd:
key=6;
break;
case0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
break;
case0xdb:
key=9;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
-
矩陣鍵盤
+關(guān)注
關(guān)注
7文章
206瀏覽量
31454
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論