矩陣鍵盤掃描

矩陣鍵盤的原理圖
根據矩陣鍵盤的原理圖可知,當沒有按鍵按下時,P1=0xf0;然后依次將P1^0~P1^3單獨置低電平,其他置高,再掃描各列的狀態,來判斷是哪個按鍵按下,比如,將P1^0輸出低電平,其他的引腳都輸出高電平,即P1=0xfe,那么當第1行有按鍵按下時P1的相應值為,
1X1(01111110=0x7e)1X2(10111110=0xbe)1x3(11011110=0xde)1X4(11101110=0xee)
將P1^1輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
2X1(01111101=0x7d)2X2(10111101=0xbd)2x3(11011101=0xdd)2X4(11101101=0xed)
將P1^2輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
3X1(01111011=0x7b)3X2(10111011=0xbb)3x3(11011011=0xdb)3X4(11101011=0xeb)
將P1^3輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
4X1(01110111=0x77)4X2(10110111=0xb7)4x3(11010111=0xd7)4X4(11100111=0xe7)
/*
程序中用到了置位,如果檢測第一行時置位為0xfe,是為了初始化一下P1口,初始化后
*/
#include《reg52.h》
unsignedintVal;
voidDelay(unsignedintt);
voidmain(void)
{
while(1)
{
if(P1!=0xf0)//當沒有按鍵按下時,P0=0xf0;
{
Delay(1500);//去抖
if(P1!=0xf0)//表示按鍵還在按下,判斷是哪個按鍵
{
P1=0xfe;//置位為fe,檢測第一行11111110
//根據矩陣鍵盤原理圖,當非第一行有按鍵按下時P1一直保持為0xfe
if(P1!=0xfe)//將P1置為0xfe后,經過一個指令周期后如果它還是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均設為Output,根列線的GIO均設為Input;
2. 4根行線的GIO分別置為0111、1011、1101、1110,讀逐一讀取列線GIO的值,可確定是哪一個按鍵;
電路圖如下:
注意:
1. 圖中用作輸入的GIO,一定要有一個上拉電阻。
2. 芯片中的每一個引腳是否用作了GPIO口來用,需配置芯片的寄存器,使引腳當作GPIO口來使用,才會有效。
4x4矩陣鍵盤工作原理及程序

矩陣鍵盤的動態掃描確實略顯復雜,不可能就是讀一個端口數據,然后馬上就出來結果。這需要對依次每一行的按鍵進行掃描、判斷,然后得出結果。如上圖所示,先掃描第一行,也就是S1,S2,S3,S4四個按鍵的狀態。在PA口輸入0XFE。
0XFE變成二進制是11111110,為了方便使用,記得每四個數之間加一個空格。11111110這個數據放到PA口上,假設這個時候S1被按下了,會出現什么情況?因為PA0是低電平,S1被按下之后S1導通,導致PA4的電平從1降到0,于是PA端口的數據就變成了11101110,換算成16進制就是0XEE。于是我們知道S1被按下了。
假設是S3被按下,會出現什么情況?沒錯,PA6的電平被拉低,PA的端口數據變成了10111110,也就是0XBE。這樣,我們就知道了,每一行的每一個按鍵被按下的時候,都會有一個對應的獨一無二的值。這就是矩陣鍵盤的掃描原理!送上一段源碼。
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);
}
}
}
-
矩陣鍵盤
+關注
關注
7文章
207瀏覽量
31986
發布評論請先 登錄
使用單片機實現數碼管顯示4X4鍵盤矩陣按鍵的程序和仿真資料免費下載

使用單片機實現4X4鍵盤矩陣控制條形LED顯示的程序和仿真資料免費下載

4x4矩陣鍵盤工作原理及掃描程序

評論