电子密码锁课设 下载本文

if(i==6) {

CorrectCont++;

if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁,

{

write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(LockOpen[j]); }

lock_led=1; //开锁

pass=1; //置正确标志位 TR0=1; //开启定时 open_led=0; //开锁指示灯亮 for(j=0;j<6;j++) //将输入清除 {

InputData[i]=0; } }

else //当两次正确输入时,开启重置密码功能 {

write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(SetNew[j]); }

ReInputEn=1; //允许重置密码输入 CorrectCont=0; //正确计数器清零 } }

else //当第一次使用或忘记密码时可以用131420对其密码初始化 {

if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)) {

WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储

write_1602com(er); //显示初始化密码 for(j=0;j<16;j++)

26

{

write_1602dat(initword[j]); }

Delay400Ms(); N=0; } else {

write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(Error[j]); }

pass=0; } } }

else //当已经开启重置密码功能时,而按下开锁键, {

write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(Er_try[j]); } } }

else {

//DisplayListChar(0,1,Error); write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(Error[j]); }

pass=0; }

N=0; //将输入数据计数器清零,为下一次输入作准备

operation=1; }

//==============================主函数===============================

27

void main(void) {

uchar KEY,NUM; uchar i,j; P1=0xFF;

lock_led=0; TMOD=0x11; TL0=0xB0; TH0=0x3C; EA=1; ET0=1; TR0=0;

Delay400Ms(); //启动等待,等LCM讲入工作状态 lcd_init(); //LCD初始化

write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示 for(i=0;i<20;i++) {

write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分 }

write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示

for(i=0;i<16;i++) {

write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号 }

write_1602com(er+9); //设置光标位置 write_1602com(0x0f); //设置光标为闪烁 Delay5Ms(); //延时片刻(可不要)

N=0; //初始化数据输入位数 while(1) {

KEY=keynum(); if(KEY!=0) {

NUM=coding(KEY); {

switch(NUM) {

case ('A'): ; break; case ('B'): ; break; case ('C'): ; break;

case ('D'): ResetPassword(); break; //重新设置密码

28

case ('*'): Cancel(); break; //取消当前输入

case ('#'): Ensure(); break; //确认键,

default:

{ write_1602com(er); for(i=0;i<16;i++) {

write_1602dat(Input[i]); }

operation=0;

if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。 {

InputData[N]=NUM; for(j=0;j<=N;j++) {

write_1602com(er+6+j);

write_1602dat(InputData[j]);//'*'); } N++; }

else //输入数据位数大于6后,忽略输入 {

N=6; break; } } } } } } }

//******************中断服务函数**************************** void time0_int(void) interrupt 1 {

TL0=0xB0; TH0=0x3C; countt0++;

if(countt0==20) {

29

countt0=0; second++; if(pass==1) {

if(second==1) {

open_led=1; //关指示灯 TR0=0; //关定时器

TL0=0xB0; TH0=0x3C; second=0; } } else {

if(second==3) {

TR0=0; second=0;

s3_keydown=0; TL0=0xB0; TH0=0x3C; } else

TR0=1; }

} }

30