通过则篇文章,我将带领大家一起学习用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);//更新显示 }
相关视频演示:
VID_20230524_215102