单片机学习小组
直播中

张霞

7年用户 994经验值
私信 关注

矩阵按键的扫描方法有何优缺点呢

矩阵按键需要用多少个单片机引脚进行连接呢?
矩阵按键的扫描方法有何优缺点呢?具体怎样去实现?

回帖(1)

汤宇

2022-2-23 10:39:45
一、矩阵按键的简介



在键盘中按键数量较多时,为了减少I/0口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。电路连接的原理图如下图所示。


从上图可以看出16个按键只用了8个引脚,比用简单方法(一个按键连接一个引脚)连接减少了8个引脚的开支。

想一想如果要接20个按键呢?用矩阵按键的接法,需要用多少个单片机引脚呢?解决方法如下图所示,最终我们只需要用9个单片机引脚即可。


二、矩阵按键扫描方法


1、优缺点讨论


每个按键都接一个引脚,这种方法虽然有浪费引脚的弊端,但也有一个好处,那就是在编程中方便判断引脚是否按下,只用检测所连接引脚的电平即可。

把按键集中起来,用矩阵的排列方式连接,这样有一个好处就是节约引脚,但是在编程时,如果要检测哪个按钮是否按下,就没有原始连接方法那样容易判断了。但学习了矩阵按键的扫描方法后,就变得很容易了。

2、矩阵按键扫描方法


此次矩阵按键的扫描方法:行列扫描法。

行列扫描: 可以通过高四位全部输出低电平,低四位输出高电平。当按收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,行确定了,列也确定了,这样就可以确定具体是哪一个按键按下了。

3、具体的编程思路



看图说话,代码如下:

//定义函数中要用到的变量
int key;                //存储哪一个按键按下
int key_scan()
{
        P1=0x0f;                //引脚的高四位输入低电平,低四位输入高电平
        if(P0!=0x0f)                //此时检测矩阵按键中是否有按键按下,如果有按键按下,则低四位中某个引脚就会输入低电平
        {
                delay(100);                //延时消抖
                if(P1!=0x0f)                //再确认一次按键按下
                {
                        //测试列
                        switch(P1)
                        {
                                case(0X07):        key=1;break;                //第一列有按键按下,则低四位中的第4位会变为0
                                case(0X0b):        key=2;break;                //第一列有按键按下,则低四位中的第3位会变为0
                                case(0X0d): key=3;break;
                                case(0X0e):        key=4;break;
                        }
                        //测试行
                        P1=0Xf0;                //引脚的低四位输入低电平,高四位输入高电平
                        switch(P1)
                        {
                                case(0X70):        key=key;break;                //第一行有按键按下
                                case(0Xb0):        key+=4;break;                //第二行有按键按下
                                case(0Xd0): key+=8;break;
                                case(0Xe0):        key+=12;break;
                        }
                       
                }
        }
return key;
}

这里解释一下上面代码中的一个片段,这里涉及一个小小的算法。代码片段如下:

switch(P1)
                {
                        case(0X70):        key=key;break;
                        case(0Xb0):        key+=4;break;
                        case(0Xd0): key+=8;break;
                        case(0Xe0):        key+=12;break;
                }

这里是根据矩阵按键扫描的行、列号直接计算出来了对应的按键序号。原理分析如下:

第一次列扫描,知道第n列有按键按下后。
接下来行扫描,如果第一行有按键按下,那么按键序列号就是列序列号。
如果第二行有按键按下,那么按键序列号就是列号+4。
如果第三行有按键按下,那么按键序列号就是列号+8。
如果第四行有按键按下,那么按键序列号就是列号+12。

可以对照上面原理图看。

根据上面的代码,我们就可以扫描出是哪一个按键按下,然后在编程中就根据相应的按键执行相应的功能代码就行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分