4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

}

相关文档
最新文档