|
自己設計了一個電子密碼鎖,可掉電保存密碼!涉及了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(); //顯示開始界面
- }
- }
- }
- }
- }
復制代碼
|
評分
-
查看全部評分
|