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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機+PCF8574簡易密碼鎖程序 帶詳細注釋 1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 LUQIMAI 于 2020-6-10 12:52 編輯

*      名稱:基于STC51的簡易密碼鎖
*        硬件配置:IAP15W4K61S4+LCD1602+PCF8574+4*4矩陣鍵盤
*        功能說明:鍵盤表
*                                          [   0,1,2,3,
*                                             4,5,6,7,
*                                              8,9,a,b,
*                                              c,d,e,f
*                                         ]
*                                                按鍵說明:f:確認鍵;e:設置鍵;b:上鎖鍵
*                                         初始密碼:1234
*                                         開門流程:通電,輸入初始密碼,按f鍵,提示open,同時P2燈亮代表開門。
*                                         修改密碼流程:通電后,按e鍵,首先輸入舊的密碼(第一次設置時,舊密碼就是初始密碼),按照LCD提示操作即可。
*                                                上鎖流程:開門后,按下b鍵,上鎖,P2燈滅
*                                                燈光說明:流水燈-在修改密碼時,每一步成功都會有流水燈提示
*                                                                全亮燈-門開
*                                                                全滅燈-門關
*        不足之處:1.不知是單片機識別出現問題,還是鍵盤讀入的問題。有時輸入正確的密碼,但提示錯誤,慢慢的按鍵輸入,出錯的幾率會低些
*                                                2.需要一直通電,如果重新供電后,修改的密碼會失效,所以離應用到實際生活還有距離
*                                                3.暫時這些,有問題望指
*        如果有不同想法的朋友,歡迎一起交流學習!!
硬件連接圖如下:
硬件連接的詳細接法程序中有,不清楚的也可以直接回帖問我
注意注意!!!!做了幾處修改,下面是優化版
注意注意!!!!做了幾處修改,下面是優化版
注意注意!!!!做了幾處修改,下面是優化版
修改:        1.添加刪除功能

        2.優化了幾處錯誤,基本完成所有密碼鎖的功能
如有發現其他錯誤,望不惜賜教!!
此處是優化版的源碼,請下載這個:
優化版.rar (83.14 KB, 下載次數: 44)



