欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
電子密碼鎖仿真,可掉電保存密碼 涉及了24C02、IIC 、E2PROM
[打印本頁]
作者:
51黑ff
時間:
2016-9-9 02:37
標題:
電子密碼鎖仿真,可掉電保存密碼 涉及了24C02、IIC 、E2PROM
自己設計了一個電子密碼鎖,可掉電保存密碼!涉及了24C02、IIC 、E2PROM等,采用LCD12864中文顯示
1、在這一版中,將24C02的兩引腳SCL和SDA接在了P3.2和P3.3,原來接的是P2.0和P2.1
0.png
(33.94 KB, 下載次數: 90)
下載附件
2016-9-9 02:37 上傳
0.png
(72.46 KB, 下載次數: 92)
下載附件
2016-9-9 02:36 上傳
全部資料下載:
password終極版.zip
(180.19 KB, 下載次數: 113)
2016-9-9 02:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
矩陣鍵盤信息:
1 0x7e 2 0xbe 3 0xde
4 0x7d 5 0xbd 6 0xdd
7 0x7b 8 0xbb 9 0xdb
0 0x77 * 0xb7 # 0xd7
0xee 改密碼
0xed 啟動
0xeb 消除
0xe7 確定
鍵盤掃描程序
uchar keyscan() //鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l; //行列值中間變量
P1=0x0f; //行線輸出全為1 列線輸出全為0
cord_h=P1 & 0x0f; //讀入行線值
if(cord_h != 0x0f) //先檢測有無按鍵按下
{
Delay(10); //去抖
if(cord_h!=0x0f)
{
cord_h=P1 & 0x0f; //讀入行線值
P1=cord_h | 0xf0; //注意:執行這一步的時候后,按鍵還沒有松開
cord_l=P1 & 0xf0; //讀入列線值
return(cord_h + cord_l); //鍵盤最后組合碼值
}
}
return(0xff); //返回該值
}
源碼如下:
#include<reg52.h>
#include<intrins.h>
#include"delay.h"
#include"lcd12864.h"
#include"keyboard.h"
#include"24C02.h"
#include"uart.h"
#include"T0.h"
#include"character.h"
#define uchar unsigned char
#define uint unsigned int
uchar dumima,oldmima_flag,newmima_flag,newpass_flag,again_flag,flag,again_and_again_flag;
uchar code chushimima_tab[]={1,2,3,4,5,6}; //設定系統第一次初始密碼為123456
uchar data dumima_tab1[6]=" "; //從24C02中讀取寫入的初始或修改的密碼保存
uchar data dumima_tab2[6]=" "; // 儲存鍵入的密碼,用于與24C02中的對比
uchar data dumima_tab3[6]=" "; // 儲存鍵入的新密碼
uchar data dumima_tab4[6]=" "; // 儲存再次鍵入的新密碼
uchar code key_table[]={0,1,2,3,4,5,6,7,8,9}; //顯示密碼數字字符
uchar code tiaoshi_ok[]="01"; //調試用
void main()
{
uchar j;
Init_lcd12864();
Display_interface();
UART_init(); //讀出0x00處的數據,發送到串口查看
InitI2C(); //初始化
Timer0_init(); //定時器0初始化
mm=3; //可以有5次輸入密碼的機會
/* for(i=0;i<6;i++) //先將密碼寫入24C02
{
write_eeprom(i+2,chushimima_tab[i]);
Delayms(10);
} */
// c = read_eeprom(0x07); //串口發送程序段,可以用來測試
// UART_send_byte(c);
// dumima = read_eeprom(0x01); //讀取01地址的數據判斷是否寫入初始或修改的密碼
// if(dumima != 1)
// {
// write_eeprom(0x01,0x01); //在0X01出寫入1
// for(j=0;j<6;j++) //從02地址開始寫初始密碼數據
// {
// write_eeprom(j+2,chushimima_tab[j]);
// Delayms(10);
// }
// }
/*****************如果忘記密碼,可以利用這段程序重新設置初始密碼*************
for(j=0;j<6;j++) //從02地址開始寫初始密碼數據
{
write_eeprom(j+2,chushimima_tab[j]); //初始密碼123456
Delayms(10);
}
*********************************************************************************/
for(j=0;j<6;j++) //將24C02中的密碼讀取出來保存在dumima_tab1[]數組中
{
dumima_tab1[j] = read_eeprom(j+2);
Delayms(10);
}
while(1) //程序大循環
{
keyscan(); //調用鍵盤掃描 查詢按鍵是否有按下(只對啟動和修改密碼按鍵有效)
if(start == 1) //啟動
{
prevent_wucaozuo(); //防止誤操作
Input_password();
char_num=0;loop=1;
while(loop==1)
{
keyscan(); //僅數字鍵和取消鍵有效
if(key_flag==1) //有數字鍵被按下
{
prevent_wucaozuo(); //防止誤操作
Display_num(i,char_num); //顯示鍵入的數字
dumima_tab2[char_num] = key_table[i]; //儲存鍵入的數字
UART_send_byte(key_table[i]); //調試用
decide_songkai(); //判斷按鍵是否松開
char_num++;
if(char_num==6)
{
loop=0; char_num=0; wait_ok=1;
for(j=0;j<6;j++) //將24C02中的密碼讀取出來保存在dumima_tab1[]數組中
{
dumima_tab1[j] = read_eeprom(j+2);
Delayms(10);
}
while(wait_ok==1)
{
keyscan(); //等待確認鍵按下
if(ok==1)
{
prevent_wucaozuo(); wait_ok=0;
if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
&&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
&&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
{
// UART_send_byte(tiaoshi_ok[1]);
input_password_ok(); //顯示輸入的密碼正確
Delayms(2000); //延時顯示
Display_interface(); //返回界面
}
else //執行密碼輸入錯誤操作
{
// UART_send_byte(dumima_tab2[5]);
input_password_no(); //顯示"密碼錯誤"
Delayms(2000); //延時顯示
mm--; //輸入機會減少一次
if(mm>0)
{
Display_tishi_information(mm); //提示信息
Delayms(2000);
start = 1;
}
else
{
// UART_send_byte(mm);
Display_suoping_information(); //鎖屏信息
TR0=1; //啟動定時器0,在Timer0_service();中關閉
suoping_flag=10; //鎖屏秒數
while(suoping_flag)
{
Timer0_service(); //鎖屏倒計時服務函數
}
suoping_flag=10; //重新恢復鎖屏次數
Delayms(1000); //延時
start = 0; //重新進入while(1)大循環
mm=3; //重新恢復可輸入密碼的次數
Display_interface(); //顯示開始界面
}
}
}
}
}
}
if(remove==1) //在輸入密碼的過程中可以按“取消”鍵取消輸入密碼,直接返回到開始界面
{
prevent_wucaozuo(); //防止誤操作
start = 0; //重新進入while(1)大循環
loop = 0;
mm=3; //重新恢復可輸入密碼的次數
Display_interface(); //顯示開始界面
}
}
}
/*******************按下"重置密碼"鍵**************************/
if(alter_password ==1)
{
prevent_wucaozuo(); //防止誤操作
Input_old_password(); //輸入舊密碼
char_num=0;oldmima_flag = 1; //char_num為輸入密碼的位數
while(oldmima_flag==1) //
{
keyscan(); //僅數字鍵和取消鍵有效
if(key_flag==1) //有數字鍵被按下
{
prevent_wucaozuo(); //防止誤操作
Display_num(i,char_num); //顯示鍵入的數字
dumima_tab2[char_num] = key_table[i]; //儲存鍵入的數字
// UART_send_byte(key_table[i]); //調試用
decide_songkai(); //判斷按鍵是否松開
char_num++;
if(char_num==6)
{
oldmima_flag=0; char_num=0; wait_ok=1; //在按下確認鍵之前將其置為0,其實也可以在兩分支(1.輸入密碼成功 2.輸入密碼錯誤)內將其置為0
while(wait_ok==1) //記得在這個循環里將wait_ok置0
{
keyscan(); //等待確認鍵按下
if(ok==1)
{
prevent_wucaozuo();
if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
&&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
&&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
{
input_password_ok(); //顯示輸入的密碼正確
Delayms(2000); //延時顯示
Input_new_password(); //顯示“輸入新密碼”界面
newmima_flag=1;
while(newmima_flag==1) //記得在這個循環里將newmima_flag置0
{
keyscan(); //只有數字鍵和取消鍵有效
if(key_flag==1)
{
prevent_wucaozuo(); //防止誤操作
Display_num(i,char_num); //顯示鍵入的數字
dumima_tab3[char_num] = key_table[i]; //儲存鍵入的新密碼
// UART_send_byte(key_table[i]);
decide_songkai(); //判斷按鍵是否松開
char_num++;
if(char_num==6)
{
char_num=0; newpass_flag=1;
for(j=0;j<6;j++) //從02地址開始寫初始密碼數據
{
write_eeprom(j+2,dumima_tab3[j]);
Delayms(10);
}
//將新密碼保存在24C02中
while(newpass_flag == 1)
{
keyscan();
if(ok==1) //只有確認鍵有效
{
prevent_wucaozuo(); //防止誤操作
Input_new_password_again();
again_flag=1;
while(again_flag==1) //再次輸入新密碼
{
keyscan(); //只有數字鍵有效
if(key_flag==1)
{
prevent_wucaozuo(); //防止誤操作
Display_num(i,char_num); //顯示鍵入的數字
dumima_tab4[char_num] = key_table[i]; //儲存鍵入的新密碼
// UART_send_byte(key_table[i]);
decide_songkai(); //判斷按鍵是否松開
char_num++;
if(char_num==6)
{
char_num = 0; again_flag=0; flag=1;
while(flag==1)
{
keyscan();
if(1==ok)
{
prevent_wucaozuo(); //防止誤操作
if(dumima_tab3[0]==dumima_tab4[0]&&dumima_tab3[1]==dumima_tab4[1]
&&dumima_tab3[2]==dumima_tab4[2]&&dumima_tab3[3]==dumima_tab4[3]
&&dumima_tab3[4]==dumima_tab4[4]&&dumima_tab3[5]==dumima_tab4[5])
{
flag=0; newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
Alter_password_success();
Delayms(2000);
Display_interface(); //顯示開始界面
}
else //兩次輸入的新密碼不一致執行的操作
{
Display_again_cuowu_information(); //顯示第二次輸入的密碼錯誤
Delayms(3000);
Input_new_password_again();
again_and_again_flag = 1;
while(again_and_again_flag==1)
{
keyscan(); //只有數字鍵有效
if(key_flag==1)
{
prevent_wucaozuo(); //防止誤操作
Display_num(i,char_num); //顯示鍵入的數字
dumima_tab4[char_num] = key_table[i]; //儲存鍵入的新密碼
// UART_send_byte(key_table[i]);
decide_songkai(); //判斷按鍵是否松開
char_num++;
if(char_num==6)
{
char_num = 0;again_and_again_flag=0; flag=1;
while(flag==1)
{
keyscan();
if(1==ok)
{
prevent_wucaozuo(); //防止誤操作
if(dumima_tab3[0]==dumima_tab4[0]&&dumima_tab3[1]==dumima_tab4[1]
&&dumima_tab3[2]==dumima_tab4[2]&&dumima_tab3[3]==dumima_tab4[3]
&&dumima_tab3[4]==dumima_tab4[4]&&dumima_tab3[5]==dumima_tab4[5])
{
flag=0; again_and_again_flag=0;newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
Alter_password_success();
Delayms(2000);
Display_interface(); //顯示開始界面
}
else //又一次第二次輸錯新密碼(有點繞^_^)
{
flag=0; again_and_again_flag=0;newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
Alter_no_success(); //修改密碼失敗
Delayms(2000);
Display_interface(); //顯示開始界面
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
if(remove==1) //第一次輸入新密碼過程中按下“取消”按鍵執行的操作
{
prevent_wucaozuo(); //防止誤操作
newmima_flag = 0; wait_ok = 0; alter_password = 0;
Display_interface(); //顯示開始界面
}
}
}
else //輸入的密碼錯誤執行操作
{
input_password_no(); //顯示"密碼錯誤"
Delayms(2000); //延時顯示
mm--; //輸入機會減少一次
if(mm>0)
{
Display_tishi_information(mm); //提示信息
Delayms(2000);
alter_password = 1; //還是將alter_password置0比較合適
wait_ok = 0;
}
else
{
// UART_send_byte(mm);
Display_suoping_information(); //鎖屏信息
TR0=1; //啟動定時器0,在Timer0_service();中關閉
suoping_flag=10; //鎖屏秒數
while(suoping_flag)
{
Timer0_service(); //鎖屏倒計時服務函數
}
suoping_flag=10; //重新恢復鎖屏次數
Delayms(1000); //延時
alter_password = 0; //重新進入while(1)大循環
mm=3; wait_ok = 0; //重新恢復可輸入密碼的次數
Display_interface(); //顯示開始界面
}
}
}
}
}
}
if(remove==1) //在輸入密碼的過程中可以按“取消”鍵取消輸入密碼,直接返回到開始界面
{
prevent_wucaozuo(); //防止誤操作
oldmima_flag=0;
alter_password=0; //我覺得這里應該吧alter_password置為0
Display_interface(); //顯示開始界面
}
}
}
}
}
復制代碼
作者:
844636242
時間:
2017-7-17 13:06
謝謝樓主
作者:
tjji23
時間:
2019-8-29 09:07
謝謝樓主分享,正好有用
作者:
chenxianping
時間:
2019-9-12 16:15
仿真的時候輸入初始密碼123456,錯誤啊。初始密碼是什么呢
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1