单片机学习小组
直播中

周静

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

矩阵按键是否被按下的检测方法有哪几种呢

怎样去检测矩阵按键是否被按下呢?
矩阵按键是否被按下的检测方法有哪几种呢?


回帖(1)

蔡鼎瑾

2022-2-23 10:34:03
矩阵按键介绍

       独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,引入了矩阵键盘。

         无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该键对应的 I/O 口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。

检测方法



       检测方法有多种,最常用的是逐行列扫描和行列扫描。



       逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。



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




C51例程


#include

typedef unsigned int U16;
typedef unsigned char U8;

***it LSA = P2^2;
***it LSB = P2^3;
***it LSC = P2^4;

#define GPIO_KEY P1
#define GPIO_DIG P0

U8 keyValue = 0;

//共阴级码表
U8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
                        0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void delay(U16 i)
{
    while(i--);
}

void keyDown()
{
    U8 a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)
    {
        delay(1000);
        if(GPIO_KEY!=0x0f)
        {
            GPIO_KEY=0x0f;
            switch(GPIO_KEY)
            {
                case 0x07:keyValue = 0;break;
                case 0x0b:keyValue = 1;break;
                case 0x0d:keyValue = 2;break;
                case 0x0e:keyValue = 3;break;
                default:;
            }
            
            GPIO_KEY=0xf0;
            switch(GPIO_KEY)
            {
                case 0x70:keyValue = keyValue;break;
                case 0xb0:keyValue = keyValue+4;break;
                case 0xd0:keyValue = keyValue+8;break;
                case 0xe0:keyValue = keyValue+12;break;
                default:;
            }
            while((a<50)&&(GPIO_KEY!=0xf0))
            {
                delay(1000);
                a++;
            }
        }
    }
}

void main()
{
    LSA = 0;
    LSB = 0;
    LSC = 0;

    while(1)
    {
        keyDown();
        GPIO_DIG=smgduan[keyValue];
    }
}
举报

更多回帖

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