#include <REGX51.H>#include "LCD1602.H"#include "KeyBoard4x4.h"#include "EEPROM.h"#include "Timer0.h"sbit RELAY = P3^7; //--- 定義的繼電器引腳 ---struct STRUCT_TIMER LockKeyBoardTimer,RelayTimer;//========================================================================================================//--- 定義與密碼相關結構體變量 ---struct STRUCT_PASSWORD{ unsigned char Status; unsigned char ErrCnt; unsigned char Pointer; unsigned char Buffer[6]; unsigned char OldBuffer[6]; unsigned char NewBuffer[6];};struct STRUCT_PASSWORD Password;//========================================================================================================//--- main()主程序區 ---void main(void){ unsigned char i,KeyValue; LCD_Init(); // --- 初始化1602液晶模塊 --- LCD_PutChar(0,0,'A'); LCD_PutString(0,0," Input Password "); T0_Init(); EA = 1; for(i=0;i<sizeof(Password.OldBuffer);i++) Password.OldBuffer[i] = IAPReadByte(i); while(1) { if(0 == RELAY) { if(0 == RelayTimer.Enable)RELAY = 1; //--- 繼電器動作時間到,則恢復原位 --- } if(Password.ErrCnt > 2) //--- 密碼輸錯三次,鎖鍵盤 --- { if(0 == LockKeyBoardTimer.Enable)Password.ErrCnt = 0; //--- 鎖鍵盤時間到,解鎖 --- } else { KeyValue = KeyBoard4x4_Scan(); if(KeyValue < 16) //--- 識別出有效的按鍵 --- { if(KeyValue < 10) //--- 當前按鍵是數字“0~9”鍵 --- { if(Password.Pointer < sizeof(Password.Buffer)) //--- 若輸入的密碼少于指定的長度 --- { LCD_PutChar(1,Password.Pointer + 5,'*'); //--- 顯示“*” --- if(2 == Password.Status) Password.NewBuffer[Password.Pointer] = KeyValue; Password.Buffer[Password.Pointer ++] = KeyValue; //--- 裝入密碼輸入緩沖區 --- } } else if(11 == KeyValue) //--- 當前按鍵是“B”鍵,用于修改密碼 --- { LCD_PutString(0,0," Old Password "); //--- 顯示輸入舊密碼 --- LCD_PutString(1,0," "); //--- 清顯示區域 --- Password.Pointer = 0; Password.Status = 1; } else if(14 == KeyValue) //--- 當前按鍵是“*”鍵 --- { LCD_PutString(1,0," "); //--- 清顯示區域 --- Password.Pointer = 0; } //--- 清密碼輸入計數變量 --- else if(15 == KeyValue) //--- 當前按鍵是“#”鍵 --- { switch(Password.Status) { case 0: //--- 密碼輸入狀態 --- case 1: if(Password.Pointer < sizeof(Password.Buffer)) //--- 輸入的密碼長度不夠 --- { LCD_PutString(1,0," Password Error "); //--- 顯示密碼錯誤信息 --- if(++ Password.ErrCnt > 2) //--- 若超過3次 --- { LockKeyBoardTimer.Interval = 60000; //--- 置鎖鍵盤時間為1分鐘 --- LockKeyBoardTimer.Enable = 1; } } else { for(i=0;i<sizeof(Password.Buffer);i++) //--- 密碼比較 --- { if(Password.Buffer[i] != Password.OldBuffer[i]) //--- 若不正確,則退出下面的比較 --- { i = sizeof(Password.Buffer) + 2; } } if(i > sizeof(Password.Buffer)) { LCD_PutString(1,0," Password Error "); //--- 顯示密碼錯誤信息 --- if(++ Password.ErrCnt > 2) //--- 若超過3次 --- { LockKeyBoardTimer.Interval = 60000; //--- 置鎖鍵盤時間為1分鐘 --- LockKeyBoardTimer.Enable = 1; } } else { LCD_PutString(1,0," Password Right "); //--- 顯示密碼輸入正確信息 --- Password.ErrCnt = 0; if(0 == Password.Status)RELAY = 0; //--- 發出打開動作 --- else if(1 == Password.Status) { LCD_PutString(0,0," New Password "); //--- 顯示輸入舊密碼 --- LCD_PutString(1,0," "); //--- 清顯示區域 --- Password.Pointer = 0; Password.Status = 2; } if(0 == Password.Status) { RelayTimer.Interval = 60000; RelayTimer.Enable = 1; } } } break; case 2: //--- 輸入新密碼狀態 --- LCD_PutString(0,0," Input Again "); //--- 顯示輸入舊密碼 --- LCD_PutString(1,0," "); //--- 清顯示區域 --- Password.Pointer = 0; Password.Status = 3; break; case 3: //--- 比較兩次輸入的密碼正確性 --- for(i=0;i<sizeof(Password.Buffer);i++) //--- 密碼比較 --- { if(Password.Buffer[i] != Password.NewBuffer[i]) //--- 若不正確,則退出下面的比較 --- { i = sizeof(Password.Buffer) + 2; } } if(i > sizeof(Password.Buffer)) { LCD_PutString(1,0," Compare Error "); //--- 顯示密碼比較錯誤信息 --- Password.Status = 0; //--- 回到原始狀態 --- } else { LCD_PutString(1,0," Compare Right "); //--- 顯示密碼比較正確信息 --- for(i=0;i<sizeof(Password.NewBuffer);i++) //--- 將新密碼寫入EEPROM --- IAPProgramByte(i,Password.NewBuffer[i]); for(i=0;i<sizeof(Password.OldBuffer);i++) Password.OldBuffer[i] = IAPReadByte(i); DelaymS(250); LCD_PutString(0,0," Input Password "); LCD_PutString(1,0," "); //--- 清顯示區域 --- Password.Pointer = 0; Password.Status = 0; //--- 回到原始狀態 --- } break; } } } } }} |