1
电子说
矩阵键盘的原理图
根据矩阵键盘的原理图可知,当没有按键按下时,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);
}
1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;
2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;
电路图如下:
注意:
1. 图中用作输入的GIO,一定要有一个上拉电阻。
2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效。
矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是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);
}
}
}
全部0条评论
快来发表一下你的评论吧 !