基于51单片机,利用到的模块有:按键模块,AT24C02存储模块,LCD1602显示模块
一、具体功能如下:
1、矩阵按键输入密码,并显示在屏幕上,按下确认键,密码正确显示OK,错误显示ERR
2、独立按键按下,进入更改密码模式,需输入正确密码后才可以输入新的密码
3、清空输入按键,用于输入错误数字后清除输入
二、原理图:
三、 设计思路:
?五、代码设计思路:
由于用到了许多模块,为了让整体代码看上去简洁明了,我们可以使用模块化代码,即将要用到的模块分别用一个.C文件进行编程,最后主函数只需要调用这些模块,使得设计敲代码的思路更加明了,还有利于后续的调试,调用。
主要的代码如下,用到了模块化编程,整体看上去就比较简洁明了(完整代码和仿真文件放到了文末的链接中)
#include <REGX52.H>
#include "LCD1602.h"
#include "Delayms.h"
#include "MatrixNum.h"
#include "SET_Password.h" //更改密码模块
#include "AT24C02.h" //24C02存储模块
sbit key=P3^2; //外部中断0引脚
void Int0Init(){
IT0=1; //触发方式为下降沿
EX0=1; //外部中断0允许标志
EA=1; //总中断允许标志
}
int main()
{
Int0Init();
LCD_Init();
InitPassword();
LCD_ShowString(1,1,"Password:");
while(1)
{
KeyNum=MatrixNum(); //获取矩阵键盘键码
if(KeyNum)
{
if(KeyNum<=10) //如果有S1~s10按键按下
{
if(num<4) //限制输入为4位
{
Password*=10;
Password+=KeyNum%10;
}
num++;
LCD_ShowNum(2,1,Password,4); //LCD显示键码
}
if(KeyNum==11)
{
if(Password==Init_Password) //输入密码正确,显示OK
{
LCD_ShowString(2,14,"OK ");
delayms(200);
LCD_ShowNum(2,1,0000,4);
LCD_ShowString(2,14," ");
}
else //输入密码错误,显示ERR
{
num=0;
Password=0;
LCD_ShowString(2,14,"ERR");
delayms(200);
LCD_ShowString(2,14," ");
LCD_ShowNum(2,1,0000,4);
}
} //清空输入
if(KeyNum==12)
{
num=0;
Password=0;
LCD_ShowNum(2,1,0000,4);
}
if(KeyNum==13) //用于查看初始密码,后续可以删除
{
unsigned int dd;
dd=AT24C02_ReadByte(0);
dd|=AT24C02_ReadByte(1)<<8;
LCD_ShowNum(2,1,dd,4);
}
}
}
}
void Int0() interrupt 0
{
delayms(10); //延时消抖
if(key==0) //按键按下,进入更改密码模块
{
set_password();
}
}
六、还未解决 的问题:
由于我是直接读取AT24C02中的数据作为初始密码,所以一开始是不知道初始密码,所以就不能解锁,更不能更改密码了,在这里我直接加了一个按键,用于读出初始密码,知道初始密码后,再将这部分代码注释掉,让这个按键失灵。我想应该还有更好的办法,大家可以自己尝试。
完整代码链接:链接:https://pan.baidu.com/s/1aCEbUC8nie5NSUUs3MyHNQ 提取码:zb50
(也可以用普中的A2开发板进行下载测试)
Proteus仿真文件链接:链接:https://pan.baidu.com/s/1b0ISkW3vBS5Udb-sJ4D_2Q 提取码:n022
|