(有幾處錯誤)單片機源程序如下:
  1. #include <stc15.h>
  2. #include "intrins.h"
  3. #define uchar unsigned char  
  4. #define uint unsigned int  
  5. #define KeyPort P0                                //外接鍵盤,低四位接行,高四位接列

  6. uchar  KEY_TABLE[16] =
  7. {
  8.     0xEE, 0xDE, 0xBE, 0x7E,
  9.     0xED, 0xDD, 0xBD, 0x7D,
  10.     0xEB, 0xDB, 0xBB, 0x7B,
  11.     0xE7, 0xD7, 0xB7, 0x77
  12. };
  13. int flag1=0;                                                                                                                                                                                                                                                                                        //修改密碼標志位
  14. uchar num,i=0,j;            
  15. uchar passwordtemp[16],password[16]={'1','2','3','4'},newpassword[16];       //輸入的密碼,默認的密碼
  16. uchar inputtimes;                                                                                                                                                                                                      //密碼輸入錯誤次數
  17. uint n,m;                                                                                                                                                                                                                                                                    //輸入密碼長度,實際密碼長度
  18. bit Flag=0;\
  19. uchar light,light1=0,light2=0xf0;                                                                                                                                                        //設置成功,開鎖,錯誤,
  20.    
  21. sbit SCL = P1^0;
  22. sbit SDA = P1^1;

  23. char ADDR = 0x4e;    // PCF8574  T  模塊的地址碼
  24. //char ADDR = 0x7e;    // PCF8574   AT  模塊的地址碼

  25. //***************************** 延時 y  ms ***********************************************
  26. void delay1(int y)   //
  27. {
  28.          ;
  29.         while(y--)
  30.         {
  31.         unsigned char a,b,c;
  32.         for(c=1;c>0;c--)
  33.         for(b=142;b>0;b--)
  34.         for(a=2;a>0;a--);
  35.         }
  36. }

  37. //******************************** IIC 串口開始 ********************************************

  38. void IIC_start(void)
  39. {
  40.         SDA=1;
  41.         _nop_();
  42.         SCL=1;
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         _nop_();
  48.         SDA=0;
  49.         _nop_();
  50.         _nop_();
  51.         _nop_();
  52.         _nop_();
  53.         _nop_();
  54.         SCL=0;
  55.                                 _nop_();
  56.                                 _nop_();
  57.         
  58. }


  59. //********************************** IIC 串口寫1個字節 ******************************************


  60. void IIC_writeByte(char temp)
  61. {
  62.         char i;
  63.         for(i=0;i<8;i++)
  64.         {
  65.                 SDA=(bit)(temp & 0x80) ;   // 根據規定1602的數據最高位必須為  1  
  66.                 temp <<=1;
  67.                 _nop_();
  68.                 _nop_();
  69.                 SCL=1;
  70.                 _nop_();
  71.                 _nop_();
  72.                 _nop_();
  73.                 _nop_();
  74.                 _nop_();
  75.                 SCL=0;
  76.         }
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         SDA=1;
  82.         _nop_();
  83.         _nop_();
  84.         _nop_();
  85.         _nop_();
  86.         SCL=1;
  87.         _nop_();
  88.         _nop_();
  89.         _nop_();
  90.         while(SDA);
  91.         _nop_();
  92.         SCL=0;
  93. }

  94. //******************************** 1602寫命令 ********************************************


  95. void LCD_write_command(char comm)
  96. {
  97.         char tmp;
  98.         IIC_start();          // 串口開始
  99.         IIC_writeByte(ADDR);  // 先選PCF 8574T 的地址  (應該是相當于選中的意思吧)
  100.         
  101.         tmp = comm & 0xF0;    // 與0xf0 應該是取第四位的意思吧
  102.         tmp |= 0x0C;         //保留高4位為指令的高四位,低四位為   RS = 0, RW = 0, EN = 1  
  103.         IIC_writeByte(tmp);  //從串口送出
  104.         delay1(20);
  105.         tmp &= 0xFB;        //Make EN = 0
  106.         IIC_writeByte(tmp);
  107.         
  108.         tmp = (comm & 0x0F) << 4 ;  //將指令的低四位 送到高位置保存
  109.         tmp |= 0x0C;        //RS = 0, RW = 0, EN = 1
  110.         IIC_writeByte(tmp);
  111.         delay1(20);
  112.         tmp &= 0xFB; // Make EN = 0
  113.         IIC_writeByte(tmp);
  114.         
  115. }
  116. //******************************** 1602寫數據 ********************************************


  117. void LCD_write_data(char data1)
  118. {
  119.         char tmp;
  120.         IIC_start();
  121.         IIC_writeByte(ADDR);   // 先選PCF 8574T 的地址  (應該是相當于選中的意思吧)
  122.         
  123.         tmp = data1 & 0xF0;
  124.         tmp |= 0x0D; //RS = 1, RW = 0, EN = 1
  125.         IIC_writeByte(tmp);
  126.         delay1(20);
  127.         tmp &= 0xFB; //Make EN = 0
  128.         IIC_writeByte(tmp);
  129.         
  130.         tmp = (data1 & 0x0F) << 4 ;
  131.         tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
  132.         IIC_writeByte(tmp);
  133.         delay1(20);
  134.         tmp &= 0xFB ; // Make EN = 0
  135.         IIC_writeByte(tmp);
  136. }


  137. //******************************** 1602初始化 ********************************************


  138. void Init_Lcd(void)
  139. {
  140.         LCD_write_command(0x33); //將8位總線轉為4位總線
  141.         delay1(50) ;
  142.         LCD_write_command(0x32); //
  143.         delay1(50) ;
  144.         LCD_write_command(0x28); // 4位數據線,顯示2行,5*7點陣字符  !如果是0x38  則為8位數據線,顯示2行,5*7點陣字符
  145.         delay1(50) ;
  146.         LCD_write_command(0x0C); // 開顯示,關閉光標,不閃爍
  147.         delay1(50) ;  
  148.         LCD_write_command(0x06); // 設定輸入方式,增量不位移
  149.         delay1(50) ;
  150.         LCD_write_command(0x01); // 清屏
  151.         delay1(50) ;
  152. }


  153. //*************************************** 在指定位置顯示字符串 *************************************


  154. void Write_LCD(int x, int y, char *str)
  155. {
  156.         char addr;
  157.         if( x < 0)
  158.         {
  159.                 x = 0;
  160.         }
  161.         if(x > 15)
  162.         {
  163.                 x = 15;
  164.         }
  165.         if(y<0)
  166.         {
  167.                 y = 0;
  168.         }
  169.         if(y > 1)
  170.         {
  171.                 y = 1;
  172.         }
  173.         
  174.         addr = 0x80 + 0x40 * y + x;   // Move cursor  移動光標
  175.         LCD_write_command(addr);
  176.         while (*str)
  177.         {
  178.                 LCD_write_data(*str++);
  179.         }
  180. }


  181. //-------------------------------------------- 顯示字符串的函數 ----------------------------------------------------


  182. void LCD_write_word(unsigned char *s)                  //顯示字符串的函數
  183. {
  184.         while(*s>0)
  185.         {
  186.                 LCD_write_data(*s);
  187.                 s++;
  188.                                                                
  189.         }
  190. }

  191. //********************************* 指定位置顯示一個字符*******************************************


  192. /*
  193. void Print_Char (unsigned char line,unsigned char num,unsigned char date)
  194. {
  195.                 LCD_write_command(line+num);
  196.                 LCD_write_data(date);
  197. }


  198. */

  199. //按指定位置顯示一個字符(針對1602液晶)-用在溫度顯示

  200. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  201. {
  202. Y &= 0x1;
  203. X &= 0xF;                 //限制X不能大于15,Y不能大于1
  204. if (Y) X |= 0x40;        //當要顯示第二行時地址碼+0x40;
  205. X |= 0x80;               // 算出指令碼
  206. LCD_write_command(X);    //這里不檢測忙信號,發送地址碼
  207. LCD_write_data(DData);
  208. }

  209. //--------------------------------------初始化----------------------------------------------------------------
  210. void initial()
  211. {
  212.         P1M0=0;
  213.         P1M1=0;
  214.         P2M0=0;
  215.         P2M1=0;
  216.         P0M0=0;
  217.         P0M1=0;
  218. }

  219. /*------------------------------------------------
  220. 按鍵掃描函數,返回掃描鍵值
  221. ------------------------------------------------*/

  222. unsigned char KeyScan(void)  //鍵盤掃描函數,使用行列反轉掃描法
  223. {
  224.          uchar cord_h,cord_l;            //行列值中間變量
  225.         uchar tempt;
  226.         uint i;
  227.          KeyPort=0xf0;                                                    //列線輸出全為0
  228.          cord_l=KeyPort&0xf0;     //讀入行線值
  229.          if(cord_l!=0xf0)    //先檢測有無按鍵按下
  230.          {
  231.                   delay1(10);        //去抖
  232.                   if(cord_l!=0xf0)
  233.                   {
  234.                             cord_l=KeyPort&0xf0;  //讀入列線值
  235.                             KeyPort=0x0f;                                        //行線輸出為0
  236.                             cord_h=KeyPort&0x0f;  //讀入行線值
  237.                             while((KeyPort&0x0f)!=0x0f);//等待松開并輸出
  238.                             tempt = cord_l+cord_h;
  239.                                         for(i=0;i<16;i++)
  240.                                    if(KEY_TABLE[i]==tempt)
  241.                                                  break;
  242.                                         return(KEY_TABLE[i]);
  243.                    }
  244.           }
  245.           return(0xff);     //返回該值
  246. }

  247. /*------------------------------------------------
  248. 按鍵值處理函數,返回掃鍵值
  249. ------------------------------------------------*/

  250. unsigned char KeyPro(void)
  251. {
  252. switch(KeyScan())
  253. {
  254.   case 0xee:return '0';break;//0 按下相應的鍵顯示相對應的碼值
  255.   case 0xde:return '1';break;//1
  256.   case 0xbe:return '2';break;//2
  257.   case 0x7e:return '3';break;//3
  258.   case 0xed:return '4';break;//4
  259.   case 0xdd:return '5';break;//5
  260.   case 0xbd:return '6';break;//6
  261.   case 0x7d:return '7';break;//7
  262.   case 0xeb:return '8';break;//8
  263.   case 0xdb:return '9';break;//9
  264.   case 0xbb:return 'a';break;//a
  265.   case 0x7b:return 'b';break;//b
  266.   case 0xe7:return 'c';break;//c
  267.   case 0xd7:return 'd';break;//d
  268.   case 0xb7:return 'e';break;//e
  269.   case 0x77:return 'f';break;//f
  270.   default:return 0xff;break;
  271. }
  272. }

  273. //--------------------------------------------------------流水燈--------------------------------------------------------

  274. void RuningLight()                                                                                                                                                                                                //流水燈
  275. {
  276.         light=0xfe;
  277.         P2=light;
  278.         for(j=0;j<8;j++)
  279.            { light<<=1 ;
  280.                          delay1(250);
  281.                          P2=light;
  282.                  }
  283.         P2=0xff;
  284.                         
  285.         
  286. }

  287. //--------------------------------------------------------密碼驗證--------------------------------------------------------

  288. void VriefytPassword()                                                                                                                                                                        //驗證密碼
  289. {        if(flag1)
  290.                                                 m=sizeof(newpassword);                                                                                                                        //記錄新密碼的長度
  291.                                  else
  292.                                           m=sizeof(password);                                                                                                                                        //記錄舊密碼的長度
  293.                                                 n=sizeof(passwordtemp);                                                                                                                        //記錄輸入密碼的長度
  294.                                  if(m==n)                                                                                                        //長度判斷
  295.                                                 {
  296.                                                          if(flag1)                                                                                                                                                                                        //修改密碼后
  297.                                                                         for(j=0;j<sizeof(passwordtemp);j++)                                                                //是否一一對應
  298.                                                                                 { if(passwordtemp[j]==newpassword[j])
  299.                                                                                         Flag=0;
  300.                                                                                         else
  301.                                                                                         { Flag=1;
  302.                                                                                                 break;
  303.                                                                                         }
  304.                                                                                 }
  305.                                                                 else                                                                                                                                                                                                //修改密碼前
  306.                                                                         for(j=0;j<sizeof(passwordtemp);j++)                                                                //是否一一對應
  307.                                                                                 { if(passwordtemp[j]==password[j])
  308.                                                                                         Flag=0;
  309.                                                                                         else
  310.                                                                                         { Flag=1;
  311.                                                                                                 break;
  312.                                                                                         }
  313.                                                                                 }
  314.                                                 }
  315.                                  else
  316.                                  {         Flag=1;
  317.                                                 Write_LCD(0,1,"                ");                //清除該行
  318.                                                 delay1(10);
  319.                                                 Write_LCD(0,1,"Wrong length!");                                //密碼正確顯示的信息
  320.                                           delay1(10);
  321.                                  }
  322.                                  if(Flag)                                                                                                                                        //輸入錯誤提示和輸入錯誤總次數判斷,限定三次
  323.                                  {
  324.                                                 Write_LCD(0,1,"                ");                //清除該行
  325.                                                 delay1(10);
  326.                                                 Write_LCD(0,1,"Wrong Retry!");                                //輸入錯誤提示
  327.                                           for(j=0;j<sizeof(passwordtemp);j++)   //清除輸入的錯誤密碼
  328.                                               passwordtemp[j]='\0';
  329.                                           inputtimes++;                                                                                                        //連續輸入錯誤,則次數累加
  330.                                                 i=0;
  331.                                                         if(inputtimes==3)
  332.                                                                 {
  333.                                                                         Write_LCD(0,1,"                ");//清除該行
  334.                                                                         delay1(10);
  335.                                                                         Write_LCD(0,1,"Wrong 3 times!");//密碼錯誤,提示重新輸入
  336.                                                                         while(1)
  337.                                                                                 P2=light2;                                                                                                 //停止該位置,重啟電源后才能輸入,實際實用中則需要等到一定時間后才能再次輸入。
  338.                                                                 }
  339.                                  }
  340.                                         else
  341.                                         {
  342.                                                                 Write_LCD(0,1,"                ");//清除該行
  343.                                                                 delay1(10);
  344.                                                                 Write_LCD(0,1,"Right Open!>>>>");//密碼正確顯示的信息
  345.                                                                 P2=light1;
  346.                                                                 inputtimes=0;//輸入正確則次數清零,重新計數
  347.                                                                 Flag=0;      //清除正確標志
  348.                                                                 i=0;
  349.                                                                
  350.                                         }
  351. }

  352. //--------------------------------------------------------修改密碼時的密碼驗證--------------------------------------------------------

  353. void SetPassword()                                                                                                                                                                                                                                        //設置新密碼時,先驗證
  354. { while(1)
  355.         { num=KeyPro();  //掃描鍵盤
  356.            if(num!=0xff)  //如果掃描是按鍵有效值則進行處理
  357.                         {
  358.                                 if(i==0)
  359.                                         Write_LCD(0,1,"                ");//清除該行
  360.                                 if(num=='f')                                                                                                                                                                                        //確定鍵按下,進入判斷密碼對錯
  361.                                         {
  362.                                                 i=0;
  363.                                                 if(flag1)
  364.                                                         m=sizeof(newpassword);
  365.                                                 else
  366.                                                         m=sizeof(password);
  367.                                                         n=sizeof(passwordtemp);
  368.                                  
  369.                                                 if(m==n)                                                                                                        //長度判斷
  370.                                                 { if(flag1)
  371.                                                                 for(j=0;j<sizeof(passwordtemp);j++)                                                                //是否一一對應
  372.                                                         { if(passwordtemp[j]==newpassword[j])
  373.                                                                         Flag=0;
  374.                                                                 else
  375.                                                                         { Flag=1;
  376.                                                                                 break;
  377.                                                                         }
  378.                                                         }
  379.                                                         for(j=0;j<sizeof(passwordtemp);j++)                                                                //是否一一對應
  380.                                                         { if(passwordtemp[j]==password[j])
  381.                                                                         Flag=0;
  382.                                                                 else
  383.                                                                         { Flag=1;
  384.                                                                                 break;
  385.                                                                         }
  386.                                                         }
  387.                                                 }
  388.                                  else
  389.                                  {  Flag=1;
  390.                                           Write_LCD(0,1,"                ");                //清除該行
  391.                                                 delay1(10);
  392.                                                 Write_LCD(0,1,"Wrong length!");                                //密碼正確顯示的信息
  393.                                           delay1(10);
  394.                                                 i=0;
  395.                                           P2=light2;
  396.                                           inputtimes++;
  397.                                          
  398.                                  }
  399.                                  if(Flag)                                                                                                                                        //輸入錯誤提示和輸入錯誤總次數判斷,限定三次
  400.                                  {
  401.                                                 Write_LCD(0,1,"                ");                //清除該行
  402.                                                 delay1(10);
  403.                                                 Write_LCD(0,1,"Wrong Retry!");                                //密碼錯誤
  404.                                           for(j=0;j<sizeof(passwordtemp);j++)
  405.                                               passwordtemp[j]='\0';
  406.                                           inputtimes++;                                                                                                        //連續輸入錯誤,則次數累加
  407.                                                         if(inputtimes==3)
  408.                                                                 {
  409.                                                                         Write_LCD(0,1,"                ");//清除該行
  410.                                                                         delay1(10);
  411.                                                                         Write_LCD(0,1,"Wrong 3 times!");//密碼錯誤,提示重新輸入
  412.                                                                         while(1)
  413.                                                                                 P2=light2;                                                                                                 //停止該位置,重啟電源后才能輸入,實際實用中則需要等到一定時間后才能再次輸入。
  414.                                                                 }
  415.                                  }
  416.                                         else
  417.                                         {
  418.                                                                 Write_LCD(0,1,"                ");//清除該行
  419.                                                                 delay1(10);
  420.                                                                 Write_LCD(0,1,"Right Password!");//密碼正確
  421.                                                                 RuningLight();
  422.                                                                 i=0;
  423.                                                                 inputtimes=0;//輸入正確則次數清零,重新計數
  424.                                                                 Flag=0;      //清除正確標志
  425.                                                                 break;
  426.                                         }
  427.                         }
  428.                                 
  429.                         else                                                                                                                                                                 //沒有按確定鍵,保存鍵值
  430.                         {
  431.                                 if(i<16)
  432.                                 {
  433.                                         passwordtemp[i]=num;                                                                                //保存密碼
  434.                                         DisplayOneChar(i,1,num);                                                                //輸入的密碼用"*"代替
  435.                                         i++;                                                                                                                                                //計數,不能超過16位
  436.                                 }
  437.                                 else
  438.                                 {        Write_LCD(0,1,"                ");//清除該行
  439.                                         delay1(10);
  440.                                         Write_LCD(0,1,"Too Many Retry");
  441.                                         inputtimes++;
  442.                                         i=0;        
  443.                                         P2=light2;
  444.                                 }
  445.                         }
  446. }
  447. }
  448. }

  449. //--------------------------------------------------------新密碼輸入--------------------------------------------------------

  450. void NewPasswordInput()                                                                                                                                                                                                        //新密碼輸入
  451. {
  452.                                 while(1)
  453.                                 {        num=KeyPro();  //掃描鍵盤
  454.                                         if(num!=0xff)  //如果掃描是按鍵有效值則進行處理
  455.                                         {
  456.                                                 if(i==0)
  457.                                                         Write_LCD(0,1,"                ");//清除該行
  458.                                                 if(num=='f')
  459.                                                   { i=0;
  460.                                                                 RuningLight();
  461.                                                                 break;
  462.                                                         }
  463.                                                 else if(i<16)                                                                                                                                                        //新密碼不能超過16位
  464.                                                         {
  465.                                                                 newpassword[i]=num;                                                                                //保存密碼
  466.                                                                 DisplayOneChar(i,1,num);                                                                //顯示新密碼
  467.                                                                 i++;                                                                                                                                                //計數,不能超過16位
  468.                                                         }
  469.                                                 else
  470.                                                         {        i=0;
  471.                                                                 Write_LCD(0,1,"                ");                        //清除該行
  472.                                                                 delay1(10);
  473.                                                                 Write_LCD(0,1,"Too Many Retry");                                //輸入過多,報錯
  474.                                                                 delay1(10);
  475.                                                                 for(j=0;j<sizeof(newpassword);j++)                        //清除新密碼
  476.                                                                                 newpassword[j]='\0';
  477.                                                                 P2=light2;
  478.                                                                 Write_LCD(0,1,"                ");                                                                                        //清除該行
  479.                                                                 delay1(10);
  480.                                                                 Write_LCD(0,1,"new password!");                                                                                                 //重新輸入新密碼
  481.                                                                 delay1(10);
  482.                                                                
  483.                                                 }        
  484.                                         }
  485.                                 }
  486. }

  487. //--------------------------------------------------------確認修改的密碼--------------------------------------------------------

  488. void AgainInput()                                                                                                                                                                                                                //新密碼確認
  489. {
  490.         while(1)
  491.         {      
  492.                                         num=KeyPro();  //掃描鍵盤
  493.                                         if(num!=0xff)  //如果掃描是按鍵有效值則進行處理
  494.                                                         { if(i==0)
  495.                                                                         Write_LCD(0,1,"                ");//清除該行
  496.                                                                 if(num=='f')
  497.                                                                 {        
  498.                                                                                 i=0;
  499.                                                                                 n=sizeof(passwordtemp);
  500.                                                                                 m=sizeof(newpassword);
  501.                                                                                 if(m==n)                                                                                                        //長度判斷
  502.                                                                                         {
  503.                                                                                                 for(j=0;j<sizeof(passwordtemp);j++)                                                                //是否一一對應
  504.                                                                                                         { if(passwordtemp[j]==newpassword[j])
  505.                                                                                                                 Flag=0;
  506.                                                                                                                 else
  507.                                                                                                                 { Flag=1;
  508.                                                                                                                         break;
  509.                                                                                                                 }
  510.                                                                                                         }
  511.                                                                                         }
  512.                                                                                 else
  513.                                                                                  Flag=1;
  514.                                                                                 if(Flag)                                                                                                                                        //輸入錯誤提示和輸入錯誤總次數判斷,限定三次
  515.                                                                                         {
  516.                                                                                                 Write_LCD(0,1,"                ");                //清除該行
  517.                                                                                                 delay1(10);
  518.                                                                                                 Write_LCD(0,1,"Difference!!");                                //密碼正確顯示的信息
  519.                                                                                                 for(j=0;j<sizeof(passwordtemp);j++)                        //清除密碼
  520.                                                                                                         passwordtemp[j]='\0';
  521.                                                                                                 i=0;
  522.                                                                                                 Flag=0;
  523.                                                                                                 P2=light2;
  524.                                                                                         }
  525.                                                                
  526.                                                                                 else
  527.                                                                                         {
  528.                                                                                                 Write_LCD(0,1,"                ");//清除該行
  529.                                                                                                 delay1(10);
  530.                                                                                                 Write_LCD(0,1,"Right!");                                        //密碼正確顯示的信息
  531.                                                                                                 delay1(10);
  532.                                                                                                 Write_LCD(0,1,"                ");//清除該行
  533.                                                                                                 delay1(10);
  534.                                                                                                 Write_LCD(0,1,"Finish!");        
  535.                                                                                                 RuningLight();
  536.                                                                                                 Write_LCD(0,1,"                ");//清除該行
  537.                                                                                                 delay1(10);
  538.                                                                                                 Write_LCD(0,1,"Right Open>>>");//清除該行
  539.                                                                                                 P2=light1;
  540.                                                                                                 inputtimes=0;//輸入正確則次數清零,重新計數
  541.                                                                                                 Flag=0;      //清除正確標志
  542.                                                                                                 i=0;
  543.                                                                                                 break;
  544.                                                                                         }

  545.                                                                         }        
  546.                                                                 else if(i<16)                                                                                                                                                                                                        //密碼不能超過16位
  547.                                                                                                 {
  548.                                                                                                         passwordtemp[i]=num;                                                                                //保存密碼
  549.                                                                                                         DisplayOneChar(i,1,num);                                                                //顯示新密碼
  550.                                                                                                         i++;                                                                                                                                                //計數,不能超過16位
  551.                                                                                                 }
  552.                                                                                         else
  553.                                                                                                 {        Write_LCD(0,1,"                ");                        //清除該行
  554.                                                                                                         delay1(10);
  555.                                                                                                         Write_LCD(0,1,"Too Many Retry");                                //輸入過多,報錯
  556.                                                                                                         delay1(10);
  557.                                                                                                         for(j=0;j<sizeof(passwordtemp);j++)                        //清除密碼
  558.                                                                                                         passwordtemp[j]='\0';
  559.                                                                                                         i=0;                                                                                                                                                //重新輸入
  560.                                                                                                         P2=light2;
  561.                                                                                                         Write_LCD(0,1,"                ");                        //清除該行
  562.                                                                                                         delay1(10);
  563.                                                                                                         Write_LCD(0,1,"Input New Again!");                        //重新輸入新密碼
  564.                                                                                                         delay1(10);        
  565.                                                                                                 }
  566.                                                         }
  567.                                        
  568.                 }
  569.         }

  570. //--------------------------------------------------------主函數--------------------------------------------------------

  571. void main()
  572. {
  573.         initial();
  574.         Init_Lcd();         //初始化液晶屏
  575.         delay1(10);        //延時用于穩定,可以去掉
  576.         Write_LCD(0,0,"  Welcome! ");    //寫入第一行信息,主循環中不再更改此信息,所以在while之前寫入
  577.         delay1(10);
  578.         Write_LCD(0,1,"Input password!");    //寫入第二行信息,提示輸入密碼
  579.         delay1(10);
  580. while (1)         //主循環
  581. {

  582.          num=KeyPro();  //掃描鍵盤
  583.          if(num!=0xff)  //如果掃描是按鍵有效值則進行處理
  584.            {
  585.                         if(i==0)
  586.                   Write_LCD(0,1,"                ");                                                                                                //清除該行
  587.                         if(num=='e')                                                                                                                                                                                        //設置新密碼
  588.                         { P2=0xff;
  589.                                 for(j=0;j<sizeof(newpassword);j++)                                                                                        //釋放存儲新密碼數組
  590.                                  newpassword[j] = '\0';                 
  591.                                 Write_LCD(0,1,"Set Password!");
  592.                                 delay1(10);
  593.                                 Write_LCD(0,1,"                ");                                                                                        //清除該行
  594.                                 delay1(10);
  595.                                 Write_LCD(0,1,"Input Password!");                                                                                                //用戶驗證
  596.                                 delay1(10);
  597.                                 SetPassword();                                                                                                                                                                        //驗證密碼
  598.                                 P2=0xff;
  599.                                         Write_LCD(0,1,"                ");                                                                                        //清除該行
  600.                                 delay1(10);
  601.                                 Write_LCD(0,1,"New Password!");                                                                                                         //新密碼輸入
  602.                                 delay1(10);
  603.                                 NewPasswordInput();                                                                                                                                                        //新密碼輸入
  604.                                 P2=0xff;
  605.                                 Write_LCD(0,1,"                ");               
  606.                                 delay1(10);
  607.                                 Write_LCD(0,1,"Again Input!!");
  608.                                 AgainInput();                                                                                                                                                                                //新密碼確認
  609.                                 for(j=0;j<sizeof(passwordtemp);j++)                                                                                        //釋放存儲輸入密碼數組
  610.                                  passwordtemp[j] = '\0';
  611.                                  flag1=1;                                                                                                                                                                                                        //修改密碼標志位        
  612.                         }
  613.                         else if(num=='f')                                                                                                                                                                                        //確定鍵按下,進入判斷密碼對錯
  614.                                                 { i=0;                                                                                                                                                                                                        //清除輸入標志
  615.                                                         VriefytPassword();                                                                                                                                                //密碼認證
  616.                                                 }
  617.                                                 else if(num=='b')                                                                                                                                                                //上鎖
  618.                                                 {
  619.                                                         P2=0xff;
  620.                                                         delay1(10);        
  621.                                                         Write_LCD(0,1,"                ");                                                                                        //清除該行
  622.                                                         delay1(10);
  623.                                                         Write_LCD(0,1,"Input password!");
  624.                                                         i=0;
  625.                                                         for(j=0;j<sizeof(passwordtemp);j++)
  626.                                                           passwordtemp[j] ='\0';                                                                        
  627.                                                 }
  628.                                                 else                                                                                                                                                                                                                //沒有按確定鍵,上鎖鍵,設置鍵,保存鍵值
  629.                                                 {
  630.                                                         if(i<16)
  631.                                                                 {
  632.                                                                         passwordtemp[i]=num;                                                                                //保存密碼
  633.                                                                         DisplayOneChar(i,1,num);                                                                //輸入的密碼用"*"代替
  634.                                                                         i++;                                                                                                                                                //計數,不能超過16位
  635.                                                                 }
  636.                                                         else
  637.                                                                 {        Write_LCD(0,1,"                ");//清除該行
  638.                                                                         delay1(10);
  639.                                                                         Write_LCD(0,1,"Too Many Retry");
  640.                                                                         inputtimes++;
  641.                                                                         i=0;        
  642.                                                                 }
  643.                                                 }
  644.                 }
  645.         }
  646. }
