61阅读

矩阵键盘扫描程序-单片机4*4矩阵键盘扫描程序

发布时间:2017-11-17 所属栏目:矩阵键盘扫描程序

一 : 单片机4*4矩阵键盘扫描程序

共阳极 键盘接P3口

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,num,m;
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uchar z);
void disply();
void keytwo();
void keyone();
void keythree();
void keyfour();
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void main()
{
while(1)
{
for(m=0;m<4;m++)
{
if(m==0)
keyone();
if(m==1)
keytwo();
if(m==2)
keythree();
if(m==3)
keyfour();
}
}
}
void delay(uchar z)
{
uchar a,b;
for(a=z;a>0;a--)
for(b=110;b>0;b--);
}
void disply()
{
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[num-1];
dula=0;
delay(5);
}
void keyone()
{
P3=0xfe;
temp=P3;
if(temp!=0xfe)
{
switch(temp)
{
case0xee:num=1;break;
case0xde:num=2;break;
case0xbe:num=3;break;
case0x7e:num=4;break;
}
disply();
delay(5);
}
}
void keytwo()
{
P3=0xfd;
temp=P3;
if(temp!=0xfd)
{
switch(temp)
{
case0xed:num=5;break;
case0xdd:num=6;break;
case0xbd:num=7;break;
case0x7d:num=8;break;
}
disply();
delay(20);
}
}
void keythree()
{

P3=0xfb;
temp=P3;
if(temp!=0xfb)
{
switch(temp)
{
case0xeb:num=9;break;
case0xdb:num=10;break;
case0xbb:num=11;break;
case0x7b:num=12;break;
}
disply();
delay(20);
}
}
void keyfour()
{
P3=0xf7;
temp=P3;
if(temp!=0xf7)
{
switch(temp)
{
case0xe7:num=13;break;
case0xd7:num=14;break;
case0xb7:num=15;break;
case0x77:num=16;break;
}
disply();
delay(20);
}
}

二 : 4*4矩阵键盘的扫描原理

初学者肯定要经历的一个实验就是4*4矩阵键盘的代码编写,大部分都是在学校里面,有现成的实验箱,基本不需要自己动脑子。上次遇到一个哥们,他说他用的是8031的实验箱,我当时就晕了。8031是8051的前身,那个芯片连ROM都没有,可以想象我们的学校都在拿什么教育祖国的花朵。废话少说,先上图:

键盘扫描原理 4*4矩阵键盘的扫描原理

对初学者来说这篇文章会有点难,可以先研究一下如何用51单片机点亮一个发光二极管和基于CPLD-EPF10K10LC84-4(84)的交通灯设计。首先要说明的一点,矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。

0XFE变成二进制是1111 1110,为了方便使用,记得每四个数之间加一个空格。1111 1110这个数据放到PA口上,假设这个时候S1被按下了,会出现什么情况?因为PA0是低电平,S1被按下之后S1导通,导致PA4的电平从1降到0,于是PA端口的数据就变成了1110 1110,换算成16进制就是0XEE。于是我们知道S1被按下了。

假设是S3被按下,会出现什么情况?没错,PA6的电平被拉低,PA的端口数据变成了1011 1110,也就是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。这就是矩阵键盘的扫描原理!送上一段源码,大家看着玩吧:

void matrixkeyscan()

{

uchar temp,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)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

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)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

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)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

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)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

}

三 : 感觉比较好的矩阵键盘扫描程序

这个程序是我在写一个计算器的程序的时候想出来的,总感觉常用的键盘扫描程序用起来很麻烦,总是要一行一行的进行扫描,看起来也很繁琐,于是自己想了一个矩阵键盘的扫描程序,原理很简单的!

这个程序的基本思路是两条相交直线只有一个交点的原理,说白了就是先检测行,再检测列,或者倒过来也可以。

这个键盘扫描子程序是一个有返回值的无参函数,需要之前计算好一个数组就OK了!

下面是子函数的实现,我在这里只用一个3*4的矩阵键盘为例,原理都是一样的!

=================================================================

uchar code key_table[]={0x77,0x7b,0x7d,0xb7,0xbb,0xbd,0xd7,0xdb,0xdd,0xe7,0xeb,0xed};/*上面的数组要自己事先计算好,只要把行和列的值连接在一起就可以得到相应按键对应的值了*/unsigned char key_scan(void ){unsigned char i, key_code; /*变量的声明*/key_port = 0x0f; /*这里的key_port是在前面宏定义的一个GPIO口,先将行(或者列)置位*/ if(key_port != 0x0f) /*如果有按键按下则GPIO的初值就会变化,就会执行下面的语句*/{delay(5); /*这里是的延时实现的是消抖,这里就不作介绍了*/if(key_port != 0x0f) /*确定真的有按键按下*/{key_code = key_port; /*把行(或者列)的值赋给key_code*/key_port = 0xf0; /*再把列(或者行置位)*/key_code |= key_port; /*把行和列的值组合起来并赋值给key_code*/for(i = 0; i < 12; i++) /*因为每一个按键按下对应的key_code只有一个,所以根据矩阵键盘的按键个数用相应的FOR循环就可以确定到底是哪一个按键被按下*/{if(key_table[i] == key_code) {key = i+1; break;}}}}else key = 0;return key; /*返回的KEY值就是,相应位置的按键了*/}=========================================================程序到这里结束了,如果有什么建议或者不明白的地方可以给我留言^_^!
本文标题:矩阵键盘扫描程序-单片机4*4矩阵键盘扫描程序
本文地址: http://www.61k.com/1070452.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1