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

相关文章
|
9月前
|
存储 数据安全/隐私保护
基于51单片机的6位密码锁设计
【10月更文挑战第11天】多功能电子密码锁系统由AT89C52单片机最小系统、4×4矩阵键盘、LCD1602显示、AT24C02存储模块以及报警系统等组成,具有设置、修改六位用户密码、超次报警、超次锁定、密码错误报警等功能。
292 23
|
存储 数据安全/隐私保护
基于51单片机的6位密码锁设计
该文档描述了一个基于AT89C52单片机的多功能电子密码锁系统设计,具备6位密码设置与修改功能,输入错误三次会锁定,并在LCD屏上以*号隐藏真实密码。系统包括矩阵键盘、LCD显示、AT24C02存储及报警系统,当密码错误时,会有蜂鸣器报警和LED灯闪烁。此外,还提供了密码重置(通过管理员密码131420)和输入错误提示。文中附有Proteus仿真及原理图,展示了开锁、重设密码和错误输入时的响应。
377 0
|
9月前
|
存储 传感器 安全
基于51单片机的指纹锁设计
基于51单片机的指纹锁设计
141 0
|
11月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
377 0
|
传感器 存储 程序员
《单片机原理与应用及C51编程技术》期末复习笔记
《单片机原理与应用及C51编程技术》期末复习笔记
283 0
|
存储 移动开发
80C51单片机----数据传送类指令
80C51单片机----数据传送类指令
570 2
|
存储 移动开发 程序员
80C51单片机的七种寻址方式
80C51单片机的七种寻址方式
396 1
|
数据安全/隐私保护
单片机课程设计——基于C51电子密码锁(源代码)
单片机课程设计——基于C51电子密码锁(源代码)
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
108 1
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
214 1