復制代碼

所有程序51hei提供下載:
基于STC51的簡易密碼鎖.rar (50.08 KB, 下載次數: 22)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:510861 發表于 2020-7-30 21:26 | 只看該作者
沙發是我
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久男人| 日本在线免费看最新的电影 | 午夜三级网站 | 国产高清精品在线 | 精品三级在线观看 | 欧美日韩中文字幕在线 | 午夜视频免费网站 | 久久精品av | 夜夜爽夜夜操 | 日本精品一区二区 | 激情六月天 | 亚洲一区二区中文字幕 | 日日淫| 亚洲欧美另类在线观看 | 午夜免费福利电影 | 国产99久久精品一区二区300 | 国产精品视频在线播放 | 久久综合av | 男人天堂网av | 日韩国产高清在线观看 | 日韩精品在线免费 | 国产日韩精品在线 | www网站在线观看 | 中文字幕一区二区三区四区五区 | 亚洲免费人成在线视频观看 | 日韩三级一区 | 亚洲精品久久久 | 99久久精品免费看国产免费软件 | 日本在线一区二区 | 久一久 | 国产一级片在线播放 | 国产一区二区三区久久久久久久久 | japan25hdxxxx日本 做a的各种视频 | 成人不卡 | 国产影音先锋 | 国产精品久久久亚洲 | 午夜视频导航 | 亚洲电影第三页 | 久久精品成人 | 国产免费看 | 免费成人高清在线视频 |