单片机电子密码锁
程序.rar
(56.65 KB, 下载次数: 10)
主程序预览
- #include<reg52.h>
- #include"lcd1602.h"
- #include"4x4key.h"
- #include"24c02.h"
- #define uchar unsigned char
- sbit Beep=P2^5; //蜂鸣器端口
- sbit SUO=P2^6; //开锁端口
- uchar Kflag=0; //记录按键的次数
- uchar Buffer[6]={0}; //用来读出AT24C02中所存的数据(即所谓的密码)
- uchar ABuffer[6]={0}; //用来从键盘所输入的键值
- uchar ABCBuffer[6]={0}; //用来改密码时候,存储第一次新密码的数组,好与第二次输入的新密码做比较
- uchar keytmp; //用来读取按下的键值
- uchar j,m,n,counter,k,Sflag,Nflag; //程序中用到的变量
- bit Aflag=0; //用来第一次输入新密码后按下确认键后执行所对应的程序断的标记
- bit Qflag=0; //用来第二次输入新密码后按下确认键后执行所对应的程序断的标记
- void beep() //蜂鸣器响一定时间函数
- {
- for (k=0;k<100;k++)
- {
- mDelay(100);
- Beep=!Beep; //BEEP取反
- }
- Beep=1; //关闭蜂鸣器
- mDelay(250); //延时250毫秒
- }
- void main()
- {
- SUO=1;
- LCD_Initial();
- LCD_Print(1,0,"Input SCode:");
- while(1) //按键扫描循环
- {
- if(Key_Down()==1) // 如果有键按下
- { keytmp=Key_Code(); //获取输入的键值
- if(keytmp>=0&&keytmp<=9)
- { while(Key_Down()==1) {;} //在按键释放的时候(这句很关键。)
- Kflag++;
- switch(Kflag) //密码显示字符选择语句
- {
- case 1: LCD_Print(5,1,"*"); ABuffer[0]=keytmp; break;
- case 2: LCD_Print(5,1,"**"); ABuffer[1]=keytmp; break;
- case 3: LCD_Print(5,1,"***"); ABuffer[2]=keytmp; break;
- case 4: LCD_Print(5,1,"****"); ABuffer[3]=keytmp; break;
- case 5: LCD_Print(5,1,"*****"); ABuffer[4]=keytmp; break;
- case 6: LCD_Print(5,1,"******");ABuffer[5]=keytmp; break;
- }
-
- }
- if(keytmp==14) //确认键代码
- {
- if(Nflag!=1&&Nflag!=2) //判断密码输入是否正确复合语句和在
- { //改密码是判断输入旧密码是否正确
- RdFromROM(Buffer,0,6); //读取AT24C02中的密码
- for(j=0;j<6;j++)
- {
- mDelay(200);
- if(Buffer[j]!=ABuffer[j]) {LCD_ClrScreen();LCD_Print(1,1," Input Error!");counter++;break;}
- else if(j==5&&Sflag==0) {LCD_ClrScreen();LCD_Print(1,0," Welecome!"); LCD_Print(1,1,"Open Door!");SUO=0;counter=0;}
- else if(j==5&&Sflag==1) { mDelay(100);LCD_ClrScreen();LCD_Print(1,0," Input NewSecret");Nflag=1;Kflag=0;Aflag=1;}
- }
- }
- if(Kflag==6&&Aflag==1) //第一次输入新密码并存储在一个数组中
- { //以便第二次输入新密码与前一次比较是否
- for(m=0;m<6;m++) //两次输入的密码正确
- {
- ABCBuffer[m]=ABuffer[m];
- }
- mDelay(100);LCD_ClrScreen();LCD_Print(1,0," Input ANewSecret");Kflag=0;Aflag=0;Qflag=1;Nflag=2;
- }
- if(Kflag==6&&Qflag==1) //第二次新密码与第一次新密码比较复合语句
- { //如果正确则把新密码写入到AT24C02中。
- for(n=0;n<6;n++)
- { mDelay(200);
- if(ABCBuffer[n]!=ABuffer[n]) {LCD_ClrScreen();LCD_Print(1,0," Input NError!");counter++;break;}
- else if(n==5) {WrToROM(ABCBuffer,0,6);mDelay(100);LCD_ClrScreen();LCD_Print(1,0," NCode SetSuccess");Kflag=0;counter=0;Qflag=0;break;}
- }
- }
- //如果密码输入不正确,就重新输入,如果次数超过3次就报警(即蜂鸣器响)
- if(counter==1){mDelay(2000);LCD_ClrScreen();if(Qflag==1)LCD_Print(1,0," Input ANewSecret");else LCD_Print(1,0," Input Again:");Kflag=0;}
- if(counter==2){mDelay(2000);LCD_ClrScreen();if(Qflag==1)LCD_Print(1,0," Input ANewSecret");else LCD_Print(1,0," Input Again:");Kflag=0;}
- if(counter==3){mDelay(2000);LCD_ClrScreen(); LCD_Print(1,0," Input Too");LCD_Print(2,1,"Many Times!");beep();}
- }
- if(keytmp==15) //重设密码键代码同时使相应的标记复位
- {
- LCD_ClrScreen();LCD_Initial();LCD_Print(1,0," Input OldSecret");Nflag=0;Kflag=0;Sflag=1;
-
- }
- if(keytmp==11) //清除前面字符键代码
- { while(Key_Down()==1) {;} //在按键释放的时候(这句很关键。)
- Kflag--;
- ABuffer[Kflag+1]=0;
- switch(Kflag)
- {
- case 0: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); break;
- case 1: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"*"); break;
- case 2: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"**"); break;
- case 3: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"***"); break;
- case 4: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"****"); break;
- case 5: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"*****"); break;
- case 6: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input SCode:"); LCD_Print(5,1,"******"); break;
- }
- }
- /* if(keytmp==12) {} //可以新增加功能的键
- if(keytmp==13) {}*/
- //返回键代码和全部标记复位
- if(keytmp==10) {SUO=1;Kflag=0;Sflag=0;Nflag=0;counter=0;Aflag=0;Qflag=0;mDelay(200);LCD_ClrScreen();LCD_Print(1,0," Input SCode:");} //返回键代码
- }
- }
- }
复制代码
|