由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,謝謝大家
水平受限,我輸入密碼的時候,總是顯示密碼錯誤,但是我找了半天,也沒發現問題.
/**************************************************************************************
*電子密碼鎖*
實現現象:下載程序輸入正確密碼,會聽到繼電器吸合的聲音
硬件連接:
P1 -->矩陣鍵盤
P20--> EEPROM模塊SDA
P21--> EEPROM模塊SCL
P22-->繼電器模塊J15
矩陣鍵盤:
0 1 2 3
4 5 6 7
8 9 返回 確定
$ $ $ $
注意事項:無
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "lcd.h"
#include "key.h"
#include "i2c.h"
#define u16 unsigned int //對數據類型進行聲明定義
#define u8 unsigned char
//sbit AS=P2^2; //繼電器
/*****************************************************************************/
/*****************************************************************************/
u8 pw_num,Error_Num,PassWord_Length=6;
u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
u8 INPUT_PW_Tab[10];
u8 key_num,Step,Step5,Load_first_flag=0;
/*****************************************************************************/
/*******************************************************************************/
bit result_flag,Input_suc_flag;
bit List1=0;
/*****************************************************************************/
/*******************************************************************************/
void Step_0();
void Step_1();
void Step_2();
void Step_3();
void Step_4();
void Step_5();
void Step5_0();
void Step5_1();
void Step5_2();
void Step5_3();
void Step5_4();
void Step5_5();
void Step_6();
/********************************************************************************/
/*******************************************************************************/
void CipherComparison();
void input_password(bit m);
void Read_Password();
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
u8 data1,a;
// ShowString(0x00," Pechin Science ");
// At24c02Write(0,0); //開機顯示密碼
LcdWriteCom(0x01); //清屏
for(data1=0;data1<PassWord_Length+2;data1++)
{
a=At24c02Read(data1)+0x30;
LcdWriteData(a);
delay(1000);
}
delay(1000);
LcdInit();
delay(1000);
Step=0;
Step5=0;
Error_Num=0x00;
Read_Password();
//保存 密碼長度
// for(j=0;j<10;j++)
// {
// At24c02Write(j,j);
// delay(100);
// }
//
while(1)
{
key_num=KeyDown(); //讀取輸入值
switch(Step)
{
case 0:
{Step_0();break;}
case 1:
{Step_1();break;}
case 2:
{Step_2();break;}
case 3:
{Step_3();break;}
case 4:
{Step_4();break;}
case 5:
{Step_5();break;}
case 6:
{Step_6();break;}
}
}
}
/*****************************************************************************/
/*******************************************************************************/
void Step_0()
{
LcdInit();
ShowString(0x00," Pechin Science "); //第一行顯示Pechin Science
ShowString(0x10," WELCOME! "); // 第二行顯示 WELCOME!
while(KeyDown()==0xff)Step=1; // 有按鍵按下進入下一步
}
/*****************************************************************************/
/*******************************************************************************/
void Step_1()
{
LcdWriteCom(0x01); //清屏
ShowString(0x00,"Unlock");
ShowString(0x0f,"<"); //1602第一行顯示unlock
ShowString(0x10,"Change Password");
ShowString(0x1f," "); // 1602第二行顯示Change Password
Step=2; //
}
/*****************************************************************************/
/*******************************************************************************/
void Step_2()
{
if(key_num!=0x0b)
{
if((key_num==0x01) ||( key_num==0x09)) //1鍵或9鍵按下
{
List1=~List1; //Change Password
if(List1==0)
{
ShowString(0x0f,"<"); // Unlock <
ShowString(0x1f," "); // Change Password
}
else
{
ShowString(0x0f," "); // Unlock
ShowString(0x1f,"<"); // Change Password <
}
}
}
else //確認鍵按下
{
if(List1==0){Step=3;}
else {Step=5;List1=0;}
}
}
/*****************************************************************************/
/*******************************************************************************/
void Step_3() //
{
Step=4;
pw_num=0;
LcdInit();
ShowString(0x00,"Pass Word: ");
}
/*****************************************************************************/
/*******************************************************************************/
void Step_4()
{
input_password(0); //輸入密碼并以*顯示
if(Input_suc_flag==1){Step=6;} //密碼輸入完成進入下一步
Input_suc_flag=0; //清除密碼輸入完成標志
}
/*****************************************************************************/
/*******************************************************************************/
void Step_5() //修改密碼
{
switch(Step5)
{
case 0: {Step5_0();} break;
case 1: {Step5_1();} break;
case 2: {Step5_2();} break;
case 3: {Step5_3();} break;
case 4: {Step5_4();} break;
case 5: {Step5_5();} break;
}
}
/*****************************************************************************/
/*******************************************************************************/
void Step_6()
{
CipherComparison(); //密碼比對
if(result_flag==1) //密碼正確
{
LcdInit();
ShowString(0x00," WELCOME!");
// AS=0; //開繼電器
delay(60000);
delay(60000);
//AS=1; //關繼電器
}
else //密碼錯誤
{
LcdInit();
ShowString(0x00,"Error 01!");
}
Step=0;
}
/****************************************************************************************
密碼輸入函數
密碼長度:pw_num
密碼輸入完成標志:Input_suc_flag
*****************************************************************************************/
void Step5_0()
{
LcdWriteCom(0x01); //清屏
ShowString (0x00,"Input PassWord:"); //1602顯示:輸入密碼
Step5=1;
pw_num=0;
}
void Step5_1()
{
input_password(0); // 輸入密碼并以*顯示
if(Input_suc_flag==1) //密碼輸入完成
{
Step5=2; //
Input_suc_flag=0; //清除密碼輸入完成標志
}
}
void Step5_2() //
{
CipherComparison(); //密碼比對
Step5=3;
}
void Step5_3() //
{
if(result_flag==0) // 密碼錯誤
{
if(Error_Num<3) //輸出錯誤次數小于3
{
Error_Num++;
LcdInit();
ShowString (0x00,"Error 01");
delay(20000);
Step5=0;
}
else //密碼錯誤次數大于3
{
Error_Num=0;
Step=0;
}
}
else //密碼正確
{
LcdInit();
ShowString (0x00,"New PassWord:");
pw_num=0;
Step5=4;
}
}
void Step5_4()
{
input_password(1); //輸入密碼并顯示
if(Input_suc_flag==1) //輸入完成
{
Step5=5;
Input_suc_flag=0;
LcdWriteCom(0x01); //清屏
ShowString (0x00," OK!");
}
}
void Step5_5()
{
unsigned char j;
PassWord_Length=pw_num; //讀取輸入密碼長度
At24c02Write(0,Load_first_flag);
delay(100);
At24c02Write(1,PassWord_Length); //保存 密碼長度
delay(100);
for(j=0;j<PassWord_Length;j++)
{
PASSWORD[j]=INPUT_PW_Tab[j]; //讀取密碼
At24c02Write(j+2,INPUT_PW_Tab[j]); //保存密碼至EEPROM
delay(100);
}
Step5=0;
Step=0;
}
void Read_Password()
{
unsigned char j;
Load_first_flag=At24c02Read(0x00);
if(Load_first_flag==0) //初次運行
{
Load_first_flag=1;
At24c02Write(0,0x01);
delay(100);
At24c02Write(1,0x06); //寫默認密碼長度6至EEPROM
delay(100);
for(j=0;j<PassWord_Length;j++)
{
At24c02Write(j+2,8); //寫默認密碼888888至EEPROM
PASSWORD[j]=INPUT_PW_Tab[j]; //讀密碼
delay(100);
}
}
Load_first_flag=At24c02Read(0x00);
PassWord_Length=At24c02Read(0x01); //讀取密碼長度
for(j=0;j<PassWord_Length;j++) //讀取密碼
{
PASSWORD[j]=At24c02Read(j+2);
}
}
void input_password(bit m)
{
unsigned char j;
if(key_num!=0x0b) //ok鍵沒有按下
{
if(key_num<0x0a) //1-9按下
{
INPUT_PW_Tab[pw_num]=key_num; //保存至輸入密碼數組
pw_num=pw_num+1; //密碼長度+1
LcdWriteCom(0xc0);
for(j=0;j<pw_num;j++)
{
if(m==0) {LcdWriteData('*'); } //密碼隱藏
else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
}
}
if(key_num==0x0a) //返回鍵按下
{
if(pw_num!=0) {pw_num=pw_num-1;}
else {Step=0;}
// ShowString (0x00,"Pass Word:");
LcdWriteCom(0xc0);
for(j=0;j<pw_num;j++)
{
if(m==0) {LcdWriteData('*'); } //密碼隱藏
else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
}
LcdWriteData(' ');
}
}
else //ok鍵按下
{
if(pw_num==0)
{
Step=0;
LcdWriteCom(0x01);
ShowString (0x00,"Error 02!");
delay(10000);
}
else{
Input_suc_flag=1;
}
//AS=0;
}
}
/*******************************************************
密碼比對
********************************************************/
void CipherComparison()
{
u8 i,j=0;
if(PassWord_Length==pw_num) //密碼長度比對
{
for(i=0;i<PassWord_Length;i++) //密碼比對
{
if(PASSWORD[ i]!=INPUT_PW_Tab[ i])
{
result_flag=0;break; //密碼錯誤
}
else
{
result_flag=1; //密碼正確
}
INPUT_PW_Tab[ i]=0XFF; //清除密碼緩存數組
}
}
else
{result_flag=0;}
}
|