|
1.“輸入”按鍵:每次需要輸入密碼必須按“輸入”按鍵,否則無(wú)法輸入密碼,若輸入密碼正確,則提示正確信息,否則提示錯(cuò)誤信息并報(bào)警,10S內(nèi)不允許重新輸入密碼。
2.“確認(rèn)”按鍵:同于確認(rèn)密碼輸入完成。
3.“修改密碼”按鍵:需要修改密碼,在輸入正確密碼后可按此按鍵進(jìn)行修改。
4. 鎖的初始密碼是123456(密碼長(zhǎng)度為6位,超過(guò)6位再次輸入則無(wú)效)。
5. 開(kāi)鎖10秒后不允許更改密碼、并提示修改超時(shí)_進(jìn)入初始態(tài),需要重新輸入密碼方可再次修改密碼。
6. 系統(tǒng)未使用存儲(chǔ)器存儲(chǔ)密碼故掉電后密碼自動(dòng)恢復(fù)為初始密碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
開(kāi)機(jī)界面
輸入密碼
修改密碼
程序流程圖:
主程序
- #include"KeyBord.h"
- #include"LCD1602.h"
- #include"Timer.h"
- #include"string.h"
- sbit Unlock_Led = P2^1; //開(kāi)鎖顯示燈
- sbit Beep = P2^2; //蜂鳴器
- unsigned char Key_Num = 0; //按鍵值
- unsigned char input_flag = 0; //輸入標(biāo)志位
- unsigned char change_flag = 0; //修改密碼標(biāo)志位
- unsigned char Set_password = 0; //設(shè)定密碼
- unsigned char Pass_Num[6]; //數(shù)組用于存放輸入的密碼
- unsigned char Pass_Temp[6]; //中間變量存儲(chǔ)數(shù)組
- unsigned char Pass_Word[6] = {1,2,3,4,5,6}; //轉(zhuǎn)換成液晶顯示的字符
- void Key_Control();
- void main()
- {
- unsigned char i,j=0,num=0,count=0;
- LCD_Init(); //顯示屏初始化
- Timer0_Init(); //定時(shí)器初始化
- LCD_Write_Cmd(0x0F); //光標(biāo)閃爍
- LCD_Write_Str(0,0,"FireFly Sci&Tech"); //初始顯示界面
- LCD_Write_Str(4,1,"Welcome!");
- while(1)
- {
- Key_Num = KeyPro();
- if(time_flag) //定時(shí)器計(jì)時(shí)10S,返回初始界面
- { //關(guān)閉定時(shí)器
- TR0 = 0; //定時(shí)標(biāo)志位清零
- time_flag = 0;
- change_time =10;
- Set_password = 0;
- Unlock_Led = 0;
- Beep = 0;
- LCD_Write_Cmd(0x01); //清屏,并返回初始界面
- LCD_Write_Str(0,0,"FireFly Sci&Tech");
- LCD_Write_Str(4,1,"Welcome!");
- }
- if(Key_Num >= 12) //按鍵值是否大于12
- {
- if(Key_Num == 12) //輸入按鍵是否按下
- {
- LCD_Write_Cmd(0x01); //清屏,并進(jìn)入輸入界面
- DelayMs(5);
- LCD_Write_Str(1,0,"PassWord:");
- TR0 = 0; //關(guān)閉定時(shí)器,重新設(shè)定定時(shí)時(shí)間,
- time_flag = 0;
- change_time =10;
- input_flag = 1; //輸入標(biāo)志位置1
- Unlock_Led = 0; //開(kāi)鎖顯示燈滅
- num = 0;
- i = 0;
- }
- else if(Key_Num == 13) //確認(rèn)按鍵是否被按下
- {
- if(num == 6) //輸入密碼長(zhǎng)度是否為6位
- {
- if(change_flag) //修改密碼標(biāo)志位真
- {
- change_flag = 0;
- for(j = 0; j < 6; j++) //將密碼從中間數(shù)組導(dǎo)入密碼存儲(chǔ)數(shù)組
- {
- Pass_Word[j] = Pass_Temp[j];
- }
- LCD_Write_Cmd(0x01); //清屏,并進(jìn)入密碼修改成功界面
- LCD_Write_Str(2, 0, "SET Success!");
- }
- else if(input_flag)
- {
- if(memcmp(Pass_Num, Pass_Word, 6) == 0) //將輸入的密碼與設(shè)置的密碼進(jìn)行比對(duì)
- {
- LCD_Write_Cmd(0x01); //清屏,并進(jìn)入密碼輸入正確界面
- LCD_Write_Str(1, 0, "PassWord Right");
- LCD_Write_Str(2, 1, "Door unlock");
- Set_password = 1; //設(shè)定密碼,10秒內(nèi)可修改
- Unlock_Led = 1; //開(kāi)鎖顯示燈亮
- input_flag = 0;
- }
- else
- {
- LCD_Write_Cmd(0x01); //清屏,并進(jìn)入密碼輸入錯(cuò)誤界面
- DelayMs(5);
- LCD_Write_Str(1, 0, "PassWord Error");
- change_time =10;
- TR0 = 1;
- Unlock_Led = 0;
- while(!time_flag)
- {
- Unlock_Led = ~Unlock_Led;
- Beep = ~Beep; //板子為無(wú)源蜂鳴器
- DelayUs2x(100);
- }
- }
- }
- change_time =10; //重新賦值定時(shí)時(shí)間,開(kāi)定時(shí)器,輸入計(jì)數(shù)和顯示位置計(jì)數(shù)清零
- TR0 = 1;
- num = 0;
- i = 0;
- }
- }
- else if(Key_Num == 14) //修改密碼按鍵
- {
- if(Set_password) //如果在設(shè)定密碼時(shí)間內(nèi)
- {
- LCD_Write_Cmd(0x01); //清屏,進(jìn)入修改密碼界面
- DelayMs(5);
- LCD_Write_Str(1, 0, "New PassWord:");
- TR0 = 0;
- time_flag = 0;
- change_time =10;
- change_flag = 1;
- input_flag = 0;
- Set_password = 0;
- num = 0;
- i = 0;
- }
- }
- else if(Key_Num == 15) //取消修改密碼
- {
- if(change_flag)
- {
- LCD_Write_Cmd(0x01);
- DelayMs(5);
- LCD_Write_Str(1, 0, "Cancel Change!");
- TR0 = 1;
- change_flag = 0;
- num = 0;
- i = 0;
- }
- }
- }
- else if(Key_Num <= 9)
- {
- if(num < PASS_NUM) //輸入密碼計(jì)數(shù)小于6
- {
- if(input_flag) //輸入密碼標(biāo)志位
- {
- Pass_Num[num] = Key_Num;
- LCD_Write_Char(3 + i, 1, '*');//依次顯示輸入字符
- }
- else if(change_flag) //修改密碼標(biāo)志位
- {
- Pass_Temp[num] = Key_Num;
- LCD_Write_Char(3 + i, 1, ('0' + Pass_Temp[num]));//依次顯示輸入字符
- }
- num++;
- i++;
- }
- }
- }
- }
復(fù)制代碼
Keil代碼與Proteus8.8仿真下載:
電子密碼鎖.rar
(542.69 KB, 下載次數(shù): 294)
2021-12-20 17:27 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|