|
單片機(jī)電子密碼鎖
程序.rar
(56.65 KB, 下載次數(shù): 10)
2016-12-7 16:16 上傳
點(diǎn)擊文件名下載附件
主程序預(yù)覽
- #include<reg52.h>
- #include"lcd1602.h"
- #include"4x4key.h"
- #include"24c02.h"
- #define uchar unsigned char
- sbit Beep=P2^5; //蜂鳴器端口
- sbit SUO=P2^6; //開(kāi)鎖端口
- uchar Kflag=0; //記錄按鍵的次數(shù)
- uchar Buffer[6]={0}; //用來(lái)讀出AT24C02中所存的數(shù)據(jù)(即所謂的密碼)
- uchar ABuffer[6]={0}; //用來(lái)從鍵盤所輸入的鍵值
- uchar ABCBuffer[6]={0}; //用來(lái)改密碼時(shí)候,存儲(chǔ)第一次新密碼的數(shù)組,好與第二次輸入的新密碼做比較
- uchar keytmp; //用來(lái)讀取按下的鍵值
- uchar j,m,n,counter,k,Sflag,Nflag; //程序中用到的變量
- bit Aflag=0; //用來(lái)第一次輸入新密碼后按下確認(rèn)鍵后執(zhí)行所對(duì)應(yīng)的程序斷的標(biāo)記
- bit Qflag=0; //用來(lái)第二次輸入新密碼后按下確認(rèn)鍵后執(zhí)行所對(duì)應(yīng)的程序斷的標(biāo)記
- void beep() //蜂鳴器響一定時(shí)間函數(shù)
- {
- for (k=0;k<100;k++)
- {
- mDelay(100);
- Beep=!Beep; //BEEP取反
- }
- Beep=1; //關(guān)閉蜂鳴器
- mDelay(250); //延時(shí)250毫秒
- }
- void main()
- {
- SUO=1;
- LCD_Initial();
- LCD_Print(1,0,"Input SCode:");
- while(1) //按鍵掃描循環(huán)
- {
- if(Key_Down()==1) // 如果有鍵按下
- { keytmp=Key_Code(); //獲取輸入的鍵值
- if(keytmp>=0&&keytmp<=9)
- { while(Key_Down()==1) {;} //在按鍵釋放的時(shí)候(這句很關(guān)鍵。)
- Kflag++;
- switch(Kflag) //密碼顯示字符選擇語(yǔ)句
- {
- 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) //確認(rèn)鍵代碼
- {
- if(Nflag!=1&&Nflag!=2) //判斷密碼輸入是否正確復(fù)合語(yǔ)句和在
- { //改密碼是判斷輸入舊密碼是否正確
- 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) //第一次輸入新密碼并存儲(chǔ)在一個(gè)數(shù)組中
- { //以便第二次輸入新密碼與前一次比較是否
- 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) //第二次新密碼與第一次新密碼比較復(fù)合語(yǔ)句
- { //如果正確則把新密碼寫入到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;}
- }
- }
- //如果密碼輸入不正確,就重新輸入,如果次數(shù)超過(guò)3次就報(bào)警(即蜂鳴器響)
- 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) //重設(shè)密碼鍵代碼同時(shí)使相應(yīng)的標(biāo)記復(fù)位
- {
- LCD_ClrScreen();LCD_Initial();LCD_Print(1,0," Input OldSecret");Nflag=0;Kflag=0;Sflag=1;
-
- }
- if(keytmp==11) //清除前面字符鍵代碼
- { while(Key_Down()==1) {;} //在按鍵釋放的時(shí)候(這句很關(guān)鍵。)
- 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) {}*/
- //返回鍵代碼和全部標(biāo)記復(fù)位
- 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:");} //返回鍵代碼
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|