资源描述
长沙航空职业技术学院 声像0901 唐斌 王林达 许涛涛
《电子密码锁》
项
目
资
料
班级: 声像0901
指导老师: 蒋雄
组长: 唐斌
组员: 唐斌 王林达 许涛涛
基于单片机设计的电子密码锁
摘要:本设计主要是基于AT89S52芯片为核心的电子密码锁,并有AT24C02、4x4矩阵键盘、79LS164、数码管等器件组成,包括单片机系统、开锁电路、报警电路、LCD显示电路。主要实现掉电存储、成功开锁显示、任意设定6-16位长度的密码、声光指示等功能。依据实际的情况还可以添加红外遥控,备用电源功能。本系统成本低廉,功能实用。
关键词:AT89S52 AT24C02 4x4矩阵键盘 掉电存储 LCD显示电路
1 引言
随着人们生活水平的提高以及社会的发展,如何实现日常生活的安全这一问题也变的尤为重要,传统的机械锁由于其构造的简单,保密性并不高。现在,随着电子工业的发展,单片机技术已经深入到了人们生活的各个层面及领域,各种各样的电子产品也正在日新月异地向着高、精、尖技术发展。在安全技术防范领域,出于安全方面的需要性,许多电子密码锁已相继问世。由于其保密性高,使用灵活好,安全系数高,受到了广大用户的信赖。本文主要使用以AT89S52为核心的单片机设计编程,来实现控制开锁、掉电存储、超时报警、声光指示、液晶显示等功能。
1.1使用说明书
1.密码设置
初始密码通过密码修改程序用单片机写入E2PROM存储器,初始密码为20101214
2.密码修改
当需要修改密码时,先输入原始密码,单击确定按钮确认后,系统先进行密码校验,如果正确则显示“New Password ”,然后输入新的6-16位数密码,再单击确定按钮,然后系统会提示再次输入新密码,再单击确定按钮,如果两次新密码一致则提示密码修改成功
3.密码存储
由键盘输入的密码存储在E2PROM则存储着系统设置的密码,掉电后密码依然还在,这就是采用E2PROM的优点。
4.本机键开锁
输入正确的密码后,单击OK按钮,系统显示“Welcome!”的欢迎信息,同时输出指示灯LED点亮,驱动电控锁机构完成开锁动作。
5.密码错误报警
当输入的密码不正确时,系统显示“Wrong password”,然后输入次数加1,返回等待继续输入密码,当输入错误的密码达3次后,系统显示“Lock”,系统同时发出报警,驱动蜂鸣器发出报警声。当系统锁定时所有按键无效,只有等待一定时间后,系统才会恢复正常状态
6.密码显示
正常情况下,系统显示“Input Password ”,在每输入一位密码系统先显示数字后显示一个“*”,掩盖掉当前输入的密码,所以可以防止密码信息泄露而比较安全。
2 总体设计方案
2.1 设计思路
l 本设计主要是以AT89S52为核心编程来实现对整个电路各个部分的控制。
l 其中使用AT24C02来实现模拟I2C的功能,当设定密码时,将其传入AT24C02中,这样在失电时仍然能记忆其中的值,从而实现掉电存储,这样在再次上电输入密码时,将其和AT24C02中存储的密码进行比较,若密码一致便实现开锁,
l 由于电路所使用的按键比较多,因此利用AT89S52的8个口来设计4x4矩阵键盘,其中0-9键分配为数字键,10-15键分配为功能键,依次为复位、退出、密码修改、删除、确定键。
l 当输入密码正确时,使单片机给开锁驱动电路提供驱动信号,从而实现成功开锁。
l 当输入密码连续三次输入错误时,利用单片机发出的信号驱动报警电路来实现报警并且锁定键盘,此时只有等待一定时间才实现键盘的解锁。
2.2 电路原理方框图
开锁驱动电路
AT89S51
单片机
AT24C02存储
LCD显示电路
矩阵键盘电路
指示电路
错误锁定键
延时报警电路
图1 电路方框图
开始
2.3设计流程图
初始化
调用显示
Y
N
有键按下?
键值识别
N
数字键?
存储键值
Y
Y
是否确定键?
密码错误显示
N
Y
密码正确?
记录错误次数
Y
N
Y
N
>3次?
Y
驱动开锁程序
开锁
锁定
延时
报警
复位
延时
解锁
改密键按下
提示输入旧密码
旧密码验证
按键扫描
OK键按下
密码错误
记录错误次数
大于等于3次?
锁定
Y
N
报警
延时
解锁
密码正确
提示输入新密码
OK键按下
提示再次输入新密码
OK键按下
两次新密码是否一致?
是
否
密码修改成功
改密键再次按下
退出改密模式
密码修改流程图
3 设计原理分析
3.1 单片机最小系统
其作用主要是为了保证单片机系统能正常工作。如图2所示,单片机最小系统主要由AT89S52单片机、外部振荡电路、复位电路和+5V电源组成。在外部振荡电路中,单片机的XTAL1和XTAL2管脚分别接至由12MHZ晶振和两个30PF电容构成的振荡电路两侧,为电路提供正常的时钟脉冲。在复位电路中,单片机RESET管脚一方面经22F的电容接至电源正极,实现上电自动复位,另一方面经一个按键和两个大小分别为200和1K的电阻分别接至电源正极和电源地,实现手动复位。其主要功能是把PC初始化为0000H,是单片机从0000H单元开始执行程序,除了进入系统的初始化之外,当由于程序出错或者操作错误使系统处于死锁状态时,为了摆脱困境,也需要按复位键重新启动,因此,复位电路是单片机系统中不可缺少的一部分。
图2 单片机最小系统
3.2 矩阵键盘电路
键盘可以分为独立连接式和行列式(矩阵式)两类。根据设计要求,本电路设计采用4×4行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目。
矩阵式键盘又叫行列式键盘。用I/O口线组成行列结构,按键设置在行列的交叉点上。本电路采用4条行线和4条列线,即可组成具有4×4个按键的键盘。其电路图如下图3所示。
对键的识别通常用逐行扫描查询法。首先判别键盘中有无按键按下,由单片机I/O口向键盘送(输出)全扫描字,然后读入(输入)列线状态来判断。方法是:向行线输出全扫描字00H,把全部行线置为低电平,然后将列线的电平状态读入累加器A中。如果有键按下,总会有一根列线电平拉至低电平,从而使列输入不全为1。键盘中哪一个键按下,是由行线逐行置低电平后,检查列输入状态实现的,其方法是:依次给行线送低电平,然后查所有列线状态,如果全为1,则所按下的键不在此行,如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。
图3 矩阵电路
其工作原理为:将P3.0口置低电平,即第4行变为低电平,其余置高电平时输出编码为1110,然后读取列方法同上。判别第4行是否有键按下,在第4行上若有一按键按下,则相应的列被拉到低电平,则表示第4行和此列相交的位置上有按键按下,若没有任一列线为低电平,则说明第4行上无键按下,其余按键方法同上。
3.3 报警电路
图4 报警电路
报警电路由一个蜂鸣器、一个8550三极管和一个5.1K的电阻构成,接在单片机的P2.6管脚,如图4所示,当密码的输入时间超过12秒或者连续3次输入失败,需要由报警来提示。本设计的报警电路由蜂鸣器及其驱动电路组成。其电路图如图4所示。P2.6口接晶体管基极输入端。当密码锁电路需要发出报警信号时,P2.6口输出低电平0,使晶体管导通,从而驱动蜂鸣器鸣叫;当密码锁没有报警信号时,P2.6口输出高电平1时,三极管截止,蜂鸣器停止发声。
3.4 AT24C02掉电存储单元
掉电存储单元的作用是在电源断开的时候,存储当前设定的密码值。AT24C02是ATMEL公司生产的2KB电可擦除存储芯片,采用两线串行的总线和单片机通信,电压最低可以到2.5V,额定电流为1mA,静态电流10A(5.5V),芯片内的资料可以在断电的情况下保存40年以上,采用8脚的DIP封装,使用方便。其电路如图5所示:
图中上拉电阻的作用是减少AT24C02的静态功耗,由于AT24C02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数。每当成功修改一次密码,系统就自动调用存储程序,将新密码保存在芯片内;当系统需要进行密码识别时,通过程序读取存储器中的密码值存入缓冲区,与所输入密码进行比较,完成密码锁的开锁控制。
图5 掉电存储电路
l 简介IIC总线
(1)IIC总线特点
I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25
英尺,并且能够10Kbps的最大传输速率支持40个组件。IIC总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能
够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
(2)IIC总线工作原理
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,IIC总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
(3)IIC总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
l 24C02芯片的读写
(1)24C02的引脚排列
(2)24C02的引脚说明
(3)与24C02有关的三个时序
◆启动和结束时序
◆应答时序
◆完整的数据传送时序
3.5 LCD显示电路
图6 LCD显示电路
图7
该系统采用1602工业字符型液晶,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。本系统采用长沙太阳人电子有限公司的1602字符型液晶显示器。一般1602字符型液晶显示器实物如图7所示
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:
图8 1602LCD尺寸图
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
表1:引脚接口说明表
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如下表所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
表2
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
与HD44780相兼容的芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
表3基本操作时序表
读写操作时序如图7和8所示:
图7 读操作时序
图8 写操作时序
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
3.6 开锁电路
当用户输入的密码正确时,由单片机发出开锁信号,送到开锁驱动电路,然后驱动电磁锁吸合,从而达到开锁的目的。其电路图如下图7所示。
本电路由驱动和开锁两级组成。由三极管8550组成驱动电路。LED作为开锁的提示。其中二极管是为了消除继电器和电磁锁可能产生的反向高电压以及可能产生的电磁干扰。本设计中,基于节省材料的原则,暂时用发光二极管代替电磁锁,发光管亮,表示开锁;灭,表示没有开锁。
图9 开锁电路
4程序
(1)主函数
#include<reg52.h>//头文件
#include<1602.h>//1602的头文件
#include<IIC.h>//IIC协议头文件
#include<key.h>//矩阵键盘头文件
#include<changepassword.h>//密码修改头文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
sbit kaisuo=P2^7;//开锁信号
uchar code table2[]="Input Password";//输入密码
uchar code table3[]="Welcome";//等待
uchar code open[]="Open";
void main()
{init1();//IIC初始化
IIC(20);
IIC(28);
IIC(36);
IIC(44);
IIC(48);
keynum=0;
gaiminum=0;
Errornum=0;
h=0;
k=0;
kaisuo=1;
b=0;
write_com(0x38);//显示模式设置;
write_com(0x0c);//开显示,关光标,光标不闪烁;
write_com(0x04);//整屏显示不移动
write_com(0x01);
while(1){for(b=0;b<14;b++)
{
write_com(0x81+b);
write_data(table2[b]);}
key();
key1();
changepassword();//密码修改
if(ok==1){delay2(10);
if(ok==1)
{while(!ok);//消抖
confirm();//密码匹配
if(k==16)
{kaisuo=0;//开锁
keynum=0;//按键次数清零
k=0;
IIC(20);
IIC(28);//IIC清除
write_com(0x01);//清屏
for(b=0;b<7;b++)
{write_com(0x84+b);
write_data(table3[b]);
} //显示Welcome
jingbao=0;
delay2(100);
jingbao=1;
delay2(100);
jingbao=0;
delay2(100);
jingbao=1;
delay2(6000);
delay2(3000);//延时
kaisuo=1;
Errornum=0;
}
else {
keynum=0;
k=0;
write_com(0x01);
IIC(20);
IIC(28);
IIC(36);
IIC(44);//IIC清除
Errornum++;//清屏
for(b=0;b<14;b++)
{write_com(0x81+b);
write_data(table8[b]);
}
jingbao=0;
delay2(200);
jingbao=1;
delay2(800);
if(Errornum>=3){write_com(0x01);
for(b=0;b<4;b++)
{write_com(0x86+b);
write_data(table7[b]);
}//Wrong password
Errornum=0;
jingbao=0;//发出警报
for(b=0;b<20;b++){
delay2(6000);
}
jingbao=1; }//延时锁定
}
}}
}
}
(2)1602头文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,0x3a,0x2d,0x20,0x2a};//建表("0x30"对应数字"0")
void delay2(uint z)
{uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);}//延时子函数
void write_com(uchar com)//写指令
{
RS=0;
RW=0;
P0=com;
E=0;
delay2(2);
E=1;
delay2(1);
E=0;
delay2(2);
}
void write_data(uchar date)//写数据
{ RS=1;
RW=0;
P0=date;
E=0;
delay2(2);
E=1;
delay2(1);
E=0;
delay2(2);
}
void display(uchar dizhi,uchar num)
{ write_com(dizhi);
write_data(table[num]);
}//1602的显示
(3)IIC协议头文件
sbit sda=P2^4;
sbit scl=P2^3;
void delay1()
{ ; ;}
void start()//开始
{
sda=1;
scl=1;
delay1();
sda=0;
delay1();
}
void stop()//停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void ask()
{
uchar i;
scl=1;
delay1();
if((sda==1)&&(i<1))
i++;
sda=0;
scl=0;
delay1();
}
void init1()
{
sda=1;
delay1();
scl=1;
delay1();
}//初始化
void write_byte(uchar aa)
{
uchar temp ,i;
temp=aa;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
}
scl=0;
delay1();
sda=1;
delay1();
}
uchar read_byte()
{
uchar j,k;
scl=0;
delay1();
sda=1;
delay1();
for(j=0;j<8;j++)
{
scl=1;
delay1();
k=(k<<1)|sda;
scl=0;
delay1();
}
return k;
}
uchar read_add(uchar addrss)
{
uchar shuju;
start();
write_byte(0xa0);
ask();
write_byte(addrss);
ask();
start();
write_byte(0xa1);
ask();
shuju=read_byte();
stop();
return shuju;
}
void write_add(uchar addrss ,uchar date)
{
start();
write_byte(0xa0);
ask();
write_byte(addrss);
ask();
write_byte(date);
ask();
stop();
}
(4)矩阵键盘头文件
#define uchar unsigned char
uchar keynum,gaimi,ok,c,num,shanchu;
sbit d0=P3^0;
sbit d1=P3^1;
sbit d2=P3^2;
sbit d3=P3^3;
sbit d4=P3^4;
sbit d5=P3^5;
sbit d6=P3^6;
sbit d7=P3^7;//位定义
void key1()
{
if(c==1){delay2(10);
if(c==1){while(!c);
write_add(keynum+20,num);//存入IIC(起始地址20)
delay2(100);
display(0x80+0x40+keynum,read_add(keynum+20));//显示IIC存储器的内容
delay2(250);
display(0x80+0x40+keynum,13);//输入时显示"*"
shanchu=0;//删除时要用的变量
keynum++;
if(keynum==17){keynum=0;
}
}
}
}//储存键盘按键
void key2()
{
if(c==1){delay2(10);
if(c==1){while(!c);
write_add(keynum+40,num);//存入IIC(起始地址40)
delay2(100);
display(0x80+0x40+keynum,read_add(keynum+40));//显示IIC存储器的内容
delay2(250);
display(0x80+0x40+keynum,13);//输入时显示"*"
shanchu=1;//删除时要用的变量
keynum++;
if(keynum==17){keynum=0;
}
}
}
}//存储第二次新密码
void key()//键盘扫描
{c=0;
gaimi=0;
ok=0;
d3=0;d0=d1=d2=1;//第一行
if(d4==0){delay2(10);if(d4==0){while(!d4){}
num=6;c=1;}
}//第一列
if(d5==0){delay2(10);if(d5==0){while(!d5){}
num=2; c=1; }
}//第二列
if(d6==0){delay2(10);if(d6==0){while(!d6);
gaimi=1;}
}//第三列
if(d7==0){delay2(10);if(d7==0){while(!d7);
ok=1; }//确定键
}//第四列
d2=0;d0=d1=d3=1;//第二行
if(d4==0){delay2(10);if(d4==0){while(!d4);
num=7;c=1; }
}//第一列
if(d5==0){delay2(10);if(d5==0){while(!d5);
num=3;c=1; }
}//第二列
if(d6==0){delay2(10);if(d6==0){while(!d6);
keynum--;//按键次数减1,(即下次按键重该位置继续显示)
if(shanchu==1){write_add(keynum+40,0xff);}//IIC数据清除(用于第二次新密码)
else{write_add(keynum+20,0xff);}//IIC数据清除(用于第一次新密码与旧密码)
display(0x80+0x40+keynum,12);//删除后显示空格
if(keynum==-1){keynum=0;}
}
}//第三列
d1=0;d0=d2=d3=1;//第三行
if(d4==0){delay2(10);if(d4==0){while(!d4);
num=8;c=1;}
}//第一列
if(d5==0){delay2(10);if(d5==0){while(!d5);
num=4;c=1; }
}//第二列
if(d6==0){delay2(10);if(d6==0){while(!d6);
num=0;c=1; }
}//第三列
d0=0;d1=d2=d3=1;//第四行
if(d4==0){delay2(10);if(d4==0){while(!d4);
num=9;c=1;}
}//第一列
if(d5==0){delay2(10);if(d5==0){while(!d5);
num=5;c=1; }
}//第二列
if(d6==0){delay2(10);if(d6==0){while(!d6);
num=1;c=1;}}
//第四列
}
(5)修改密码头文件
uchar a,b,c,k,f,h,Backspace,gaiminum,Errornum,oknum,gaimikeynum=0;
uchar d[16];
uchar code table4[]="Old Password";
uchar code table5[]="New Password";
uchar code table6[]="Input again";
uchar code table7[]="Lock";//锁定
uchar code table8[]="Wrong password";//密码错误
uchar code table9[]="Input again";
uchar code table11[]="Password Changed";//密码修改成功成功
uchar code table12[]="Different Passwords";//密码不一致
uchar code table1[]="too simple ";
sbit jingbao=P2^6;//警报信号
void IIC(uchar dizhi)
{
展开阅读全文