最近按论坛上的例程,做了一个密码锁。按原例程的本意,应该是下载程序第一次使用时,要初始化密码。现在是没有初始化直接用CurrentPassword[6]数组可以打开密码锁,在打开密码锁的情况下,再次输入CurrentPassword[6]数组,可以进入更改密码画面,输入二次新密码后,显示密码更改成功,但新密码无法打开密码锁。下面是部分代码,完整的代码在这里:密码锁
- /========================重置密码==================================================
- //==================================================================================
- void ResetPassword(void)
- {
- unsigned char i;
- unsigned char j;
- if(pass==0)
- {
- pass=0;
- DisplayChar(); //显示错误
- ThreeAlam(); //没开锁时按下重置密码报警3声
- }
- else //开锁状态下才能进行密码重置程序
- {
- if(ReInputEn==1) //开锁状态下,ReInputEn置1,重置密码允许
- {
- if(N==6) //输入6位密码
- {
- ReInputCont++; //密码次数计数
- if(ReInputCont==2) //输入两次密码
- {
- for(i=0;i<6;)
- {
- if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比
- i++;
- else //如果两次的密码不同
- {
- //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]); //显示错误Error
- }
- ThreeAlam(); //错误提示
- pass=0; //关锁
- ReInputEn=0; //关闭重置功能,
- ReInputCont=0;
- DisplayChar();
- break;
- }
- }
- if(i==6)
- {
- //DisplayListChar(0,1,ResetOK);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(ResetOK[j]); //密码修改成功,显示
- }
- TwoAlam(); //操作成功提示
- WrToROM(TempPassword,0,6); //将新密码写入24C02存储
- ReInputEn=0;
- }
- ReInputCont=0;
- CorrectCont=0;
- }
- else //输入一次密码时
- {
- OneAlam();
- //DisplayListChar(0, 1, again); //显示再次输入一次
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(again[j]); //显示再输入一次
- }
- for(i=0;i<6;i++)
- {
- TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来
- }
- }
- N=0; //输入数据位数计数器清零
- }
- }
- }
- }
- //=======================输入密码错误超过三过,报警并锁死键盘======================
- void Alam_KeyUnable(void)
- {
- P1=0x00;
- {
- ALAM=~ALAM; //蜂鸣器一直闪烁鸣响
- Delay5Ms();
- }
- }
- //=======================取消所有操作============================================
- void Cancel(void)
- {
- unsigned char i;
- unsigned char j;
- //DisplayListChar(0, 1, start_line);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(start_line[j]); //显示开机输入密码界面
- }
- TwoAlam(); //提示音
- for(i=0;i<6;i++)
- {
- InputData[i]=0; //将输入密码清零
- }
- KEY=1; //关闭锁
- ALAM=1; //报警关
- pass=0; //密码正确标志清零
- ReInputEn=0; //重置输入充许标志清零
- ErrorCont=0; //密码错误输入次数清零
- CorrectCont=0; //密码正确输入次数清零
- ReInputCont=0; //重置密码输入次数清零
- s3_keydown=0;
- key_disable=0; //锁定键盘标志清零
- N=0; //输入位数计数器清零
- }
- //==========================确认键,并通过相应标志位执行相应功能===============================
- void Ensure(void)
- {
- unsigned char i,j;
- RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码
- if(N==6)
- {
- if(ReInputEn==0) //重置密码功能未开启
- {
- for(i=0;i<6;)
- {
- if(CurrentPassword[i]==InputData[i]) //判断输入密码和24c02中的密码是否相同
- {
- i++; //相同一位 i就+1
- }
- else //如果有密码不同
- {
- ErrorCont++; //错误次数++
- if(ErrorCont==3) //错误输入计数达三次时,报警并锁定键盘
- {
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Error[i]);
- }
- do
- Alam_KeyUnable();
- while(1);
- }
- else //错误次数小于3次时,锁死键盘3秒,然后重新可以输入
- {
- TR0=1; //开启定时
- key_disable=1; //锁定键盘
- pass=0; //pass位清零
- break; //跳出
- }
- }
- }
- if(i==6) //密码输入对时
- {
- if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
- {
- WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(initword[j]); //显示初始化密码
- }
- TwoAlam(); //成功提示音
- Delay400Ms(); //延时400ms
- TwoAlam(); //成功提示音
- N=0; //输入位数计数器清零
- }
- else
- {
- CorrectCont++; //输入正确变量++
- if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁
- {
- //DisplayListChar(0,1,LockOpen);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(LockOpen[j]); //显示open开锁画面
- }
- TwoAlam(); //操作成功提示音
- KEY=0; //开锁
- pass=1; //置正确标志位
- TR0=1; //开启定时
- for(j=0;j<6;j++) //将输入清除
- {
- InputData[i]=0; //开锁后将输入位清零
- }
- }
- else //当两次正确输入时,开启重置密码功能
- {
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(SetNew[j]); //显示重置密码界面
- }
- TwoAlam(); //操作成功提示
- ReInputEn=1; //允许重置密码输入
- CorrectCont=0; //正确计数器清零
- }
- }
- }
-
- else //=========================当第一次使用或忘记密码时可以用131420对其密码初始化============
- {
- if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
- {
- WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(initword[j]); //显示初始化密码
- }
- TwoAlam(); //成功提示音
- Delay400Ms(); //延时400ms
- TwoAlam(); //成功提示音
- N=0; //输入位数计数器清零
- }
- else //密码输入错误
- {
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]); //显示错误信息
- }
- ThreeAlam(); //错误提示音
- pass=0;
- }
- }
- }
- else //当已经开启重置密码功能时,而按下开锁键,
- {
- //DisplayListChar(0,1,Er_try);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Er_try[j]); //错误,请重新输入
- }
- ThreeAlam(); //错误提示音
- }
- }
- else //密码没有输入到6位时,按下确认键时
- {
- //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]); //显示错误
- }
- ThreeAlam(); //错误提示音
- pass=0;
- }
-
- N=0; //将输入数据计数器清零,为下一次输入作准备
- }
- //==============================主函数===============================
- void main(void)
- {
- unsigned char KEY,NUM;
- unsigned char i,j;
- P1=0xFF; //P1口复位
- 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<16;i++)
- {
- write_1602dat(name[i]);//向液晶屏写开机画面
- }
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(start_line[i]);//写输入密码等待界面
- }
- write_1602com(er+9); //设置光标位置
- write_1602com(0x0f); //设置光标为闪烁
- Delay5Ms(); //延时片刻(可不要)
- N=0; //初始化数据输入位数
- while(1) //进入循环
- {
- if(key_disable==1) //锁定键盘标志为1时
- Alam_KeyUnable(); //报警键盘锁
- else
- ALAM=1; //关报警
- KEY=keynum(); //读按键的位置码
- if(KEY!=0) //当有按键按下时
- {
- if(key_disable==1) //锁定键盘标志为1时
- {
- second=0; //秒清零
- }
- else //没有锁定键盘时
- {
- NUM=coding(KEY); //根据按键的位置将其编码,编码值赋值给NUM
- {
- switch(NUM) //判断按键值
- {
- case ('A'): ; break;
- case ('B'): ; break;
- case ('C'):
- write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
- for(i=0;i<16;i++)
- {
- write_1602dat(name[i]);//向液晶屏写开机画面
- }
- if(N>=1) N--; OneAlam(); //按键提示音
- //DisplayOneChar(6+N,1,'*');
- for(j=N;j<16;j++)
- {
- write_1602com(er+6+j);
- write_1602dat(' ');
- }
- for(j=0;j<N;j++)
- {
- write_1602com(er+6+j); //显示位数随输入增加而增加
- write_1602dat('*'); //但不显示实际数字,用*代替
- }
- InputData[N]=N+4;
- break; //ABC是无定义按键
- case ('D'): ResetPassword(); break; //重新设置密码
- case ('*'): Cancel(); break; //取消当前输入
- case ('#'): Ensure(); break; //确认键,
- default: //如果不是功能键按下时,就是数字键按下
- {
- //DisplayListChar(0,1,Input);
- if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
- {
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Input[i]); //显示输入画面
- }
- OneAlam(); //按键提示音
- for(j=0;j<=N;j++)
- {
- write_1602com(er+6+j); //显示位数随输入增加而增加
- write_1602dat('*'); //但不显示实际数字,用*代替
- }
- InputData[N]=NUM; //将数字键的码赋值给InputData[]数组暂存
- N++; //密码位数加
- }
- else //输入数据位数大于6后,忽略输入
- {
- N=6; //密码输入大于6位时,不接受输入
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- //*********************************中断服务函数**************************************
- void time0_int(void) interrupt 1 //定时器T0
- {
- TL0=0xB0;
- TH0=0x3C; //定时器重新赋初值
- //TR0=1;
- countt0++; //计时变量加,加1次时50ms
- if(countt0==20) //加到20次就是1s
- {
- countt0=0; //变量清零
- second++; //秒加
- if(pass==1) //开锁状态时
- {
- if(second==1) //秒加到1s时
- {
- TR0=0; //关定时器
- TL0=0xB0;
- TH0=0x3C; //再次赋初值
- second=0; //秒清零
- }
- }
- else //不在开锁状态时
- {
- if(second==3) //秒加到3时
- {
- TR0=0; //关闭定时器
- second=0; //秒清零
- key_disable=0; //锁定键盘清零
- s3_keydown=0;
- TL0=0xB0;
- TH0=0x3C; //重新赋初值
- }
- else
- TR0=1; //打开定时器
- }
-
- }
- }
复制代码
|