C51单片机实现矩阵键盘密码锁

简介: C51单片机实现矩阵键盘密码锁

       通过则篇文章,我将带领大家一起学习用C51单片机中的矩阵键盘制造一个简易的密码锁装置,希望这篇文章对大家有所帮助,希望大家在C51单片机学习中获取更多的知识。


硬件设备连接:


将矩阵键盘JP1引脚与JP8引脚用排线连接如图所示:


相关的代码程序及分析:


Delay延迟函数代码:

 
void Delay(unsigned int xms)
{
  unsigned char i, j;
  while(xms--)
  {
    i = 2;
    j = 239;
    do
    {
      while (--j);
    } while (--i);
  }
}

注释:此代码为软件自动生成的代码,如有不懂,可参考第一篇文章,这里不再详细讲述。


MatrixKey矩阵键盘按键设置函数代码:


#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函数代码分析:

引入两个头文件:

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

检测第一列时,先把P1的所有引脚都赋值为1,然后将P1_3引脚赋值为0,开始检测第一列按键中,是否有按键被按下(按键被按下时,所对应引脚的值将为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;}

注释:因为按行检测时,可能会触发蜂鸣器,所以本次按列检测。其余三列的检测程序均与此列相似,这里不再一一陈述。


主函数代码:

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
 
unsigned char KeyNum;
unsigned int Password=0;
unsigned int Count=0;
void main()
{
  LCD_Init();//初始化
  LCD_ShowString(1,1,"Password");
  while(1)
  {
    KeyNum=MatrixKey();
    
    if(KeyNum){
      if(KeyNum<=10)//如果s1到s10按下,则输入密码
      {
        if(Count<4)//输入要小于4次
        {
          Password*=10;
          Password+=KeyNum%10;//对10取余,让按键10对应数字0
          Count++;//次数加一
        }
        LCD_ShowNum(2,1,Password,4);//更新显示
      }
      
      if(KeyNum==11)//如果S11按键按下,表示确认
      {
        if(Password==1234)//输入密码和设定密码对比
        {
          LCD_ShowString(1,10,"Right!");//密码正确
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }
        else
        {
          LCD_ShowString(1,10,"ERR!  ");//密码错误
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }
      }
      
      if(KeyNum==12)//如果S12按键按下,表示取消
        {
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }
    }
  }
}

主函数代码分析:

引入头文件:

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

控制输入次数4次,并让让按键1~9对应其对应数字,按键10是代表数字0,更新数据,并在显示屏上显示:

 
        if(Count<4)//输入要小于4次
        {
          Password*=10;
          Password+=KeyNum%10;//对10取余,让按键10对应数字0
          Count++;//次数加一
        }
        LCD_ShowNum(2,1,Password,4);//更新显示

如果按键11被按下,判断输入的密码是否是1234,如果是,则在显示屏上显示Right!,然后把密码清0,计数也清0,更新数据。如果不是,则在显示屏上显示ERR,然后把密码清0,计数也清0,更细数据。

 
      
      if(KeyNum==11)//如果S11按键按下,表示确认
      {
        if(Password==1234)//输入密码和设定密码对比
        {
          LCD_ShowString(1,10,"Right!");//密码正确
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }
        else
        {
          LCD_ShowString(1,10,"ERR!  ");//密码错误
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }
      }

如果12按键被按下,把密码清0,把计数也清0,然后再显示屏上更新数据。

if(KeyNum==12)//如果S12按键按下,表示取消
        {
          Password=0;//密码清0
          Count=0;//计次清0
          LCD_ShowNum(2,1,Password,4);//更新显示
        }

相关视频演示:

image.png

VID_20230524_215102

目录
相关文章
|
4天前
|
存储 数据安全/隐私保护
基于51单片机的6位密码锁设计
该文档描述了一个基于AT89C52单片机的多功能电子密码锁系统设计,具备6位密码设置与修改功能,输入错误三次会锁定,并在LCD屏上以*号隐藏真实密码。系统包括矩阵键盘、LCD显示、AT24C02存储及报警系统,当密码错误时,会有蜂鸣器报警和LED灯闪烁。此外,还提供了密码重置(通过管理员密码131420)和输入错误提示。文中附有Proteus仿真及原理图,展示了开锁、重设密码和错误输入时的响应。
18 0
|
5天前
|
存储 移动开发
80C51单片机----数据传送类指令
80C51单片机----数据传送类指令
10 2
|
5天前
|
存储 移动开发 程序员
80C51单片机的七种寻址方式
80C51单片机的七种寻址方式
8 1
|
6天前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
12 0
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
|
6天前
|
数据安全/隐私保护
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
|
6天前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
21 1
|
6天前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
23 1
|
6天前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
64 0
|
6天前
|
物联网
STC51单片机-控制LED闪亮的仿真-物联网应用系统设计
STC51单片机-控制LED闪亮的仿真-物联网应用系统设计
47 0