久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

注釋詳細的51單片機的密碼鎖程序+Proteus仿真設計

[復制鏈接]
跳轉到指定樓層
樓主
非常適合單片機新手,需要可來下載。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下(代碼注釋非常詳細):
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int        // 以后unsigned int 就可以用uint 代


  5. sbit SDA_P   = P2^1;                                // 定義了AT24C02的SCL引腳
  6. sbit SCL_P   = P2^0;                                // 定義了AT24C02的SDA引腳
  7. sbit LcdEn_P = P2^5;                                // 1602液晶的EN管腳
  8. sbit LcdRw_P = P2^6;                                // 1602液晶的RW管腳
  9. sbit LcdRs_P = P2^7;                                // 1602液晶的RS管腳
  10. sbit Beep_P  = P3^3;                                // 蜂鳴器引腳
  11. sbit Relay_P = P3^2;                                // 繼電器引腳

  12. uchar ArrCodeBuff[6];                                // 密碼輸入緩沖區
  13. uchar ArrCodeUnlock[6];                        // 解鎖密碼
  14. uchar ArrCodeTemp[6];                                // 臨時數組(修改密碼時會用到)
  15. uchar ArrCodeAdmin[6]={1,2,3,1,2,3};                // 管理員密碼


  16. uchar row,column;                                        // 液晶的當前行列坐標
  17. uchar inputNum=0;                                        // 輸入的密碼位數
  18. uchar inputMode=1;                                // =1輸入解鎖密碼,=2輸入修改密碼1,=3輸入解鎖密碼2
  19. uchar errTime=0;                                        // 密碼輸入錯誤的次數


  20. /*********************************************************/
  21. // 毫秒級的延時函數,time是要延時的毫秒數
  22. /*********************************************************/
  23. void DelayMs(uint time)
  24. {
  25.         uint i,j;
  26.         for(i=0;i<time;i++)
  27.                 for(j=0;j<112;j++);
  28. }


  29. /*********************************************************/
  30. // 延時6微秒
  31. /*********************************************************/
  32. void Delay6us()
  33. {
  34.   _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         _nop_();
  40. }


  41. /*********************************************************/
  42. // 1602液晶寫命令函數,cmd就是要寫入的命令
  43. /*********************************************************/
  44. void LcdWriteCmd(uchar cmd)
  45. {
  46.         LcdRs_P = 0;
  47.         LcdRw_P = 0;
  48.         LcdEn_P = 0;
  49.         P0=cmd;
  50.         DelayMs(2);
  51.         LcdEn_P = 1;   
  52.         DelayMs(2);
  53.         LcdEn_P = 0;        
  54. }


  55. /*********************************************************/
  56. // 1602液晶寫數據函數,dat就是要寫入的數據
  57. /*********************************************************/
  58. void LcdWriteData(uchar dat)
  59. {
  60.         LcdRs_P = 1;
  61.         LcdRw_P = 0;
  62.         LcdEn_P = 0;
  63.         P0=dat;
  64.         DelayMs(2);
  65.         LcdEn_P = 1;   
  66.         DelayMs(2);
  67.         LcdEn_P = 0;
  68. }


  69. /*********************************************************/
  70. // 1602液晶初始化函數
  71. /*********************************************************/
  72. void LcdInit()
  73. {
  74.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  75.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  76.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  77.         LcdWriteCmd(0x01);        // 清屏
  78. }


  79. /*********************************************************/
  80. // 液晶光標定位函數
  81. /*********************************************************/
  82. void LcdGotoXY(uchar y, uchar x)
  83. {
  84.         // 第一行
  85.         if(y==0)        
  86.                 LcdWriteCmd(0x80+x);
  87.         // 第二行
  88.         if(y==1)        
  89.                 LcdWriteCmd(0x80+0x40+x);
  90.         row=y;
  91.         column=x;
  92. }


  93. /*********************************************************/
  94. // 液晶輸出字符串函數
  95. /*********************************************************/
  96. void LcdPrintStr(uchar *str)
  97. {
  98.         while(*str!='\0')
  99.                         LcdWriteData(*str++);
  100. }


  101. /*********************************************************/
  102. // IIC起始函數
  103. /*********************************************************/
  104. void IIcStart()
  105. {
  106.         SDA_P=1;         
  107.         Delay6us();
  108.         SCL_P=1;         
  109.         Delay6us();
  110.         SDA_P=0;         
  111.         Delay6us();
  112. }


  113. /*********************************************************/
  114. // IIC終止函數
  115. /*********************************************************/
  116. void IIcStop()
  117. {
  118.         SDA_P=0;         
  119.         Delay6us();
  120.         SCL_P=1;         
  121.         Delay6us();
  122.         SDA_P=1;         
  123.         Delay6us();
  124. }



  125. /*********************************************************/
  126. // IIC寫一個字節
  127. /*********************************************************/
  128. void IIcWriteByte(uchar dat)
  129. {  
  130.         uchar i;

  131.         for(i=0;i<8;i++)
  132.         {
  133.                 dat=dat<<1;
  134.                 SCL_P=0;               
  135.                 Delay6us();
  136.                 SDA_P=CY;               
  137.                 Delay6us();
  138.                 SCL_P=1;                 
  139.                 Delay6us();
  140.         }
  141.         SCL_P=0;                        
  142.         Delay6us();
  143.         SDA_P=1;                        
  144.         Delay6us();
  145. }


  146. /*********************************************************/
  147. // IIC讀一個字節
  148. /*********************************************************/
  149. uchar IIcReadByte()
  150. {
  151.         uchar i,temp,dat=0;
  152.         
  153.         SCL_P=0;                 
  154.         Delay6us();
  155.         SDA_P=1;               
  156.         Delay6us();
  157.         
  158.         for (i=0;i<8;i++)
  159.         {  
  160.                 SCL_P=1;                        
  161.                 Delay6us();
  162.                 temp=SDA_P;               
  163.                 Delay6us();
  164.                 dat=(dat<<1)|temp;
  165.           SCL_P=0;                        
  166.                 Delay6us();
  167.         }
  168.         return(dat);
  169. }



  170. /*********************************************************/
  171. // IIC總線響應
  172. /*********************************************************/
  173. void IIcRespons()
  174. {
  175.         uchar i=0;
  176.         
  177.         SCL_P=1;
  178.         Delay6us();
  179.         
  180.         while((SDA_P==1)&&(i<250))         
  181.         {
  182.                 i++;
  183.         }
  184.         SCL_P=0;
  185.         Delay6us();
  186. }



  187. /*********************************************************/
  188. // IIC讀出數據
  189. /*********************************************************/
  190. uchar IIcReadDat(uchar addr)
  191. {
  192.         uchar dat;

  193.         IIcStart();                                                // 開始信號
  194.         IIcWriteByte(0xa0);                // 寫芯片地址(寫)
  195.         IIcRespons();                                        // 等待應答
  196.         IIcWriteByte(addr);                // 寫內存地址(0-255)
  197.         IIcRespons();                                        // 等待應答  

  198.         IIcStart();                                                // 開始信號
  199.         IIcWriteByte(0xa1);         // 寫芯片地址(讀)
  200.         IIcRespons();                                        // 等待應答  
  201.         dat=IIcReadByte();                // 讀取一個字節數據
  202.         IIcRespons();                                        // 等待應答  
  203.         IIcStop();                                                // 結束信號
  204.         
  205.         DelayMs(2);                                                // 簡短延時
  206.         return dat;                                                // 返回讀取到的數據
  207. }


  208. /*********************************************************/
  209. // IIC寫入數據
  210. /*********************************************************/
  211. void IIcWriteDat(uchar addr,uchar dat)
  212. {
  213.    IIcStart();                                                 // 開始信號
  214.    IIcWriteByte(0xa0);                // 寫芯片地址(寫)
  215.    IIcRespons();                                         // 等待應答
  216.    IIcWriteByte(addr);                // 寫內存地址(0-255)
  217.    IIcRespons();                                         // 等待應答
  218.    IIcWriteByte(dat);                        // 寫入數據
  219.    IIcRespons();                                         // 等待應答
  220.    IIcStop();                                                        // 結束信號
  221.    DelayMs(2);                                                // 簡短延時
  222. }



  223. /**********************************************************
  224. 矩陣鍵盤掃描程序.
  225. -----------------
  226. 如果掃描到有按鍵按下,則返回按鍵值,返回值情況如下所示:
  227.   ----------------------------------
  228.   |                    第1列  第2列 第3列 第4列 |
  229.   |第1行    1             2                 3          12         |
  230.   |第2行    4      5     6    13         |
  231.   |第3行    7      8     9    14   |
  232.   |第4行   10      0    11    15   |
  233.    --------------------------------
  234. 如果掃描不到有按鍵按下,則返回99
  235. **********************************************************/
  236. uchar KeyScanf()
  237. {
  238.         uchar ret,temp1,temp2;
  239.         
  240.         P1=0x0f;
  241.         if(P1!=0x0f)
  242.         {
  243.                 DelayMs(15);
  244.                 if(P1!=0x0f)
  245.                 {
  246.                         temp1=P1;                                                // 判斷出是哪一行按鍵按下
  247.                         P1=0xf0;
  248.                         DelayMs(5);
  249.                         temp2=P1;                                                // 判斷出是哪一列按鍵被按下
  250.                         ret=temp1|temp2;                // 通過行和列的值,確定是哪個按鍵被按下
  251.                         switch(ret)
  252.                         {
  253.                                 case 0xe7:        return 1;
  254.                                 case 0xd7:        return 2;
  255.                                 case 0xb7:        return 3;
  256.                                 case 0x77:        return 12;
  257.                                 
  258.                                 case 0xeb:        return 4;
  259.                                 case 0xdb:        return 5;
  260.                                 case 0xbb:        return 6;
  261.                                 case 0x7b:        return 13;
  262.                                 
  263.                                 case 0xed:        return 7;
  264.                                 case 0xdd:        return 8;
  265.                                 case 0xbd:        return 9;
  266.                                 case 0x7d:        return 14;
  267.                                 
  268.                                 case 0xee:        return 10;
  269.                                 case 0xde:        return 0;
  270.                                 case 0xbe:        return 11;
  271.                                 case 0x7e:        return 15;
  272.                         }
  273.                         return ret;
  274.                 }
  275.         }
  276.         return 99;
  277. }


  278. /*********************************************************/
  279. // 液晶顯示密碼
  280. /*********************************************************/
  281. void LcdPrintCode(uchar num)
  282. {
  283.         LcdGotoXY(row,column);                        // 液晶顯示定位
  284.         LcdWriteData(num+0x30);                        // 顯示輸入的密碼
  285.         DelayMs(150);                                                                // 等待150毫秒
  286.         LcdGotoXY(row,column);                        // 重新回到剛剛的顯示位置
  287.         LcdWriteData('*');                                        // 顯示“*”替換剛剛顯示的數字
  288.         column++;                                                                                // 液晶顯示光標的縱坐標加1
  289. }


  290. /*********************************************************/
  291. // 蜂鳴器鳴叫
  292. /*********************************************************/
  293. void MingJiao(uint time)
  294. {
  295.         Beep_P=0;                                                // 蜂鳴器開始鳴叫
  296.         DelayMs(time);                        // 延時
  297.         Beep_P=1;                                                // 蜂鳴器停止鳴叫
  298. }


  299. /*********************************************************/
  300. // 清除密碼輸入緩沖區的內容
  301. /*********************************************************/
  302. void ClearCodeBuff()
  303. {
  304.         uchar i;
  305.         for(i=0;i<6;i++)                                                                                // 循環執行6次
  306.         {
  307.                 ArrCodeBuff[i]=' ';                                                                // 每次清除一位密碼緩沖區
  308.         }
  309.         inputNum=0;                                                                                                        // 輸入的密碼位數為0
  310. }


  311. /*********************************************************/
  312. // 密碼輸入初始化
  313. /*********************************************************/
  314. void inputInit()
  315. {
  316.         LcdGotoXY(0,0);                                                                                        // 光標定位        
  317.         LcdPrintStr("   State:lock   ");                // 液晶第0行顯示"   State:lock   "
  318.         LcdGotoXY(1,0);                                                                                        // 光標定位        
  319.         LcdPrintStr("Password:       ");
  320.         LcdGotoXY(1,9);                                                                                        // 液晶第1行顯示"Password:       "
  321.         ClearCodeBuff();                                                                                // 清除密碼緩沖區
  322. }


  323. /*********************************************************/
  324. // 密碼初始化
  325. /*********************************************************/
  326. void CodeInit()
  327. {
  328.         uchar dat,i;
  329.         dat=IIcReadDat(10);
  330.         if(dat!=88)                                                                                // 如果是第一次使用AT24C02芯片
  331.         {
  332.                 IIcWriteDat(0,1);                                                // 給AT24C02第0個內存寫入第一個密碼“1”
  333.                 IIcWriteDat(1,2);                                                // 給AT24C02第1個內存寫入第二個密碼“2”
  334.                 IIcWriteDat(2,3);                                                // 給AT24C02第2個內存寫入第三個密碼“3”
  335.                 IIcWriteDat(3,4);                                                // 給AT24C02第3個內存寫入第四個密碼“4”
  336.                 IIcWriteDat(4,5);                                                // 給AT24C02第4個內存寫入第五個密碼“5”
  337.                 IIcWriteDat(5,6);                                                // 給AT24C02第5個內存寫入第六個密碼“6”
  338.                 IIcWriteDat(10,88);                                        // 給AT24C02第10個內存寫入數字“88”,代表密碼初始化好了
  339.         }
  340.         for(i=0;i<6;i++)                                                        // 從AT24C02讀取6個密碼,賦值給密碼數組ArrCode
  341.         {
  342.                 ArrCodeUnlock[i]=IIcReadDat(i);
  343.         }
  344. }



  345. /*********************************************************/
  346. // 主函數,程序從這里開始執行
  347. /*********************************************************/        
  348. void main()
  349. {  
  350.         uchar i;                                                                        // 臨時變量
  351.         uchar keyVal;                                                        // 按鍵掃描的返回值
  352.         
  353.         uchar ArrCodeTemp[6];                        // 臨時數組
  354.         
  355.         LcdInit();                                                                // 液晶初始化
  356.         inputInit();                                                        // 密碼輸入初始化
  357.         CodeInit();                                                                // 密碼初始化
  358.         
  359.         while(1)
  360.         {
  361.                
  362.                 if(inputNum==6)                                        // 如果輸入了6位密碼了
  363.                         LcdWriteCmd(0x0c);                // 關閉光標閃爍
  364.                 else                                                                                // 如果輸入不夠6位密碼
  365.                         LcdWriteCmd(0x0f);                // 開啟光標閃爍
  366.                
  367.                
  368.                 keyVal=KeyScanf();                        // 掃描按鍵是否有按鍵
  369.                 if(keyVal!=99)                                        // 如果有按鍵被按下了
  370.                 {
  371.                         MingJiao(50);                                        // 那么蜂鳴器鳴叫50毫秒
  372.                 }
  373.                
  374.                
  375.                 /* 0-9 數字 */
  376.                 if(keyVal<10)                                                                                                        // 如果數字鍵被按下
  377.                 {
  378.                         if(inputNum<6)                                                                                        // 如果輸入的密碼不到6位
  379.                         {
  380.                                 ArrCodeBuff[inputNum]=keyVal;                        // 給ArrCodeBuff緩沖區加入一個新的密碼記錄
  381.                                 inputNum++;                                                                                                // inputNum加1,代表當前的密碼輸入多了一位
  382.                                 LcdPrintCode(keyVal);                                                        // 將輸入的密碼顯示出來
  383.                         }
  384.                         while(KeyScanf()!=99);                                                        // 等待按鍵釋放
  385.                 }
  386.                
  387.                
  388.                 /* 刪除一個密碼 */
  389.                 if(keyVal==10)                                                                                                // 如果刪除鍵被按下
  390.                 {
  391.                         if(inputNum>0)                                                                                        // 如果當前已經有輸入密碼了
  392.                         {
  393.                                 column--;                                                                                                        // 光標退回上一個位置
  394.                                 LcdGotoXY(row,column);
  395.                                 LcdWriteData(' ');                                                                // 顯示空格
  396.                                 LcdGotoXY(row,column);                                                // 光標退回上一個位置
  397.                                 inputNum--;                                                                                                // inputNum減1,代表當前的密碼刪掉了一位
  398.                                 ArrCodeBuff[inputNum]=' ';                                // 清除一位密碼緩沖區
  399.                         }
  400.                         while(KeyScanf()!=99);                                                        // 等待按鍵釋放
  401.                 }
  402.                
  403.                
  404.                 /* 清除全部密碼 */
  405.                 if(keyVal==11)                                                                                                // 如果取消鍵被按下
  406.                 {
  407.                         ClearCodeBuff();                                                                                // 清除密碼緩沖區
  408.                         
  409.                         if(inputMode==1)                                                                                // 如果當前正在輸入解鎖密碼
  410.                         {
  411.                                 LcdGotoXY(1,0);                                                                                // 光標定位                                                                                
  412.                                 LcdPrintStr("Password:       ");        // 液晶第1行顯示“Password:       ”
  413.                                 LcdGotoXY(1,9);                                                                                // 光標定位        
  414.                         }
  415.                         
  416.                         if(inputMode==2)                                                                                // 如果當前正在輸入修改密碼1
  417.                         {
  418.                                 LcdGotoXY(0,0);                                                                                // 光標定位        
  419.                                 LcdPrintStr(" input1:        ");        // 液晶第0行顯示“input1:        ”
  420.                                 LcdGotoXY(0,8);                                                                                // 光標定位        
  421.                         }
  422.                         
  423.                         if(inputMode==3)                                                                                // 如果當前正在輸入修改密碼2
  424.                         {
  425.                                 LcdGotoXY(1,0);                                                                                // 光標定位        
  426.                                 LcdPrintStr(" input2:        ");        // 液晶第1行顯示“input1:        ”
  427.                                 LcdGotoXY(1,8);                                                                                // 光標定位        
  428.                         }

  429.                         while(KeyScanf()!=99);                                                        // 等待按鍵釋放
  430.                 }
  431.                
  432.                
  433.                 /* 手動關鎖 */
  434.                 if(keyVal==12)
  435.                 {
  436.                         while(KeyScanf()!=99);                                                        // 等待按鍵釋放                                       
  437.                 }
  438.                
  439.                 /* 取消密碼修改 */
  440.                 if(keyVal==13)                                                                                                // 如果修改密碼按鍵被按下
  441.                 {
  442.                         if((inputMode==2)||(inputMode==3))        // 如果當前正在輸入修改密碼
  443.                         {
  444.                                 inputInit();                                                                                        // 輸入初始化(退出修改)
  445.                                 Relay_P=1;                                                                                                // 繼電器閉合
  446.                                 inputMode=1;                                                                                        // 改為輸入解鎖密碼模式
  447.                         }
  448.                         while(KeyScanf()!=99);
  449.                 }
  450.                
  451.                
  452.                 /* 管理員密碼 */               
  453.                 if(keyVal==14)
  454.                 {
  455.                         for(i=0;i<6;i++)
  456.                         {
  457.                                 if(ArrCodeBuff[i]!=ArrCodeAdmin[i])
  458.                                         break;
  459.                         }
  460.                         if(i<6)
  461.                         {
  462.                                 LcdGotoXY(1,0);
  463.                                 LcdPrintStr("     ERROR      ");
  464.                                 MingJiao(5000);        
  465.                         }
  466.                         else
  467.                         {
  468.                                 LcdGotoXY(1,0);
  469.                                 LcdPrintStr("Password Init OK");
  470.                                 MingJiao(3000);
  471.                                 IIcWriteDat(10,' ');
  472.                                 CodeInit();
  473.                         }
  474.                         inputInit();
  475.                 }

  476.                
  477.                 /* 確認按鍵 */
  478.                 if(keyVal==15)                                                                                                // 如果確定鍵被按下
  479.                 {
  480.                         /*解鎖密碼*/
  481.                         if(inputMode==1)                                                                                // 如果當前正在輸入解鎖密碼
  482.                         {
  483.                                 for(i=0;i<6;i++)                                                                        // 把密碼緩沖區的內容和解鎖密碼進行6次比較
  484.                                 {
  485.                                         if(ArrCodeBuff[i]!=ArrCodeUnlock[i])
  486.                                                 break;
  487.                                 }
  488.                
  489.                                 if(i<6)                                                                                                                                // 如果密碼錯誤
  490.                                 {
  491.                                         errTime++;                                                                                             // 錯誤次數加1
  492.                                         LcdGotoXY(1,0);                                                                                        // 光標定位
  493.                                         LcdPrintStr("    ERROR       ");                // 第1行顯示"    ERROR       "
  494.                                         LcdGotoXY(1,11);                                                                                // 光標定位
  495.                                         LcdWriteData(errTime+0x30);                                        // 顯示錯誤的次數
  496.                                         LcdWriteCmd(0x0c);                                                                        // 關閉光標閃爍
  497.                                         MingJiao(3000);                                                                                        // 蜂鳴器鳴叫3秒

  498.                                         if(errTime==3)                                                                                        // 如果錯誤了3次
  499.                                         {
  500.                                                 LcdGotoXY(1,0);                                                                                // 光標定位
  501.                                                 LcdPrintStr("Password:lock   ");        // 第1行顯示"Password:locd   "
  502.                                                 errTime=0;                                                                                                // 密碼錯誤次數清零
  503.                                                 DelayMs(60000);                                                                                // 延時60秒
  504.                                         }
  505.                                 }
  506.                                 else                                                                                                                                        // 如果密碼正確
  507.                                 {
  508.                                         errTime=0;                                                                                                        // 密碼錯誤次數清零
  509.                                         Relay_P=0;                                                                                                        // 打開繼電器
  510.                                         LcdGotoXY(0,0);                                                                                        // 光標定位
  511.                                         LcdPrintStr("   State:open   ");                // 第0行顯示"   State:open   "
  512.                                         LcdGotoXY(1,0);                                                                                        // 光標定位
  513.                                         LcdPrintStr("                ");                // 第1行顯示"                "
  514.                                        
  515.                                         for(i=0;i<100;i++)                                                                        // 進行10秒等待,執行100次循環
  516.                                         {
  517.                                                 keyVal=KeyScanf();                                                                // 掃描按鍵
  518.                                                 DelayMs(100);                                                                                        // 等待100毫秒
  519.                                                 
  520.                                                 if(keyVal==12)                                                                                // 如果手動關鎖按鍵被按下
  521.                                                         break;                                                                                                        // 退出for循環,結束開始等待
  522.                                                 
  523.                                                 if(keyVal==13)                                                                                                                // 如果按下修改密碼鍵
  524.                                                 {
  525.                                                         LcdGotoXY(0,0);                                                                                                        // 光標定位
  526.                                                         LcdPrintStr(" input1:        ");                                // 第0行顯示" input1:        "
  527.                                                         LcdGotoXY(1,0);                                                                                                        // 光標定位
  528.                                                         LcdPrintStr(" input2:        ");                                // 第1行顯示" input2:        "
  529.                                                         LcdGotoXY(0,8);                                                                                                        // 光標定位
  530.                                                         inputMode=2;                                                                                                                // 切換密碼輸入模式
  531.                                                         ClearCodeBuff();                                                                                                // 清除密碼緩沖區
  532.                                                         while(KeyScanf()!=99);                                                                        // 等待按鍵釋放
  533.                                                         break;                                                                                                                                        // 退出for循環,進入密碼修改
  534.                                                 }
  535.                                         }
  536.                                 }
  537.                                 
  538.                                 if(inputMode==1)                                                                                        // 如果當前處于輸入解鎖密碼狀態
  539.                                 {
  540.                                         Relay_P=1;                                                                                                        // 閉合繼電器
  541.                                         inputInit();                                                                                                // 密碼輸入初始化
  542.                                 }
  543.                         }
  544.                         
  545.                         /*修改密碼1*/
  546.                         else if(inputMode==2)                                                                                // 如果當前正在輸入修改密碼1                                       
  547.                         {
  548.                                 for(i=0;i<6;i++)                                                                                        // 將輸入的密碼暫時存入ArrCodeTemp數組
  549.                                 {
  550.                                         ArrCodeTemp[i]=ArrCodeBuff[i];
  551.                                 }
  552.                                 LcdGotoXY(1,8);                                                                                                // 光標定位
  553.                                 inputMode=3;                                                                                                        // 改為輸入 修改密碼2                                       
  554.                                 ClearCodeBuff();                                                                                        // 清除密碼緩沖區
  555.                                 while(KeyScanf()!=99);                                                                // 等待按鍵釋放
  556.                         }
  557.                         
  558.                         /*修改密碼2*/                        
  559.                         else
  560.                         {
  561.                                 for(i=0;i<6;i++)                                                                                        // 將2次輸入的密碼進行比較
  562.                                 {
  563.                                         if(ArrCodeBuff[i]!=ArrCodeTemp[i])
  564.                                                 break;
  565.                                 }
  566.                                 
  567.                                 if(i<6)                                                                                                                                // 密碼修改錯誤
  568.                                 {
  569.                                         LcdGotoXY(0,0);                                                                                        // 光標定位
  570.                                         LcdPrintStr("Password Modify ");                // 第0行顯示"Password Modify "
  571.                                         LcdGotoXY(1,0);                                                                                        // 光標定位
  572.                                         LcdPrintStr("-----failed-----");                // 第1行顯示"-----failed-----"
  573.                                         MingJiao(3000);                                                                                        // 蜂鳴器鳴叫3秒
  574.                                 }
  575.                                 else                                                                                                                                        // 密碼修改成功
  576.                                 {
  577.                                         LcdGotoXY(0,0);                                                                                        // 光標定位
  578.                                         LcdPrintStr("Password Modify ");                // 第0行顯示"Password Modify "
  579.                                         LcdGotoXY(1,0);                                                                                        // 光標定位
  580.                                         LcdPrintStr("---Successful---");                // 第1行顯示"---Successful---"
  581.                                         MingJiao(2000);                                                                                        // 蜂鳴器鳴叫2秒
  582.                                         for(i=0;i<6;i++)
  583.                                         {
  584.                                                 IIcWriteDat(i,ArrCodeTemp[i]);                // 將新的密碼存入EEPROM芯片
  585.                                                 ArrCodeUnlock[i]=ArrCodeTemp[i];        // 將新的密碼存入解鎖密碼數組
  586.                                         }
  587.                                 }
  588.                                 Relay_P=1;                                                                        // 繼電器閉合
  589.                                 inputMode=1;                                                                // 改為輸入解鎖密碼模式
  590.                                 for(i=0;i<6;i++)                                                // 清空修改密碼緩沖區
  591.                                 {
  592.                                         ArrCodeTemp[i]=' ';
  593.                                 }
  594.                                 inputInit();                                                                // 輸入初始化
  595.                                 while(KeyScanf()!=99);                        // 等待按鍵釋放
  596.                         }
  597.                 }
  598.         }
  599. }


  600.                                        
