欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6130|回復: 3
打印 上一主題 下一主題
收起左側

電子密碼鎖仿真,可掉電保存密碼 涉及了24C02、IIC 、E2PROM

[復制鏈接]
跳轉到指定樓層
樓主
自己設計了一個電子密碼鎖,可掉電保存密碼!涉及了24C02、IIC  、E2PROM等,采用LCD12864中文顯示
1、在這一版中,將24C02的兩引腳SCL和SDA接在了P3.2和P3.3,原來接的是P2.0和P2.1



全部資料下載:
password終極版.zip (180.19 KB, 下載次數: 113)


矩陣鍵盤信息:
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);     //返回該值
}


源碼如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"delay.h"
  4. #include"lcd12864.h"
  5. #include"keyboard.h"
  6. #include"24C02.h"
  7. #include"uart.h"
  8. #include"T0.h"
  9. #include"character.h"





  10. #define uchar unsigned char
  11. #define uint unsigned int


  12. uchar dumima,oldmima_flag,newmima_flag,newpass_flag,again_flag,flag,again_and_again_flag;
  13. uchar code chushimima_tab[]={1,2,3,4,5,6};  //設定系統第一次初始密碼為123456
  14. uchar data dumima_tab1[6]="      ";                //從24C02中讀取寫入的初始或修改的密碼保存
  15. uchar data dumima_tab2[6]="      ";                // 儲存鍵入的密碼,用于與24C02中的對比
  16. uchar data dumima_tab3[6]="      ";                // 儲存鍵入的新密碼
  17. uchar data dumima_tab4[6]="      ";                // 儲存再次鍵入的新密碼
  18. uchar code key_table[]={0,1,2,3,4,5,6,7,8,9};           //顯示密碼數字字符
  19. uchar code tiaoshi_ok[]="01";                //調試用


  20. void main()
  21. {
  22.         uchar j;        
  23.         Init_lcd12864();
  24.         Display_interface();
  25.         UART_init();               //讀出0x00處的數據,發送到串口查看
  26.         InitI2C();                           //初始化
  27.         Timer0_init();          //定時器0初始化
  28.         mm=3;            //可以有5次輸入密碼的機會
  29. /*        for(i=0;i<6;i++)                 //先將密碼寫入24C02
  30.         {
  31.                 write_eeprom(i+2,chushimima_tab[i]);
  32.                 Delayms(10);                                
  33.         }                  */
  34. //        c = read_eeprom(0x07);            //串口發送程序段,可以用來測試
  35. //        UART_send_byte(c);
  36. //        dumima = read_eeprom(0x01);         //讀取01地址的數據判斷是否寫入初始或修改的密碼
  37. //        if(dumima != 1)
  38. //        {
  39. //                write_eeprom(0x01,0x01);     //在0X01出寫入1
  40. //                for(j=0;j<6;j++)                        //從02地址開始寫初始密碼數據
  41. //                {
  42. //                        write_eeprom(j+2,chushimima_tab[j]);
  43. //                        Delayms(10);                                
  44. //                }                                                               
  45. //        }
  46. /*****************如果忘記密碼,可以利用這段程序重新設置初始密碼*************
  47.                 for(j=0;j<6;j++)                        //從02地址開始寫初始密碼數據
  48.                 {
  49.                         write_eeprom(j+2,chushimima_tab[j]);         //初始密碼123456
  50.                         Delayms(10);                                
  51.                 }
  52. *********************************************************************************/
  53.         for(j=0;j<6;j++)                                 //將24C02中的密碼讀取出來保存在dumima_tab1[]數組中
  54.         {
  55.                  dumima_tab1[j] = read_eeprom(j+2);
  56.                 Delayms(10);               
  57.         }         
  58.         while(1)                        //程序大循環
  59.         {

  60.                 keyscan();                          //調用鍵盤掃描   查詢按鍵是否有按下(只對啟動和修改密碼按鍵有效)
  61.                 if(start == 1)                        //啟動
  62.                 {
  63.                         prevent_wucaozuo();            //防止誤操作
  64.                         Input_password();
  65.                         char_num=0;loop=1;
  66.                         while(loop==1)
  67.                         {
  68.                                 keyscan();                         //僅數字鍵和取消鍵有效
  69.                                 if(key_flag==1)                //有數字鍵被按下
  70.                                 {
  71.                                         prevent_wucaozuo();                                              //防止誤操作
  72.                                         Display_num(i,char_num);                                 //顯示鍵入的數字
  73.                                         dumima_tab2[char_num] =  key_table[i];          //儲存鍵入的數字
  74.                                         UART_send_byte(key_table[i]);          //調試用
  75.                                         decide_songkai();                                   //判斷按鍵是否松開
  76.                                         char_num++;  
  77.                                         if(char_num==6)
  78.                                         {
  79.                                                  loop=0; char_num=0;         wait_ok=1;
  80.                                                 for(j=0;j<6;j++)                                 //將24C02中的密碼讀取出來保存在dumima_tab1[]數組中
  81.                                                 {
  82.                                                          dumima_tab1[j] = read_eeprom(j+2);
  83.                                                         Delayms(10);               
  84.                                                 }
  85.                                                 while(wait_ok==1)
  86.                                                 {
  87.                                                         keyscan();   //等待確認鍵按下
  88.                                                         if(ok==1)
  89.                                                         {
  90.                                                                 prevent_wucaozuo(); wait_ok=0;
  91.                                                                 if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
  92.                                                                  &&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
  93.                                                                  &&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
  94.                                                                 {
  95. //                                                                         UART_send_byte(tiaoshi_ok[1]);
  96.                                                                         input_password_ok();         //顯示輸入的密碼正確
  97.                                                                         Delayms(2000);                         //延時顯示
  98.                                                                         Display_interface();          //返回界面
  99.                                                                 }
  100.                                                                 else                           //執行密碼輸入錯誤操作
  101.                                                                 {
  102. //                                                                        UART_send_byte(dumima_tab2[5]);
  103.                                                                         input_password_no();          //顯示"密碼錯誤"
  104.                                                                         Delayms(2000);                         //延時顯示
  105.                                                                         mm--;                                   //輸入機會減少一次
  106.                                                                         if(mm>0)
  107.                                                                         {
  108.                                                                                 Display_tishi_information(mm);        //提示信息
  109.                                                                                 Delayms(2000);
  110.                                                                                 start = 1;                                                                                
  111.                                                                         }
  112.                                                                         else
  113.                                                                         {
  114. //                                                                                UART_send_byte(mm);        
  115.                                                                                 Display_suoping_information();        //鎖屏信息
  116.                                                                                 TR0=1;                                                        //啟動定時器0,在Timer0_service();中關閉
  117.                                                                                 suoping_flag=10;                                //鎖屏秒數
  118.                                                                                 while(suoping_flag)
  119.                                                                                 {
  120.                                                                                         Timer0_service();                  //鎖屏倒計時服務函數
  121.                                                                                 }
  122.                                                                                 suoping_flag=10;                         //重新恢復鎖屏次數
  123.                                                                                 Delayms(1000);                                 //延時
  124.                                                                                 start = 0;                                        //重新進入while(1)大循環
  125.                                                                                 mm=3;                                                //重新恢復可輸入密碼的次數
  126.                                                                                 Display_interface();                //顯示開始界面                                                                        
  127.                                                                         }
  128.                                                                                 
  129.                                                                 }        
  130.                                                         }        
  131.                                                  }
  132.                                                 
  133.                                         }
  134.                                 }

  135.                                 if(remove==1)                                //在輸入密碼的過程中可以按“取消”鍵取消輸入密碼,直接返回到開始界面
  136.                                 {
  137.                                         prevent_wucaozuo();            //防止誤操作
  138.                                         start = 0;                                        //重新進入while(1)大循環
  139.                                         loop = 0;
  140.                                         mm=3;                                                //重新恢復可輸入密碼的次數
  141.                                         Display_interface();                //顯示開始界面                                
  142.                                 }                        
  143.                         }                        
  144.                 }

  145. /*******************按下"重置密碼"鍵**************************/
  146.                 if(alter_password ==1)
  147.                 {
  148.                         prevent_wucaozuo();            //防止誤操作
  149.                         Input_old_password();         //輸入舊密碼
  150.                         char_num=0;oldmima_flag = 1;     //char_num為輸入密碼的位數
  151.                         while(oldmima_flag==1)                   //
  152.                         {
  153.                                 keyscan();                         //僅數字鍵和取消鍵有效
  154.                                 if(key_flag==1)                //有數字鍵被按下
  155.                                 {
  156.                                         prevent_wucaozuo();                    //防止誤操作
  157.                                         Display_num(i,char_num);                                 //顯示鍵入的數字
  158.                                         dumima_tab2[char_num] =  key_table[i];          //儲存鍵入的數字
  159. //                                        UART_send_byte(key_table[i]);          //調試用
  160.                                         decide_songkai();                                   //判斷按鍵是否松開
  161.                                         char_num++;
  162.                                         if(char_num==6)
  163.                                         {
  164.                                                 oldmima_flag=0; char_num=0;         wait_ok=1;           //在按下確認鍵之前將其置為0,其實也可以在兩分支(1.輸入密碼成功 2.輸入密碼錯誤)內將其置為0
  165.                                                 while(wait_ok==1)                   //記得在這個循環里將wait_ok置0  
  166.                                                 {
  167.                                                         keyscan();   //等待確認鍵按下
  168.                                                         if(ok==1)
  169.                                                         {
  170.                                                                 prevent_wucaozuo();
  171.                                                                 if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
  172.                                                                  &&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
  173.                                                                  &&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
  174.                                                                 {
  175.                                                                         input_password_ok();         //顯示輸入的密碼正確
  176.                                                                         Delayms(2000);                         //延時顯示
  177.                                                                         Input_new_password();          //顯示“輸入新密碼”界面
  178.                                                                         newmima_flag=1;
  179.                                                                         while(newmima_flag==1)                //記得在這個循環里將newmima_flag置0
  180.                                                                         {
  181.                                                                                 keyscan();          //只有數字鍵和取消鍵有效
  182.                                                                                 if(key_flag==1)
  183.                                                                                 {
  184.                                                                                         prevent_wucaozuo();                    //防止誤操作
  185.                                                                                         Display_num(i,char_num);                                 //顯示鍵入的數字
  186.                                                                                         dumima_tab3[char_num] =  key_table[i];          //儲存鍵入的新密碼
  187.         //                                                                                UART_send_byte(key_table[i]);
  188.                                                                                         decide_songkai();                                   //判斷按鍵是否松開
  189.                                                                                         char_num++;        
  190.                                                                                         if(char_num==6)
  191.                                                                                         {
  192.                                                                                                  char_num=0;         newpass_flag=1;
  193.                                                                                                  for(j=0;j<6;j++)                        //從02地址開始寫初始密碼數據
  194.                                                                                                 {
  195.                                                                                                                 write_eeprom(j+2,dumima_tab3[j]);
  196.                                                                                                                 Delayms(10);                                
  197.                                                                                                 }
  198.                                                                                                 //將新密碼保存在24C02中
  199.                                                                                                 while(newpass_flag == 1)                  
  200.                                                                                                 {
  201.                                                                                                 
  202.                                                                                                         keyscan();         
  203.                                                                                                         if(ok==1)          //只有確認鍵有效
  204.                                                                                                         {
  205.                                                                                                                 prevent_wucaozuo();                    //防止誤操作
  206.                                                                                                                 Input_new_password_again();        
  207.                                                                                                                 again_flag=1;
  208.                                                                                                                 while(again_flag==1)         //再次輸入新密碼
  209.                                                                                                                 {
  210.                                                                                                                         keyscan();          //只有數字鍵有效
  211.                                                                                                                         if(key_flag==1)
  212.                                                                                                                         {
  213.                                                                                                                                 prevent_wucaozuo();                    //防止誤操作
  214.                                                                                                                                 Display_num(i,char_num);                                 //顯示鍵入的數字
  215.                                                                                                                                 dumima_tab4[char_num] =  key_table[i];          //儲存鍵入的新密碼
  216.                                                 //                                                                                UART_send_byte(key_table[i]);
  217.                                                                                                                                 decide_songkai();                                   //判斷按鍵是否松開
  218.                                                                                                                                 char_num++;        
  219.                                                                                                                                 if(char_num==6)
  220.                                                                                                                                 {
  221.                                                                                                                                         char_num = 0; again_flag=0; flag=1;
  222.                                                                                                                                         while(flag==1)
  223.                                                                                                                                         {
  224.                                                                                                                                                 keyscan();
  225.                                                                                                                                                 if(1==ok)
  226.                                                                                                                                                 {
  227.                                                                                                                                                         prevent_wucaozuo();                    //防止誤操作
  228.                                                                                                                                                         if(dumima_tab3[0]==dumima_tab4[0]&&dumima_tab3[1]==dumima_tab4[1]
  229.                                                                                                                                                          &&dumima_tab3[2]==dumima_tab4[2]&&dumima_tab3[3]==dumima_tab4[3]
  230.                                                                                                                                                          &&dumima_tab3[4]==dumima_tab4[4]&&dumima_tab3[5]==dumima_tab4[5])
  231.                                                                                                                                                          {
  232.                                                                                                                                                                  flag=0;        newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
  233.                                                                                                                                                                 Alter_password_success();
  234.                                                                                                                                                                 Delayms(2000);        
  235.                                                                                                                                                                 Display_interface();                //顯示開始界面        
  236.                                                                                                                                                          }
  237.                                                                                                                                                          else                                           //兩次輸入的新密碼不一致執行的操作
  238.                                                                                                                                                          {
  239.                                                                                                                                                                  Display_again_cuowu_information();          //顯示第二次輸入的密碼錯誤
  240.                                                                                                                                                                 Delayms(3000);
  241.                                                                                                                                                                 Input_new_password_again();        
  242.                                                                                                                                                                 again_and_again_flag = 1;
  243.                                                                                                                                                                 while(again_and_again_flag==1)
  244.                                                                                                                                                                 {
  245.                                                                                                                                                                         keyscan();          //只有數字鍵有效
  246.                                                                                                                                                                         if(key_flag==1)
  247.                                                                                                                                                                         {
  248.                                                                                                                                                                                 prevent_wucaozuo();                    //防止誤操作
  249.                                                                                                                                                                                 Display_num(i,char_num);                                 //顯示鍵入的數字
  250.                                                                                                                                                                                 dumima_tab4[char_num] =  key_table[i];          //儲存鍵入的新密碼
  251.                                                                                                 //                                                                                UART_send_byte(key_table[i]);
  252.                                                                                                                                                                                 decide_songkai();                                   //判斷按鍵是否松開
  253.                                                                                                                                                                                 char_num++;        
  254.                                                                                                                                                                                 if(char_num==6)
  255.                                                                                                                                                                                 {
  256.                                                                                                                                                                                         char_num = 0;again_and_again_flag=0; flag=1;
  257.                                                                                                                                                                                         while(flag==1)
  258.                                                                                                                                                                                         {
  259.                                                                                                                                                                                                 keyscan();
  260.                                                                                                                                                                                                 if(1==ok)
  261.                                                                                                                                                                                                 {
  262.                                                                                                                                                                                                         prevent_wucaozuo();                    //防止誤操作
  263.                                                                                                                                                                                                         if(dumima_tab3[0]==dumima_tab4[0]&&dumima_tab3[1]==dumima_tab4[1]
  264.                                                                                                                                                                                                          &&dumima_tab3[2]==dumima_tab4[2]&&dumima_tab3[3]==dumima_tab4[3]
  265.                                                                                                                                                                                                          &&dumima_tab3[4]==dumima_tab4[4]&&dumima_tab3[5]==dumima_tab4[5])
  266.                                                                                                                                                                                                          {
  267.                                                                                                                                                                                                                  flag=0;        again_and_again_flag=0;newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
  268.                                                                                                                                                                                                                 Alter_password_success();
  269.                                                                                                                                                                                                                 Delayms(2000);        
  270.                                                                                                                                                                                                                 Display_interface();                //顯示開始界面        
  271.                                                                                                                                                                                                          }
  272.                                                                                                                                                                                                          else                                                        //又一次第二次輸錯新密碼(有點繞^_^)
  273.                                                                                                                                                                                                          {
  274.                                                                                                                                                                                                                         flag=0;        again_and_again_flag=0;newpass_flag=0;again_flag=0;newmima_flag=0;wait_ok=0;
  275.                                                                                                                                                                                                                         Alter_no_success();           //修改密碼失敗
  276.                                                                                                                                                                                                                         Delayms(2000);        
  277.                                                                                                                                                                                                                         Display_interface();                //顯示開始界面                                
  278.                                                                                                                                                                                                          }        
  279.                                                                                                                                                                                                 }               
  280.                                                                                                                                                                                         }
  281.                                                                                                                                                                                        
  282.                                                                                                                                                                                 }
  283.                                                                                                                                                                         }        
  284.                                                                                                                                                                 }        
  285.                                                                                                                                                          }        
  286.                                                                                                                                                 }               
  287.                                                                                                                                         }                                                                                                                                       
  288.                                                                                                                                 }               
  289.                                                                                                                         }
  290.                                                                                                                 }        
  291.                                                                                                         }
  292.                                                                                                 }
  293.                                                                                         }
  294.                                                                                 }
  295.                                                                                 if(remove==1)        //第一次輸入新密碼過程中按下“取消”按鍵執行的操作
  296.                                                                                 {
  297.                                                                                         prevent_wucaozuo();                    //防止誤操作
  298.                                                                                         newmima_flag = 0; wait_ok = 0; alter_password = 0;
  299.                                                                                         Display_interface();                //顯示開始界面                                                
  300.                                                                                 }                        
  301.                                                                         }
  302.                                                                 }
  303.                                                                 else       //輸入的密碼錯誤執行操作
  304.                                                                 {
  305.                                                                         input_password_no();          //顯示"密碼錯誤"
  306.                                                                         Delayms(2000);                         //延時顯示
  307.                                                                         mm--;                                   //輸入機會減少一次
  308.                                                                         if(mm>0)
  309.                                                                         {
  310.                                                                                 Display_tishi_information(mm);        //提示信息
  311.                                                                                 Delayms(2000);
  312.                                                                                 alter_password = 1;            //還是將alter_password置0比較合適
  313.                                                                                 wait_ok = 0;                                                                        
  314.                                                                         }
  315.                                                                         else
  316.                                                                         {
  317. //                                                                                UART_send_byte(mm);        
  318.                                                                                 Display_suoping_information();        //鎖屏信息
  319.                                                                                 TR0=1;                                                        //啟動定時器0,在Timer0_service();中關閉
  320.                                                                                 suoping_flag=10;                                //鎖屏秒數
  321.                                                                                 while(suoping_flag)
  322.                                                                                 {
  323.                                                                                         Timer0_service();                  //鎖屏倒計時服務函數
  324.                                                                                 }
  325.                                                                                 suoping_flag=10;                         //重新恢復鎖屏次數
  326.                                                                                 Delayms(1000);                                 //延時
  327.                                                                                 alter_password = 0;                                        //重新進入while(1)大循環
  328.                                                                                 mm=3;        wait_ok = 0;                        //重新恢復可輸入密碼的次數
  329.                                                                                 Display_interface();                //顯示開始界面                                                                        
  330.                                                                         }        
  331.                                                                 }        
  332.                                                         }                        
  333.                                                 }        
  334.                                         }               
  335.                                 }
  336.                                 if(remove==1)                //在輸入密碼的過程中可以按“取消”鍵取消輸入密碼,直接返回到開始界面
  337.                                 {
  338.                                         prevent_wucaozuo();                    //防止誤操作
  339.                                         oldmima_flag=0;
  340.                                         alter_password=0;      //我覺得這里應該吧alter_password置為0
  341.                                         Display_interface();                //顯示開始界面               
  342.                                 }                                         
  343.                         }
  344.                 }        
  345.         }        
  346. }
復制代碼




評分

參與人數 1黑幣 +10 收起 理由
YJGG + 10 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:197445 發表于 2017-7-17 13:06 | 只看該作者
謝謝樓主
回復

使用道具 舉報

板凳
ID:604991 發表于 2019-8-29 09:07 | 只看該作者
謝謝樓主分享,正好有用
回復

使用道具 舉報

地板
ID:377803 發表于 2019-9-12 16:15 | 只看該作者
仿真的時候輸入初始密碼123456,錯誤啊。初始密碼是什么呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表