4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4×4矩阵键盘原理及其在单片机中的简单应用
基于Proteus仿真
1、4×4矩阵键盘的工作原理
如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为01110111,即0X77。当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为10111011,即0XBB。全部矩阵键盘的位置码如下:
2、4×4矩阵键盘在单片机的简单应用举例(一)
如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。此处采用线反转法识别按键。
C程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit buzzer=P1^0;
uchar code dis[]= //0~9,A~F的共阳显示代码
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0X88,0X83,
0XC6,0XA1,0X86,0X8E};
uchar code tab[]= //矩阵键盘按键位置码
{
0x77,0xb7,0xd7,0xe7,
0x7b,0xbb,0xdb,0xeb,
0x7d,0xbd,0xdd,0xed,
0x7e,0xbe,0xde,0xee
};
void delay(uint x) //延时函数
{uchar i;
while(x--)
for(i=0;i<120;i++);
}
uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;
P3=0XF0; //P3口输出11110000
a=P3; //读取列码
delay(10); //防抖延时10ms
P3=0X0F; //P3口输出00001111
b=P3; //读取行码
c=a+b; //得到位置码
for(i=0;i<16;i++)
if(c==tab[i])return i; //查表得到按键序号并返回
return -1; //无按键,则返回-1
}
void beep() //蜂鸣器发出声音,模拟按键的声音
{ uchar i;
for(i=0;i<100;i++)
{
buzzer=~buzzer;
delay(1);
}
buzzer=0;
}
void main()
{uchar key;
buzzer=0; //关闭蜂鸣器
while(1)
{key=scan(); //得到按键号
if(key!=-1) //有按键则显示,并且蜂鸣器发出声音
{P0=dis[key];
beep();
delay(100);
}
}
}
Proteus仿真运行结果如下:
3、4×4矩阵键盘在单片机的简单应用举例(二)
如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。这里仍然采用线反转法识别按键。
C程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]= //矩阵键盘按键位置码
{
0x77,0xb7,0xd7,0xe7,
0x7b,0xbb,0xdb,0xeb,
0x7d,0xbd,0xdd,0xed,
0x7e,0xbe,0xde,0xee
};
void delay(uint x) //延时函数
{uchar i;
while(x--)
for(i=0;i<120;i++);
}
uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;
P1=0XF0;
a=P1;
delay(10);
P1=0X0F;
b=P1;
c=a+b;
for(i=0;i<16;i++)
if(c==tab[i])return i; //有按键,则返回按键号
return -1; //无按键,则返回-1
}