普中51单片机教程-5.矩阵键盘

1.原理图 

2.矩阵键盘介绍

矩阵键盘和独立键盘一样,单片机检测其是否被按下的依据都是检测与该键对应I/O口是否为低电平。

3.矩阵键盘扫描(输入扫描)

(1)原理:

读取第1行(列)->读取第2行(列)->读取第3行(列)->......,然后快速循环这个过程,最终实现所有按键同时检测的效果。

(2)按行

将P17接低电平,即为0,P16-P14接高电平,即为1。然后进行判断,如果P13为0,则S1按下,以此类推。有些型号的单片机,如果按行,P15端口会发生冲突,P15与蜂鸣器相接,蜂鸣器可能会响。

(3)按列

给P13-P10赋值,读取P17-P14,原理和按行类似

4.keil软件的自定义,方便编程

步骤如下:

(1)点开如下图所示的模块

(2)在空白处右键,选择如下图的选项

(3)此时进入自定义的模板

(4)将格式输入其中,然后点击ok,下次输入时,直接双击即可

5.矩阵键盘应用

(1)读取矩阵键盘,在LCD1602上显示

步骤:

创建如图所示的文件

在MatrixKey.c文件中创建如下代码,注释如下:

#include <REGX52.H>
#include "Delay.h"

unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;//初始化
    P1=0xFF;
    P1_3=0;//第一列
    if(P1_7==0)
    {    /*
        前三行代码不知道什么含义的同学,
        可以去看第二章
        */
        Delay(20);
        while(P1_7==0);//检测松手
        Delay(20);
        KeyNumber=1;
    }
    if(P1_6==0)
    {    
        Delay(20);
        while(P1_6==0);//检测松手
        Delay(20);
        KeyNumber=5;
    }
    if(P1_5==0)
    {    
        Delay(20);
        while(P1_5==0);//检测松手
        Delay(20);
        KeyNumber=9;
    }
    if(P1_4==0)
    {    
        Delay(20);
        while(P1_4==0);//检测松手
        Delay(20);
        KeyNumber=13;
    }
    
    //第二列
    P1=0xFF;
    P1_2=0;
    if(P1_7==0)
    {    
        Delay(20);
        while(P1_7==0);//检测松手
        Delay(20);
        KeyNumber=2;
    }
    if(P1_6==0)
    {    
        Delay(20);
        while(P1_6==0);//检测松手
        Delay(20);
        KeyNumber=6;
    }
    if(P1_5==0)
    {    
        Delay(20);
        while(P1_5==0);//检测松手
        Delay(20);
        KeyNumber=10;
    }
    if(P1_4==0)
    {    
        Delay(20);
        while(P1_4==0);//检测松手
        Delay(20);
        KeyNumber=14;
    }
    
    //第三列
    P1=0xFF;
    P1_1=0;
    if(P1_7==0)
    {    
        Delay(20);
        while(P1_7==0);//检测松手
        Delay(20);
        KeyNumber=3;
    }
    if(P1_6==0)
    {    
        Delay(20);
        while(P1_6==0);//检测松手
        Delay(20);
        KeyNumber=7;
    }
    if(P1_5==0)
    {    
        Delay(20);
        while(P1_5==0);//检测松手
        Delay(20);
        KeyNumber=11;
    }
    if(P1_4==0)
    {    
        Delay(20);
        while(P1_4==0);//检测松手
        Delay(20);
        KeyNumber=15;
    }
    
    //第四列
    P1=0xFF;
    P1_0=0;
    if(P1_7==0)
    {    
        Delay(20);
        while(P1_7==0);//检测松手
        Delay(20);
        KeyNumber=4;
    }
    if(P1_6==0)
    {    
        Delay(20);
        while(P1_6==0);//检测松手
        Delay(20);
        KeyNumber=8;
    }
    if(P1_5==0)
    {    
        Delay(20);
        while(P1_5==0);//检测松手
        Delay(20);
        KeyNumber=12;
    }
    if(P1_4==0)
    {    
        Delay(20);
        while(P1_4==0);//检测松手
        Delay(20);
        KeyNumber=16;
    }
    
    return KeyNumber;
}

在MatrixKey.h中添加如下声明:

#ifndef __MatrixKey_H__
#define __MatrixKey_H__

unsigned char MatrixKey();

#endif
 

在主函数中

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
void main()
{
    unsigned char KeyNum;
    LCD_Init();//初始化
    LCD_ShowString(1,1,"MatrixKey:");
    while(1)
    {
        KeyNum=MatrixKey();
        if(KeyNum)
        {
        LCD_ShowNum(2,1,KeyNum,3);
        }
    }
}
    

其他的延时函数和LCD1602的头文件和.c文件代码见前几章,或者评论区百度网盘提取

效果:

普中51单片机矩阵键盘

 (2)矩阵键盘密码锁

步骤:

按键分布
S1-S91-9
S100
S11确认
S12取消
S13退格
工程文件布局

文件细分
1)主函数(有代码注释)

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
void main()
{
    unsigned char KeyNum;
    unsigned int Passward,Count;
    LCD_Init();//初始化
    LCD_ShowString(1,1,"Passward:");
    while(1)
    {
        KeyNum=MatrixKey();
        if(KeyNum)
        {    
            if(KeyNum<=10)//S1-S10,密码区
            {
                if(Count<4)//记录次数,4次
                {
                    Passward*=10;//左移,0000->首先按下1,0001->0010
                                         //->按下2,0012,以此类推
                    Passward+=KeyNum%10;//传回按键10,取余就是0
                                                    //获取一位密码
                    Count++;//次数增加
                }
                LCD_ShowNum(2,1,Passward,4);//显示更新
            }
            if(KeyNum==11)//S11,确认
            {
                if(Passward==1212)//输入的密码等于正确的密码
                {
                    LCD_ShowString(1,14,"OK!");//凑成三个,不然会变成okR
                    Passward=0;//密码清零
                    Count=0;//计数清零
                    LCD_ShowNum(2,1,Passward,4);//显示更新,不然不会显示0000
                }
                else  //密码不正确
                {
                    LCD_ShowString(1,14,"ERR");
                    Passward=0;//密码清零
                    Count=0;//计数清零
                    LCD_ShowNum(2,1,Passward,4);//显示更新,不然不会显示0000
                }
            }
            if(KeyNum==12)//S12,取消
            {
                Passward=0;//密码清零
                Count=0;//计数清零
                LCD_ShowNum(2,1,Passward,4);//显示更新
            }
            if(KeyNum==13)//S13,退格
            {
                Passward=Passward/10;
                Count--;
                LCD_ShowNum(2,1,Passward,4);//显示更新
            }
        }
    }
}

2)其他.c文件和头文件

延时函数、LCD1602、还有就是示例一中的MatrixKey.c和MatrixKey.h,大家需要的话,评论区领取。

效果如下:

普中51单片机矩阵键盘密码锁

  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值