3.4 51单片机-矩阵键盘

简介: 3.4 51单片机-矩阵键盘

3.4 矩阵键盘

 

3.4.1 矩阵键盘原理图

要使用矩阵键盘,需要将JP4接到JP8(P1)上面,JP165跳线帽需要断开(否则会导致矩阵键盘最右一排无法正常使用)。

image.png

image.png

image.png

3.4.2 矩阵键盘介绍


在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键),在需要的键数比较多时,采用矩阵法来做键盘是合理的。


   矩阵按键设置在行、列线交点上;行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V电源上。无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列线电平决定。


3.4.3 示例代码: 行列扫描


下面示例代码,使用矩阵键盘行列扫描,反转法检测按键按下的状态。


示例代码:  

#include <reg51.h>
#define KEY P1   //定义按键
sbit key1=KEY^0;
sbit key2=KEY^1;
sbit key3=KEY^2;
sbit key4=KEY^3;
sbit key5=KEY^4;
sbit key6=KEY^5;
sbit key7=KEY^6;
sbit key8=KEY^7;
/*
矩阵键盘扫描函数
矩阵键盘尺寸:4*4
接在P1口上。
*/
u8 Array_Scan(void)
{
    u8 key_a=0,key_b=0,key_c=0,key_d=0;  //用来存放矩阵按键按下的标志
    KEY=0xF0; //矩阵键盘赋值,4个IO为高电平4个IO为低电平
    if(KEY!=0xF0) //判断是否有按键按下
    {
        DelayMs(50);  //消抖
        if(KEY!=0xF0) //再次判断
        {
            //检测是哪一排的按键的按下了
            if(key5==0)key_a=1; //s1,s5,s9,s13 其中一个按键按下
            if(key6==0)key_b=1; //s2 s6 s10 s14 其中一个按键按下
            if(key7==0)key_c=1; //s3 s7 s11 s15 其中一个按键按下
            if(key8==0)key_d=1; //s4 s8 s12 s16 其中一个按键按下
            KEY=0x0F; //反转法重新赋值
            if(KEY!=0x0F) //检测按键是否按下
            {
                if(key1==0&&key_a==1)return 1;
                if(key1==0&&key_b==1)return 2;
                if(key1==0&&key_c==1)return 3;
                if(key1==0&&key_d==1)return 4;
                if(key2==0&&key_a==1)return 5;
                if(key2==0&&key_b==1)return 6;
                if(key2==0&&key_c==1)return 7;
                if(key2==0&&key_d==1)return 8;
                if(key3==0&&key_a==1)return 9;
                if(key3==0&&key_b==1)return 10;
                if(key3==0&&key_c==1)return 11;
                if(key3==0&&key_d==1)return 12;
                if(key4==0&&key_a==1)return 13;
                if(key4==0&&key_b==1)return 14;
                if(key4==0&&key_c==1)return 15;
                if(key4==0&&key_d==1)return 16;
            }
        }
    }
return 0;
}

3.4.4 示例代码: 增加按键松开检测

下面代码里增加了一个静态变量,记录按键按下的状态,全部按键松开再清除标志位,如果有按键没有松开,就无法进行二次检测,这样可以达到精准消抖效果。

示例代码:

1.#include <reg51.h>
#define KEY P1  //定义按键
sbit key1=KEY^0;
sbit key2=KEY^1;
sbit key3=KEY^2;
sbit key4=KEY^3;
sbit key5=KEY^4;
sbit key6=KEY^5;
sbit key7=KEY^6;
sbit key8=KEY^7;
/*
矩阵键盘扫描函数
矩阵键盘尺寸:4*4
接在P1口上。
*/
u8 Array_Scan(void)
{
    static u8 flag=0;
    u8 key_a=0,key_b=0,key_c=0,key_d=0;  //用来存放矩阵按键按下的标志
    KEY=0xF0; //矩阵键盘赋值,4个IO为高电平4个IO为低电平
    if((KEY!=0xF0)&&(flag==0)) //判断是否有按键按下
    {
        DelayMs(50);  //消抖
        if((KEY!=0xF0)&&(flag==0)) //再次判断
        {
            flag=1; //记录按键按下
            //检测是哪一排的按键的按下了
            if(key5==0)key_a=1; //s1,s5,s9,s13 其中一个按键按下
            if(key6==0)key_b=1; //s2 s6 s10 s14 其中一个按键按下
            if(key7==0)key_c=1; //s3 s7 s11 s15 其中一个按键按下
            if(key8==0)key_d=1; //s4 s8 s12 s16 其中一个按键按下
            KEY=0x0F; //反转法重新赋值
            if(KEY!=0x0F) //检测按键是否按下
            {
                if(key1==0&&key_a==1)return 1;
                if(key1==0&&key_b==1)return 2;
                if(key1==0&&key_c==1)return 3;
                if(key1==0&&key_d==1)return 4;
                if(key2==0&&key_a==1)return 5;
                if(key2==0&&key_b==1)return 6;
                if(key2==0&&key_c==1)return 7;
                if(key2==0&&key_d==1)return 8;
                if(key3==0&&key_a==1)return 9;
                if(key3==0&&key_b==1)return 10;
                if(key3==0&&key_c==1)return 11;
                if(key3==0&&key_d==1)return 12;
                if(key4==0&&key_a==1)return 13;
                if(key4==0&&key_b==1)return 14;
                if(key4==0&&key_c==1)return 15;
                if(key4==0&&key_d==1)return 16;
            }
        }
    }
    else if(KEY==0xF0) //按键全部松开
    {
        flag=0;
    }
return 0;
}
目录
相关文章
|
2月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
|
5月前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
60 0
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
|
5月前
|
数据安全/隐私保护
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
|
5月前
|
数据安全/隐私保护
C51单片机实现矩阵键盘密码锁
C51单片机实现矩阵键盘密码锁
|
C语言
C语言课设项目-51单片机-独立按键与矩阵按键
C语言课设项目-51单片机-独立按键与矩阵按键
179 0
【单片机】数码管矩阵显示
【单片机】数码管矩阵显示
84 0
【STC15单片机】简单的矩阵键盘代码
【STC15单片机】简单的矩阵键盘代码
221 0
|
存储
【51单片机】用定时器扫描矩阵键盘
【51单片机】用定时器扫描矩阵键盘
274 0
|
5月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
46 1

热门文章

最新文章

下一篇
无影云桌面