自动化单片机智能密码锁设计
目 录
第1章 概述........................................................................................................................... 2
1.1 设计内容: .............................................................................................................. 2
1.2 扩展内容: .............................................................................................................. 2
1.3设计要求: ............................................................................................................... 3 第2章 系统总体方案设计 ................................................................................................... 4
2.1系统组成框图 ........................................................................................................... 4
2.2单片机系统: ........................................................................................................... 4
2.3矩阵键盘接口模块: ............................................................................................... 5
2.4 LCD液晶显示模块: .............................................................................................. 5
2.5 复位电路模块: ...................................................................................................... 5
2.6开锁提示模块: ....................................................................................................... 5
2.7报警电路模块: ....................................................................................................... 6 第3章 硬件电路设计 ........................................................................................................... 7
3.1 键盘电路设计 .......................................................................................................... 7
3.2 液晶显示电路设计 .................................................................................................. 8
3.3 密码存储电路设计 ................................................................................................ 9
3.4 复位电路设计 ...................................................................................................... 10
3.5报警电路设计 ......................................................................................................... 11
3.6开锁机构设计 ......................................................................................................... 12 第4章 软件设计 ................................................................................................................. 14
4.1系统流程图 ............................................................................................................. 14
4.2 软件总体设计 ........................................................................................................ 15
4.3 各子程序的设计 .................................................................................................... 15 第5章 系统调试 ................................................................................................................. 25
5.1软件调试方法 ......................................................................................................... 25
5.2程序调试用到的软件及其工具 ............................................................................. 25
5.3KEIL C51简介 ........................................................................................................ 25
5.4调试过程................................................................................................................. 26 设计总结............................................................................................................................... 27
参考文献............................................................................................................................... 28
附录....................................................................................................................................... 29
附录1 硬件原理图 .................................................................................................... 29
附录2 源程序清单 .................................................................................................... 30
1
第1章 概述
随着人们的生活水平的提高以及安全意识的加强,对安全的要求也就越来越高。自古以来,锁就是把守护门的铁将军,人们对它的要求甚高,既要安全可靠,又要使用方便,这也是制锁者长期以来研制的主题。随着单片机技术的发展,各类电子产品应运而生,智能密码锁就是其中之一。智能密码锁的研制,在20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码来完成解锁过程,由于智能密码锁的密码量极大,不易被破解,避免了因钥匙被仿制而留下的安全隐患。并且可以与机械钥匙配合使用,双重守护,大大提高了其安全性能,因而到现在应用得越来越广泛了。智能密码锁只要记住一组密码,无需携带金属的钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人们所欣赏。智能密码锁的种类繁多,例如:数码锁、指纹锁、磁卡锁,IC卡锁等等,但较实用的还是电子密码锁。电子密码锁是以单片机为核心的智能密码锁系统,适合使用在安全性要求较高的场合。此次关于该种智能密码锁的单片机课程设计内容及要求如下:
1.1 设计内容:
(1)密码的设定:此密码是固定在程序存储器ROM中并且保存在24C02 E2PROM中 ,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。 假设预设的密码为“123456”共6位密码。
(2)密码的输入:采用矩阵按键来完成密码的输入,分为两组,其中一组按键为功能键,另一组按键为数字键。在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。然后进入密码的判断比较处理状态并给出相应的处理过程。
(3)按键禁止功能:初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。 1.2 扩展内容:
(1)密码的删除功能:当在密码输入时,不小心将密码输错,此时只要 按下删除键,便能重新输入密码。
(2)报警功能:当连续输入的三次密码全都错误的情况下,自动启用报警功能,有警报声响起及红灯闪烁。
(3)复位功能:在输入密码确认后最终出现两种情况:一是密码输入正 确,此时密码锁自动打开,一段时间后便自动复位,进入下一次密码的输入。 二是密码输
2
入错误,此时启动警报,只有当人为的按下复位功能键才能解除 警报状态。
1.3设计要求:
(1)设计方案要合理、正确;
(2)系统硬件设计及焊接制作;
(3)系统软件设计及调试;
(4)系统联调;
3
第2章 系统总体方案设计
此次智能密码锁控制器的设计主要是通过程序来控制键盘和报警器等, 在一般状态下输入原始密码,则可以开锁。如果在锁住时输入密码,且连续三次密码错误,报警器报警,手动按下复位按钮,解除警报。此次设计我们将密码固化在 ROM 中,放入表中,在得到按键后,查表比较密码,如果正确, 显示”OPEN”提示。 2.1系统组成框图
系统总体设计 本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。
键盘输入模块 显示模块
8051 单片机 复位电路 报警电路
密码存储模块 开锁电路
图2-1 系统组成框图
2.2单片机系统:
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。它由单片机、时钟电路、复位电路等组成。为了简化电路、降低成本、提高可靠性,本系统采用AT89C52单片机作为主控制器。利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,进行智能密码锁的设计。此次课题用单片机P3口与键盘相连,作输入口,P0口与LCD显示器相连,作显示。单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部
4
振荡。由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式。
2.3矩阵键盘接口模块:
此次课程设计采用矩阵式按键,用于密码输入模块。4*4矩阵键盘,4行4列分别与P3口相连,采用行列反转扫描法。设有“0—9”15个数字密码按键,和6个功能键。6个功能键中包括shift键、密码提示找回键、返回键、密码修改键、清除键入键、确认键,其中shift键为上档转换键,与另外15个键按下同时按下将会显示15个不同的字母,可作为字母密码按键,数字与字母配合使用,大大增强了密码的安全性。密码提示找回键:用来找回密码,输入正确的预设密保问题
就能实现密码自动发送到从机并显示出来。密码修改键用来修改当前密码。具体详见附录三的按键说明。
2.4 LCD液晶显示模块:
此次课程设计设置6位初试密码,直接在设计之前写如24C02 E2PROM中,按键后采用液晶1602显示器显示(显示原理详见液晶1602资料)。根据按键顺序,显示器第一位显示第一次按的密码,第二位显示第二次按的密码,依此类推第6位显示第6次按的密码,并为了安全和方便起见,本显示是按下一个键后显示输入键值的内容然后迅速用‘*’代替,显示输入是为了防止误输入,而后迅速以‘*’代替是为了防止他人盗号。密码输入完成后按确认键后,系统将自动进行密码比较,并将对应的比较结果信息显示到液晶屏上。密码找回和修改密码也类似进行显示,在液晶显示的提示下,可方便的进行操作,体现了人性化的特点。
2.5 复位电路模块:
在输入密码确认后最终出现两种情况:一是密码输入正 确,此时密码锁自动打开,一段时间后便自动复位,进入下一次密码的输入。 二是密码输入错误,此时启动警报,只有当人为的按下复位功能键才能解除 警报状态。
2.6开锁提示模块:
当输入密码和固有密码相同时,LED灯闪烁伴随的蜂鸣器响,同时控制继电器打开密码锁装置,当3次输入的密码都与固有密码不同时,将死锁定键盘,不再读入数据。
5
重启后方可重新输入。
2.7报警电路模块:
当连续输入的三次密码全都错误的情况下,自动启用报 警功能,有警报声响起及红灯闪烁。
2.8密码锁存模块:
该系统的密码在初始化的时候就被写在24C02 E2PROM中。初始密码为“123456”。修改初始密码需要用24C02程序直接重新写入密码所在地址中的值,以后修改的密码,也都讲被系统直接写入24C02 E2PROM中。然后系统直接从24C02中读取当前密码。并与用户输入密码相比较。防止掉电丢失修改后的密码。
6
第3章 硬件电路设计
3.1 键盘电路设计
3.1.1矩阵式键盘工作原理:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图3.1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如p3口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数比较多时,采用矩阵法来做键盘。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图3.1中,如果将行线扫描为全0,当按键没有按下时,所有的列线都是高电平,代表无键按下。一旦有键按下,则列线就会被拉低。这样,通过读入列线的状态就可得知是否有键按下了。
3.1.3 矩阵式键盘的识别方法:
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如图3-1所示。判断键盘中有无键按下具体步骤如下:
(1)先将列线P3.7-P3.4置1110,然后
行线的状态。如果P3.3-P3.0为1110,则0被按下;如果P3.3-P3.0为1101,则4被按下;如果P3.3-P3.0为1011,则8键被按下,如果P3.3-P3.0为0111,则C键被按下。
(2)以此类推,对键盘进行循环扫描,实现对键盘的读入数据。
7
图3-1 4x4矩阵键盘
3.2 液晶显示电路设计
3.2.1 LCD1602液晶显示原理:
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法。1602采用
的16脚接口,其中VSS为地电源,VDD接5V正电源,V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。D0~D7为8位双向数据线。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,如图3-2
8
所示。
图3-2 1602液晶显示电路
3.3 密码存储电路设计
AT24C02 的控制字由 8 位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。管脚描述:SCL 为串行时钟:串行时钟输入管脚用于产生器件所有数据发送或接收的时钟这是一个输入管脚。 SDL 为串行数据/地址:双向串行数据/地址管脚用于器件所有数据的发送或接收 SDL,是一个开漏输出管脚可与其它开漏输出或集电极开路输出进行线或。 A0、A1、A2 为器件地址输入端:当使用 24C02 时最大可级联 8 个器件,如果只有一个 24C02 被总线寻址,这三个地址输入脚 A0、A1、A2 可悬空或连接到 Vss。 WP 为写保护:如果 WP 管脚连接到 Vcc 所有的内容都被写保护只能读当 WP 管脚连接到 Vss 或悬空允许器件进行正常的读/写操作12。
9
图3-3 密码存储电路
3.4 复位电路设计
在输入密码确认后最终出现两种情况:一是密码输入正 确,此时密码锁自动打开,一段时间后便自动复位,进入下一次密码的输入。 二是密码输入错误,此时启动警报,只有当人为的按下复位功能键才能解除 警报状态。
10
图3-4 复位电路
3.5报警电路设计
报警控制电路的功能是当输入错误的密码后将自动报警。系统使用单片机其中一引脚发出信号,经三极管放大后,由继电器驱动电铃实现报警功能。当用户输入密码后,单片机自动识别密码,如果密码不符,则报警。
11
图3-5 报警电路 3.6开锁机构设计
信号通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的,其原理如图3-6所示。
电返回 磁 锁 单片
机微密码正控制 确 器
开锁驱动电
路
图3-6 密码锁开锁执行电路示意图
12
当用户输入的密码正确,单片机便输出开门信号,送到开锁驱动电路,指示灯闪烁,并伴随蜂鸣器响表示锁开,同时继电器打开,从而达到开锁
-7所示。 的目的。继电器电路图如图3
图3-7 开锁驱动继电器
13
第4章 软件设计 4.1系统流程图
开始
初始化
开锁 修改
输入旧密码 N 密码正确
Y
Y 原密码相同 开锁 出错报警 N
设置密码
返回
14
4.2 软件总体设计
软件的设计主要包括:主程序、各种延时函数、密码找回程序、24C02 E2PROM存储程序、密码修改模块、矩阵键盘扫描、液晶显示函数、密码比较函数、声光控制模块。
主程序主要完成系统初始化、检查有无按键按下、按键处理、密码比较等等。主程序模块如图4-2所示:
主程序
密 扫24c02 密码液 密 描 码 储 修改晶 码 及 找 存 及开显 比 识 回 程 锁模别示 较 子程 序 块 函 函 程 序 数 数 序
图4-2 主程序模块
4.3 各子程序的设计
4.3.1 延时程序:
void DelayUs2x(unsigned char t) {
while(--t);
}
void DelayMs(unsigned char t)
15
{
while(t--)
{ / /大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
4.3.2密码找回程序:
void init_serial()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send_data(unsigned char se)
{
SBUF =se;
while(!TI)
TI=0;
}
void Password_Hint(void) {
unsigned char num,i,j,s;
unsigned char length,TLEN=3; //号码长度
unsigned char temp[16];
bit Right; //提示信息号码匹配位
LCD_Write_String(0,1," ");
while (back) //没按返回则继续则循环
{
16
if(hnit!=1) //选择按键功能
num=KeyPro(); //扫描键盘
if(num!=0xff) //如果扫描是按键有效值则进行处理
{
if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码
LCD_Write_String(0,1," ");//清除该行
if(i<16)
{
temp[i]=num;
if((num==15)||(num==10)||(num==11)||(num==12)||(num==13)||(num==14)|| (i==16))
LCD_Write_String(0,1," ");//清除该行
else
{
LCD_Write_Char(i,1,temp[i]);
delay(255);
// delay(250);
LCD_Write_Char(i,1,'*');//输入的密码用"*"代替
}
}
i++;
if((15==num)|| (i==16))
{
length=i-1; //计算输入号码长度
i=0; //计数器复位
LCD_Write_String(0,1," ");
if(length==TLEN)//长度相等则比较,否则直接输出错误
{
Right=1; //先把比较位置1
for(j=0;j
=16)) //如果按下确认键或者字数达到16
{
LCD_Write_String(0,0," ");//清除该行
PLEN=i-1; //计算输入密码长度
i=0; //计数器复位
if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误
{
Fit=1; //先把比较位置1
}
if(Fit)//如果比较全部相同,标志位置1
{
LCD_Clear();//清除该行
change=0;
WrToROM(passwordtemp1,6,6); //将修改后的新密码写入24C02中
mDelay(200);
RdFromROM(passwordtemp2,6,6); //调用存储数据
for(k=0;k0;i--) //密码修改成功后蜂鸣器短暂响一声
{
beep();
}
inputtimes=0;//输入正确则次数清零,重新计数
Fit=0; //清除正确标志
}
else
{
LCD_Write_String(0,1," ");//清除该行
LCD_Write_String(0,0,"Fail In Update! ");//密码正确显示的信息
}
}
else if(num==14) //取消该行输入
{
i=0;
LCD_Write_String(0,1," ");
}
else if((num==12)||(num==13)) //返回 并复位相应标志位
{
i=0;
LCD_Clear();
delay(5);
LCD_Write_String(0,0,"Input Password: ");
LCD_Write_String(0,1," ");
correct=0;
reback=0;
relay=1;
}
21
}
}
}
4.3.5键盘扫描程序:
#include
#include"keyboard.h"
#include"delay.h"
#define KeyPort P3
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
KeyPort=0x0f; //行线输出全为1
cord_h=KeyPort&0x0f; //读入行线值
if(cord_h!=0x0f) //先检测有无按键按下
{
DelayMs(20); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //读入行线值
KeyPort=cord_h|0xf0; //输出当前行线值
cord_l=KeyPort&0xf0; //读入列线值
while((KeyPort&0xf0)!=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
22
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0xee:return '0';break;//0 按下相应的键显示相对应的码值
case 0xde:return '1';break;//1
case 0xbe:return '2';break;//2
case 0x7e:return '3';break;//3
case 0xed:return '4';break;//4
case 0xdd:return '5';break;//5
case 0xbd:return '6';break;//6
case 0x7d:return '7';break;//7
case 0xeb:return '8';break;//8
case 0xdb:return '9';break;//9
case 0x7b:return 11; break;//11
case 0xe7:return 12; break;//12
case 0xd7:return 13; break;//13
case 0xb7:return 14; break;//14
case 0x77:return 15; break;//15
case 0xAA:return 'a';break;//a
case 0x9A:return 'b';break;//b
case 0xBA:return 'c';break;//c
case 0x3A:return 'd';break;//d
case 0xA9:return 'e';break;//e
case 0x99:return 'f';break;//f
case 0xB9:return 'g';break;//g
case 0x39:return 'h';break;//h
case 0xAB:return 'i';break;//i
case 0x9B:return 'j';break;//j
case 0x3B:return 'k';break;//k
case 0xA3:return 'l';break;//l
case 0x93:return 'm';break;//m
case 0xB3:return 'n';break;//n
case 0x33:return 'o';break;//o
default:DelayMs(100);return 0xff;break;
}
}
4.3.6调用显示程序:
23
if(i<16)
{
passwordtemp[i]=num;
if((num==15)||(num==10)||(num==11)||(num==12)||(num==13)||(num==14)||
(i==16))
LCD_Write_String(0,1," ");//清除该行
else
{
LCD_Write_Char(i,1,passwordtemp[i]);
delay(255);
LCD_Write_Char(i,1,'*');//输入的密码用"*"代替
}
}
此显示程序依次显示输入密码,按键输入一次在液晶屏的第二行显示。当输入密码号马上用‘*’代替,防止被他人窥视。
4.3.7密码比较函数:
if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误 {
Flag=1; //先把比较位置1
for(j=0;j
#include
#include"1602.h"
#include"delay.h"
#include"keyboard.h"
#include"24c02.h"
sbit BEEP=P1^5; //蜂鸣器
sbit led1=P1^6; //密码提示发送指示灯
sbit led2=P1^7; //修改密码指示灯
sbit led3=P1^4; //密码正确指示灯
sbit relay=P1^3; //继电器控制密码锁开关
sbit wp=P1^0; //24C02写保护
unsigned char code telephone[]="dk090103"; //设置找回密码的号码 unsigned char password[16]; unsigned char change,reback,back,hnit; //修改密码\密码提示\返回标志 \串口和按键的选择功能键
unsigned char correct=0; //密码正确标志 bit Fit; //修改密码成功标志
main()
{
unsigned char num,i,j,k;
unsigned char passwordtemp[16]; //最大输入16个
unsigned char number[7];
unsigned char inputtimes; //密码输入错误次数
unsigned char passwordlength,PLEN; //输入密码长度,实际密码长度
bit Flag; // 密码正确与否标志位
hnit=0;
30
PLEN=6;
wp=0;
RdFromROM(number,6,6); //调用存储数据
for(k=0;k');
if(i<=16)
{
if(k>=11)
{
k=7;
LCD_Write_String(0,0," Load ");
}
}
for(j=5;j>0;j--)
DelayMs(250);
}
for(i=10;i>0;i--)
DelayMs(250);
LCD_Write_String(0,1," 100% ");
for(i=20;i>0;i--)
DelayMs(250);
LCD_Clear();
31
delay(5);
LCD_Write_String(0,0,"Initializing ");
LCD_Write_String(0,1,"Please Waiting..");
for(i=12;i<16;i++)
{
LCD_Write_Char(i,0,'.');
for(j=5;j>0;j--)
DelayMs(250);
}
LCD_Clear();
delay(5);
LCD_Write_String(0,0," HNIE ");
LCD_Write_String(0,1,"Au:DK0901 NO.03");
for(i=20;i>0;i--)
DelayMs(250); LCD_Clear();
delay(5);
LCD_Write_String(0,0,"Micro-Computer--");
LCD_Write_String(0,1," Produing Prac. ");
for(i=20;i>0;i--)
DelayMs(250);
LCD_Write_String(0,0,"E-PassWord Lock ");
LCD_Write_String(0,1," Welcome! ");
for(i=20;i>0;i--)
DelayMs(250);
LCD_Write_String(0,0,"Enter Password: "); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入
LCD_Write_String(0,1," "); //写入第二行信息,提示输入密码
while (1) //主循环
{
if(hnit!=1) //选择按键扫描功能
num=KeyPro(); //扫描键盘
if(num!=0xff) //如果扫描是按键有效值则进行处理
{
if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码
32
LCD_Write_String(0,1," ");//清除该行
if(i<16)
{
passwordtemp[i]=num;
if((i==16)||(num==15)||(num==10)||(num==11)||(num==12)||(num==13)||(num==
14))
LCD_Write_String(0,1," ");//清除该行
else
{
LCD_Write_Char(i,1,passwordtemp[i]);
delay(250);
LCD_Write_Char(i,1,'*');//输入的密码用"*"代替
}
}
i++; //输入数值累加
if((15==num)|| (i>=16))//输入按键值15(即确认键)或者密码输入到最大值16,表示输入结束,需要进行比对
{
LCD_Write_String(0,1," ");//清除该行
passwordlength=i-1; //计算输入密码长度
i=0; //计数器复位
if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误
{
Flag=1; //先把比较位置1
for(j=0;j>>> ");//密码正确显示的信息
33
relay=0; // 密码正确 继电器控制开锁
for(i=20;i>0;i--) // 密码正确指示灯闪烁 蜂鸣器响
{
led3=~led3;
beep();
delay(100);
}
inputtimes=0;//输入正确则次数清零,重新计数
Flag=0; //清除正确标志
correct=1;
}
else
{
correct=0;
change=0;
LCD_Write_String(0,1," ");//清除该行
LCD_Write_String(0,1,"Wrong! Retry! ");//密码错误,提示重新输入
inputtimes++;//连续输入错误,则次数累加
relay=1;
if(inputtimes==3) //密码三次输错后蜂鸣器长响并锁住
{
LCD_Write_String(0,1," ");//清除该行
LCD_Write_String(0,1,"Wrong 3 times! ");//密码错误,提示重新输入
LCD_Write_String(0,0,"STOP!!! RESTART!");
relay=1;
for(i=100;i>0;i--)
{
beep();
}
while(1); //停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。
}
}
34
}
else if(num==14) //取消该行输入
{
i=0;
LCD_Write_String(0,1," ");
}
else if(num==13) //修改密码按键
{
i=0;
if(correct)
{
change=1;
reback=1;
LCD_Write_String(0,0,"Enter New Passwd"); // 输入新密码
LCD_Write_String(0,1," ");
}
else
{
LCD_Write_String(0,0,"Modify Need Open"); //若直接按下修改键,则显示需要解锁后才能修改
LCD_Write_String(0,1," ");
}
}
else if(num==12) //返回按键
{
i=0;
correct=0;
relay=1;
LCD_Clear();
delay(5);
LCD_Write_String(0,0,"Input Password: ");
LCD_Write_String(0,1," ");
}
35
else if(num==11) //密码提示按键>>实现密码丢失后找回功能
{
i=0;
LCD_Clear(); //清屏
DelayMs(10);
LCD_Write_String(0,0,"Password Hint: "); //若直接按下修改键,则显示需要解锁后才能修改
LCD_Write_String(0,1,"Telephone Num: "); //提示输入
for(j=5;j>0;j--)
delay(250);
back=1;
Password_Hint(); //进入密码找回子程序
}
if(change) //修改密码标志
{
led2 =0; //修改密码指示灯亮
LCD_Write_String(0,1," ");
modify_password(); //调用修改密码函数
led2=1; //退出修改模式指示灯灭
}
}
}
}
36
37