100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 4x4矩阵键盘扫描c语言程序 4x4矩阵键盘工作原理及扫描程序

4x4矩阵键盘扫描c语言程序 4x4矩阵键盘工作原理及扫描程序

时间:2018-10-28 00:18:38

相关推荐

4x4矩阵键盘扫描c语言程序 4x4矩阵键盘工作原理及扫描程序

矩阵键盘扫描

矩阵键盘的原理图

根据矩阵键盘的原理图可知,当没有按键按下时,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);

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。