#include <REGX52.H>
#include "MatriKey.h"
#include "LCD1602.h"
#include "String.h"
#include "Delay.h"
#include "AT24C02.h"
#include "PassWord.h"
#include "Beep.h"
#define Length 3 //长度
#define Administrator "2869902214" //开发者密码设置(建议10位以内)
extern unsigned char Number; //键值
unsigned char Count_Input,Count_ERROR; //目前输入的位数,错误次数
unsigned char Write_LCD_PassWord[Length + 1]; //输入的密码
unsigned char Temp_Read_AT[Length + 1]; //读取过渡字符串
unsigned char First_PassWord[Length + 1]; //改密码第一次的字符串
unsigned char Second_PassWord[Length + 1]; //第二次的字符串
unsigned char Administrator_PassWorld[Length + 1]; //忘记密码(Length为目前设置的密码长度)
unsigned char Write_Count; //写入的次数
bit ERROR,Wirte_Flag,Success,Success_Flag; //密码错误、写入的标志、密码正确、蜂鸣器正确音效标志
void Set_PassWord() //设置密码
{
Count_Input = 0;
Wirte_Flag = 1; //进入写入模式
LCD_Init();
LCD_ShowString(1,1,"Write:");
}
void Init_PassWord() //初始化密码
{
LCD_Init();
if(Wirte_Flag == 0) //如果不为写入状态则
LCD_ShowString(1,1,"PassWord:");
else if(Wirte_Flag == 1) //写入状态
{
if(Write_Count == 0)
LCD_ShowString(1,1,"Write:");
else LCD_ShowString(1,1,"Again:");
}
strcpy(Write_LCD_PassWord," "); //清空密码
Count_Input = 0; //回到密码输入最初位置
Success = 0; //返回后不可修改密码
}
void Back_PassWord() //回退密码
{
Count_Input = Count_Input - 1; //输入回退一个
Write_LCD_PassWord[Count_Input] = ' '; //赋值空格
LCD_ShowChar(2,Count_Input+1,Write_LCD_PassWord[Count_Input]); //空格覆盖
}
void Judge_PassWord() //输入密码的判断结果
{
if (strcmp(Write_LCD_PassWord, Temp_Read_AT) == 0 || strcmp(Write_LCD_PassWord, Administrator_PassWorld) == 0)
{
LCD_ShowString(1,10,"Success");
Success = 1; //正确则赋值1
Success_Flag = 1; //蜂鸣器的赋值
strcpy(Write_LCD_PassWord," ");
Count_Input = Length + 1; //确认后不再输入,不再回退
Count_ERROR = 0; //清除
}
else //错误
{
LCD_ShowString(1,10,"ERROR!!");
ERROR = 1;
Count_Input = Length + 1; //确认后不再输入,不再回退,因为i=Length 是最后一位
Count_ERROR++; //如果确认后i=Length 或者0都可以再输入密码
}
}
void Read_PassWord() //读取正确密码
{
unsigned char a;
for(a = 0;a<Length ;a++)
{
Temp_Read_AT[a] = AT24C02_ReadByte(a);
}
for(a = 0;a<Length ;a++) //读取开发者密码
{
Administrator_PassWorld[a] = Administrator[a];
}
}
void Write_PassWord() //写入正确密码
{
unsigned char a;
for(a = 0;a<Length ;a++)
{
AT24C02_WriteByte(a,Write_LCD_PassWord[a]);
Delay(5);
}
}
void Change_PassWord() //更改密码
{
unsigned char i;
if(Write_Count == 0)
{
for(i=0;i<Length;i++)
{
First_PassWord[i] = Write_LCD_PassWord[i]; ////遍历length次传递第一次密码
}
LCD_Init();
LCD_ShowString(1,1,"Again:");
Count_Input = 0;
Write_Count++;
}
else if(Write_Count == 1)
{
for(i=0;i<Length;i++) Second_PassWord[i] = Write_LCD_PassWord[i]; //遍历length次传递第二次密码
if(strcmp(Second_PassWord, First_PassWord) == 0) //如果一样
{
LCD_Init();
LCD_ShowString(1,1,"Success!");
Success = 0;//改完密码后置0,必须再输入正确密码才可以改
Wirte_Flag = 0; //存入后退出修改密码模式
Write_PassWord(); //存入AT24C02
Count_Input = Length + 1; //防误操作
Success_Flag = 1; //发出蜂鸣器声音
Write_Count = 0; //清除
}
else
{
LCD_Init();
LCD_ShowString(1,1,"Start Again!");
Write_Count = 0;
Count_Input = 0; //防误操作
ERROR = 1; //发出蜂鸣器声音
}
}
}
void LCD_PassWord() //LCD显示
{
if(Count_Input!=0 && Count_Input <= Length ) //按键之后开始输入密码
{
//LCD_ShowChar(2,Count_Input,Write_LCD_PassWord[Count_Input-1]);
LCD_ShowChar(2,Count_Input,'*');
}
}
void Key_Number() //数字和 * # 按键
{
if(Count_Input < Length )
{
switch(Number)
{
case 16: Write_LCD_PassWord[Count_Input] = '0';
Count_Input++;
break;
case 10:Write_LCD_PassWord[Count_Input] = '*';
Count_Input++;
break;
case 11:Write_LCD_PassWord[Count_Input] = '#';
Count_Input++;
break;
case 9:Write_LCD_PassWord[Count_Input] = '9';Count_Input++;break;
case 8:Write_LCD_PassWord[Count_Input] = '8';Count_Input++;break;
case 7:Write_LCD_PassWord[Count_Input] = '7';Count_Input++;break;
case 6:Write_LCD_PassWord[Count_Input] = '6';Count_Input++;break;
case 5:Write_LCD_PassWord[Count_Input] = '5';Count_Input++;break;
case 4:Write_LCD_PassWord[Count_Input] = '4';Count_Input++;break;
case 3:Write_LCD_PassWord[Count_Input] = '3';Count_Input++;break;
case 2:Write_LCD_PassWord[Count_Input] = '2';Count_Input++;break;
case 1:Write_LCD_PassWord[Count_Input] = '1';Count_Input++;break;
default :break;
}
}
}
void Function_Key() //功能按键
{
if(Count_Input == Length && Number == 15 && Wirte_Flag == 0) //确认密码,和确认设置密码
{
Judge_PassWord(); //判断密码
}
else if(Count_Input == Length && Number == 15 && Wirte_Flag == 1) //确认修改密码
{
Change_PassWord(); //修改密码
}
if(Count_Input != 0 && Number == 12 && Count_Input != Length + 1) //回退一个密码
{
Back_PassWord();
}
if(Number == 13) //初始化密码
{
Init_PassWord();
}
if((Count_Input == Length + 1 || Count_Input == 0) && Number == 14 && Success == 1 ) //设置密码
{
Set_PassWord();
}
Number = 99;//如果为0,那么0不会进入Key_Flag();
}
void PassWord() //执行
{
if(Key() != 0) //调用密码键
{
if(Number == 101) //如果是101门铃,则不进行下面的操作,防止蜂鸣器再次发声
DoorBell(1);
else
{
if(Wirte_Flag == 0) //输入密码
{
Key_Number();
}
if(Wirte_Flag == 1) //改写密码
{
Key_Number();
}
Function_Key(); //调用功能键
Buzzer(); //按键蜂鸣器
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机AT89C52芯片的可改位数的记忆密码锁,有警报声和门铃(包含免费下载工程代码压缩包,持续更新)
共48个文件
obj:9个
c:9个
lst:9个
需积分: 1 2 下载量 36 浏览量
2023-06-02
17:35:01
上传
评论 1
收藏 647KB ZIP 举报
温馨提示
免费下载 免费下载 免费下载 免费下载 免费下载 免费下载 免费下载 免费下载
资源推荐
资源详情
资源评论
收起资源包目录
密码锁.zip (48个子文件)
密码锁
LCD1602.h 655B
MatriKey.h 169B
Beep.h 231B
Project.uvopt 10KB
Objects
Delay.obj 874B
PassWord.__i 119B
Beep.obj 8KB
Timer0.obj 5KB
Beep.__i 107B
MatriKey.__i 119B
Project.build_log.htm 1KB
Timer0.__i 113B
MatriKey.obj 7KB
LCD1602.obj 11KB
PassWord.obj 17KB
11.__i 101B
Project.hex 9KB
Project 51KB
main.obj 3KB
Project.lnp 298B
11.obj 5KB
AT24C02.obj 7KB
Snipaste_2023-02-12_13-56-23.png 567KB
LCD1602.c 5KB
Beep.c 2KB
PassWord.c 6KB
11.c 297B
Listings
Project.m51 48KB
MatriKey.lst 5KB
11.lst 2KB
main.lst 1KB
Timer0.lst 3KB
PassWord.lst 15KB
AT24C02.lst 5KB
Beep.lst 7KB
LCD1602.lst 10KB
Delay.lst 1KB
Timer0.c 780B
Delay.h 86B
MatriKey.c 2KB
Delay.c 144B
AT24C02.c 2KB
Project.uvgui.Administrator 93KB
PassWord.h 516B
main.c 170B
Project.uvproj 16KB
Timer0.h 77B
AT24C02.h 374B
共 48 条
- 1
资源评论
送外卖的CV工程师
- 粉丝: 694
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功