|
我在按下(key=O)時,可以將密碼(123456)寫進24C02,但是當我重置密碼(333333)之后,再次輸入新密碼時,提示密碼錯誤,求幫助?主程序如下。
#include <reg52.h>
#include "delay_ms.h"
#include "矩陣鍵盤.h"
#include "i2c.h"
#include "1602.h"
#include "delay_ms.h"
#include "mima.h"
#define uchar unsigned char
#define uint unsigned int
#define A 0x0a //輸入密碼
#define B 0x0b //修改密碼
#define D 0x0d //關鎖
#define enter 0x0c //確認
#define backspace 0x0f //退格鍵
#define O 0x0e //初始化密碼
sbit baojing = P2^0; //蜂鳴器接口
sbit lock = P1^5;//鎖信號
uchar mima_5[6] = {1,2,3,4,5,6}; //初始密碼
uchar flag_change;
uchar aa;//存放密碼錯誤的次數,夠三次報警
uchar bb;
uchar flag_t0;
void baoj1()//報警函數
{
int i;
for(i = 0;i < 5; i++)
{
baojing = 0;
delay_ms(5);
baojing = 1;
delay_ms(5);
}
}
void baoj()
{
uchar i;
for(i = 0; i < 10; i++)
baoj1();
}
/*密碼處理函數*/
void mimachuli()
{
uchar key,i;
uchar mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密碼緩沖區(qū)
uchar mima_2[6]={' ',' ',' ',' ',' ',' '};
uchar mima_3[6]={' ',' ',' ',' ',' ',' '};
key = step_choose();
if(key == A)//A被按下,接收輸入密碼,處理
{
RdFromROM(mima_1,0x00,6);
if(mima_1[5]==3)
{
lock=0;
delay_ms(1000);
lock=1;
}
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_com(0x0f);//顯示光標
lcd_pos(0,0);
write_n_char(" press password ");
if(input_mima(mima_2)) //處理輸入密碼
{
if(mimaduibi(mima_2,mima_1)) //密碼正確
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password right ");
aa = 0; //清除密碼錯誤次數
lock = 0; //開鎖
baojing = 0; //響一下
delay_ms(1000);
baojing = 1;
TR0 = 1;
flag_t0 = 1;
while(key != D && flag_t0) //D沒按下一直開
{
key = keyscan();
}
TR0 = 0;
lock = 1;//D按下了關鎖
}
else //密碼 不正確
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //密碼不正確報警
while(i--)
baoj();
}
}
}
else //密碼沒有輸入正確或完成
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //密碼不正確報警
while(i--)
baoj();
}
}
}
if(key == B)//B被按下,修改密碼
{
RdFromROM(mima_1,0x00,6);
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_com(0x0f);//顯示光標
lcd_pos(0,0);
write_n_char(" input password");
write_com(0x0f);//顯示光標
if(input_mima(mima_2)) //處理輸入密碼
{
if(mimaduibi(mima_2,mima_1)) //密碼正確
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password right ");
aa = 0; //清除密碼錯誤次數
delay_ms(15000);
flag_change = 1;
while(flag_change) //下面開始修改密碼
{
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_com(0x0f);//顯示光標
lcd_pos(0,0);
write_n_char("In new password");
delay_ms(1500);
if(input_mima(mima_2)) //處理輸入密碼
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" Input new pass"); //確定新密碼
lcd_pos(1,0);
write_n_char(" word again");
delay_ms(20000);
lcd_pos(0,0);
write_com(0x0f);//顯示光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" In new password");
if(input_mima(mima_3)) //處理輸入密碼
{
if(mimaduibi(mima_2,mima_3)) //密碼正確
{
WrToROM(mima_2,0x00,6);
delay_ms(1000);//把修改的密碼存進24C02
RdFromROM(mima_1,0x00,6);
if(mima_1[5]==3)
{
lock=0;
delay_ms(1000);
lock=1;
}
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password has");
lcd_pos(1,0);
write_n_char("changed already");
delay_ms(10000);
flag_change = 0;
}
else //密碼 不正確
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //3次輸入密碼不正確報警
while(i--)
baoj();
}
flag_change = 0;
}
}
else //密碼沒有輸入正確或完成
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //3次輸入密碼不正確報警
while(i--)
baoj();
}
}
}
else //密碼沒有輸入正確或完成
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
flag_change = 0;
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //3次輸入密碼不正確報警
while(i--)
baoj();
}
}
}
}
else //密碼 不正確
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //3次輸入密碼不正確報警
while(i--)
baoj();
}
}
}
else //密碼沒有輸入正確或完成
{
lcd_pos(0,0);
write_com(0x0c); //關光標
write_com(0x06);//寫一個字符后地址指針加 1
write_com(0x01);//顯示清零,數據指針清零
write_n_char(" password wrong");
delay_ms(10000);
aa++;
if(aa == 4)
{
aa = 0;
i = 20; //3次輸入密碼不正確報警
while(i--)
baoj();
}
}
}
if(key==O)
{ WrToROM(mima_5,0x00,6); //把修改的密碼存進24C02
RdFromROM(mima_1,0x00,6) ; //強制將初始密碼寫入24C02存儲
if(mima_1[4]==5)
{
lock=0;
delay_ms(1000);
lock=1;
}
}
}
void timer0() interrupt 1 //定時器0中斷,50ms定時
{
TH0 = 0x4c;//50ms定時
TL0 = 0x00;
bb++;
if(bb == 200)//10秒時間到
{
bb = 0;
flag_t0 = 0;
}
}
void main()
{
yjinit();//液晶初始化
baojing = 1;
lock = 1; //關鎖
TMOD = 0x01;//選擇定時器0方式1
EA = 1;//打開總中斷
ET0 = 1;//打開定時器0中斷
TR0 = 0;//關閉定時器
TH0 = 0x4c;//50ms裝初值
TL0 = 0x00;
while(1)
{
mimachuli();
}
}
|
|