復制代碼

所有資料51hei提供下載:
07、單片機程序(先解壓,后查看).rar (294.84 KB, 下載次數: 92)
08、電路圖(原理圖和PCB圖).rar (317.92 KB, 下載次數: 57)
09、仿真圖.rar (896.85 KB, 下載次數: 98)


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

使用道具 舉報

沙發
ID:89286 發表于 2019-6-29 20:55 | 只看該作者
thanks for sharing
回復

使用道具 舉報

板凳
ID:581274 發表于 2019-7-11 10:18 | 只看該作者
我真是感動死 了
回復

使用道具 舉報

地板
ID:888822 發表于 2021-4-30 10:17 來自手機 | 只看該作者
問一下里面的管理員密碼是做什么用的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美中国少妇xxx性高请视频 | 欧美性一区二区三区 | 香蕉视频91| 亚洲色图网址 | 中文字幕11页 | 亚洲国产一区二区在线 | 国产精品人人做人人爽 | 中文字幕一区二区三区乱码图片 | 日韩精品一区二区三区免费观看 | 99在线免费观看视频 | 台湾佬久久| 天天射天天操天天干 | 久久精品色欧美aⅴ一区二区 | 色.com| 日韩欧美成人一区二区三区 | 丁香五月网久久综合 | 精品一区二区观看 | 国产亚洲成av人片在线观看桃 | h视频在线免费 | 中文字幕视频在线看5 | 亚洲高清在线视频 | 久久久这里都是精品 | 欧美成人精品一区二区三区 | 在线精品一区二区三区 | a视频在线观看 | 国产午夜精品久久久 | 欧洲精品久久久久毛片完整版 | 欧美视频成人 | 99免费 | 黑人精品欧美一区二区蜜桃 | 亚洲一区在线播放 | 亚洲国产看片 | 中文字幕在线免费 | 韩国av一区二区 | 国产精品久久久久aaaa九色 | 天天搞天天操 | 亚洲精品麻豆 | 亚洲精品9999| 国产一区二区毛片 | 丝袜 亚洲 另类 欧美 综合 | 午夜激情影院 |