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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機密碼鎖程序無法更改密碼的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:76027 發表于 2024-5-15 14:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近按論壇上的例程,做了一個密碼鎖。按原例程的本意,應該是下載程序第一次使用時,要初始化密碼,F在是沒有初始化直接用CurrentPassword[6]數組可以打開密碼鎖,在打開密碼鎖的情況下,再次輸入CurrentPassword[6]數組,可以進入更改密碼畫面,輸入二次新密碼后,顯示密碼更改成功,但新密碼無法打開密碼鎖。下面是部分代碼,完整的代碼在這里:密碼鎖
  1. /========================重置密碼==================================================
  2. //==================================================================================
  3. void ResetPassword(void)
  4. {
  5.         unsigned char i;      
  6.         unsigned char j;
  7.         if(pass==0)
  8.         {
  9.                 pass=0;                          
  10.                 DisplayChar();           //顯示錯誤
  11.                 ThreeAlam();           //沒開鎖時按下重置密碼報警3聲
  12.         }
  13.         else                                   //開鎖狀態下才能進行密碼重置程序
  14.         {
  15.             if(ReInputEn==1)   //開鎖狀態下,ReInputEn置1,重置密碼允許
  16.                 {
  17.                         if(N==6)           //輸入6位密碼
  18.                         {
  19.                                 ReInputCont++;                        //密碼次數計數      
  20.                                 if(ReInputCont==2)                //輸入兩次密碼
  21.                                 {
  22.                                         for(i=0;i<6;)
  23.                                         {
  24.                                                 if(TempPassword[i]==InputData[i])        //將兩次輸入的新密碼作對比
  25.                                                         i++;
  26.                                                 else                                                                //如果兩次的密碼不同
  27.                                                 {
  28.                                                         //DisplayListChar(0,1,Error);
  29.                                                         write_1602com(er);
  30.                                                         for(j=0;j<16;j++)
  31.                                                         {
  32.                                                                 write_1602dat(Error[j]);        //顯示錯誤Error
  33.                                                         }
  34.                                                         ThreeAlam();                        //錯誤提示      
  35.                                                         pass=0;                                        //關鎖
  36.                                                         ReInputEn=0;                        //關閉重置功能,
  37.                                                         ReInputCont=0;
  38.                                                         DisplayChar();
  39.                                                         break;
  40.                                                 }
  41.                                         }
  42.                                         if(i==6)
  43.                                         {
  44.                                                 //DisplayListChar(0,1,ResetOK);
  45.                                                 write_1602com(er);
  46.                                                 for(j=0;j<16;j++)
  47.                                                 {
  48.                                                         write_1602dat(ResetOK[j]);          //密碼修改成功,顯示
  49.                                                 }

  50.                                                 TwoAlam();                                //操作成功提示
  51.                                                  WrToROM(TempPassword,0,6);                //將新密碼寫入24C02存儲
  52.                                                 ReInputEn=0;
  53.                                         }
  54.                                         ReInputCont=0;
  55.                                         CorrectCont=0;
  56.                                 }
  57.                                 else                                          //輸入一次密碼時
  58.                                 {
  59.                                         OneAlam();
  60.                                         //DisplayListChar(0, 1, again);                 //顯示再次輸入一次
  61.                                         write_1602com(er);
  62.                                         for(j=0;j<16;j++)
  63.                                         {
  64.                                                 write_1602dat(again[j]);                        //顯示再輸入一次
  65.                                         }                                       
  66.                                         for(i=0;i<6;i++)
  67.                                         {
  68.                                                 TempPassword[i]=InputData[i];                //將第一次輸入的數據暫存起來                                               
  69.                                         }
  70.                                 }

  71.                         N=0;                                                //輸入數據位數計數器清零
  72.                    }
  73.             }
  74.         }
  75. }
  76. //=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================
  77. void Alam_KeyUnable(void)
  78. {
  79.         P1=0x00;
  80.         {
  81.                 ALAM=~ALAM;                                 //蜂鳴器一直閃爍鳴響
  82.                 Delay5Ms();
  83.         }
  84. }
  85. //=======================取消所有操作============================================
  86. void Cancel(void)
  87. {      
  88.         unsigned char i;
  89.         unsigned char j;
  90.         //DisplayListChar(0, 1, start_line);
  91.         write_1602com(er);
  92.         for(j=0;j<16;j++)
  93.         {
  94.                 write_1602dat(start_line[j]);          //顯示開機輸入密碼界面
  95.         }
  96.         TwoAlam();                                //提示音
  97.         for(i=0;i<6;i++)
  98.         {
  99.                 InputData[i]=0;                //將輸入密碼清零
  100.         }
  101.         KEY=1;                                        //關閉鎖
  102.         ALAM=1;                                        //報警關
  103.         pass=0;                                        //密碼正確標志清零
  104.         ReInputEn=0;                        //重置輸入充許標志清零
  105.         ErrorCont=0;                        //密碼錯誤輸入次數清零
  106.         CorrectCont=0;                        //密碼正確輸入次數清零
  107.         ReInputCont=0;                        //重置密碼輸入次數清零
  108.         s3_keydown=0;
  109.         key_disable=0;                        //鎖定鍵盤標志清零
  110.         N=0;                                        //輸入位數計數器清零
  111. }

  112. //==========================確認鍵,并通過相應標志位執行相應功能===============================
  113. void Ensure(void)
  114. {      
  115.         unsigned char i,j;
  116.         RdFromROM(CurrentPassword,0,6);                                         //從24C02里讀出存儲密碼
  117.     if(N==6)
  118.         {
  119.             if(ReInputEn==0)                                                        //重置密碼功能未開啟
  120.                 {
  121.                         for(i=0;i<6;)
  122.                            {                                       
  123.                                 if(CurrentPassword[i]==InputData[i])        //判斷輸入密碼和24c02中的密碼是否相同
  124.                                 {
  125.                                         i++;                                                                //相同一位 i就+1
  126.                                 }
  127.                                 else                                                                         //如果有密碼不同
  128.                                 {                                                                              
  129.                                         ErrorCont++;                                                //錯誤次數++
  130.                                         if(ErrorCont==3)                        //錯誤輸入計數達三次時,報警并鎖定鍵盤
  131.                                         {
  132.                                                 write_1602com(er);
  133.                                                 for(i=0;i<16;i++)
  134.                                                 {
  135.                                                         write_1602dat(Error[i]);      
  136.                                                 }
  137.                                                 do
  138.                                                 Alam_KeyUnable();
  139.                                                 while(1);
  140.                                         }
  141.                                         else                                         //錯誤次數小于3次時,鎖死鍵盤3秒,然后重新可以輸入
  142.                                         {
  143.                                                 TR0=1;                                //開啟定時
  144.                                                 key_disable=1;                        //鎖定鍵盤
  145.                                                 pass=0;                                        //pass位清零
  146.                                                 break;                                        //跳出
  147.                                         }
  148.                                 }
  149.                         }

  150.                         if(i==6)                                         //密碼輸入對時
  151.                         {
  152.                                 if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
  153.                                    {
  154.                                         WrToROM(initpassword,0,6);                                 //強制將初始密碼寫入24C02存儲
  155.                                         write_1602com(er);
  156.                                         for(j=0;j<16;j++)
  157.                                         {
  158.                                                 write_1602dat(initword[j]);                                //顯示初始化密碼
  159.                                         }
  160.                                         TwoAlam();                                                                        //成功提示音
  161.                                         Delay400Ms();                                                                //延時400ms
  162.                                         TwoAlam();                                                                        //成功提示音
  163.                                         N=0;                                                                                //輸入位數計數器清零
  164.                                 }
  165.                                 else
  166.                                 {
  167.                                         CorrectCont++;                                        //輸入正確變量++
  168.                                         if(CorrectCont==1)                                //正確輸入計數,當只有一次正確輸入時,開鎖
  169.                                         {
  170.                                                 //DisplayListChar(0,1,LockOpen);
  171.                                                 write_1602com(er);
  172.                                                 for(j=0;j<16;j++)
  173.                                                 {
  174.                                                         write_1602dat(LockOpen[j]);                  //顯示open開鎖畫面
  175.                                                 }
  176.                                                 TwoAlam();                        //操作成功提示音
  177.                                                 KEY=0;                                                                                        //開鎖
  178.                                                 pass=1;                                                                                        //置正確標志位
  179.                                                 TR0=1;                                                                                        //開啟定時
  180.                                                 for(j=0;j<6;j++)                                                                //將輸入清除
  181.                                                 {
  182.                                                         InputData[i]=0;                                                                //開鎖后將輸入位清零
  183.                                                 }
  184.                                         }      
  185.                                         else                                                                                                //當兩次正確輸入時,開啟重置密碼功能
  186.                                         {
  187.                                                 write_1602com(er);
  188.                                                 for(j=0;j<16;j++)
  189.                                                 {
  190.                                                         write_1602dat(SetNew[j]);                                        //顯示重置密碼界面
  191.                                                 }
  192.                                                 TwoAlam();                                                                            //操作成功提示
  193.                                                 ReInputEn=1;                                                                        //允許重置密碼輸入
  194.                                                 CorrectCont=0;                                                                        //正確計數器清零
  195.                                         }
  196.                                 }
  197.                           }
  198.       
  199.                         else                        //=========================當第一次使用或忘記密碼時可以用131420對其密碼初始化============
  200.                         {
  201.                                 if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
  202.                                    {
  203.                                         WrToROM(initpassword,0,6);                                 //強制將初始密碼寫入24C02存儲
  204.                                         write_1602com(er);
  205.                                         for(j=0;j<16;j++)
  206.                                         {
  207.                                                 write_1602dat(initword[j]);                                //顯示初始化密碼
  208.                                         }
  209.                                         TwoAlam();                                                                        //成功提示音
  210.                                         Delay400Ms();                                                                //延時400ms
  211.                                         TwoAlam();                                                                        //成功提示音
  212.                                         N=0;                                                                                //輸入位數計數器清零
  213.                                 }
  214.                                 else                                                                                        //密碼輸入錯誤
  215.                                 {
  216.                                         write_1602com(er);
  217.                                         for(j=0;j<16;j++)
  218.                                         {
  219.                                                 write_1602dat(Error[j]);                                 //顯示錯誤信息
  220.                                         }
  221.                                         ThreeAlam();                                                                                //錯誤提示音
  222.                                         pass=0;      
  223.                                 }
  224.                         }
  225.                 }

  226.                 else                                                                                        //當已經開啟重置密碼功能時,而按下開鎖鍵,
  227.                 {
  228.                         //DisplayListChar(0,1,Er_try);
  229.                         write_1602com(er);
  230.                         for(j=0;j<16;j++)
  231.                         {
  232.                                 write_1602dat(Er_try[j]);                          //錯誤,請重新輸入
  233.                         }
  234.                         ThreeAlam();                                                          //錯誤提示音
  235.                 }
  236.         }

  237.         else                                   //密碼沒有輸入到6位時,按下確認鍵時
  238.         {
  239.                 //DisplayListChar(0,1,Error);
  240.                 write_1602com(er);
  241.                 for(j=0;j<16;j++)
  242.                 {
  243.                         write_1602dat(Error[j]);                 //顯示錯誤
  244.                 }

  245.                 ThreeAlam();                                                                                //錯誤提示音
  246.                 pass=0;      
  247.         }
  248.       
  249.         N=0;                                                                                                        //將輸入數據計數器清零,為下一次輸入作準備
  250. }


  251. //==============================主函數===============================
  252. void main(void)
  253. {
  254.         unsigned char KEY,NUM;
  255.         unsigned char i,j;
  256.         P1=0xFF;                                    //P1口復位
  257.         TMOD=0x11;                                   //定義工作方式
  258.         TL0=0xB0;
  259.         TH0=0x3C;                                   //定時器賦初值
  260.         EA=1;                                           //打開中斷總開關
  261.         ET0=1;                                           //打開中斷允許開關
  262.         TR0=0;                                           //打開定時器開關
  263.         Delay400Ms();         //啟動等待,等LCM講入工作狀態
  264.         lcd_init();         //LCD初始化
  265.         write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  266.         for(i=0;i<16;i++)
  267.         {
  268.                 write_1602dat(name[i]);//向液晶屏寫開機畫面
  269.         }
  270.         write_1602com(er);
  271.         for(i=0;i<16;i++)
  272.         {
  273.                 write_1602dat(start_line[i]);//寫輸入密碼等待界面
  274.         }
  275.         write_1602com(er+9);        //設置光標位置
  276.         write_1602com(0x0f);        //設置光標為閃爍
  277.         Delay5Ms(); //延時片刻(可不要)

  278.         N=0;                                                                                                                //初始化數據輸入位數
  279.         while(1)                 //進入循環
  280.         {
  281.                 if(key_disable==1)                                                //鎖定鍵盤標志為1時
  282.                         Alam_KeyUnable();                                        //報警鍵盤鎖
  283.                 else
  284.                         ALAM=1;                                                                //關報警

  285.                 KEY=keynum();                                                        //讀按鍵的位置碼
  286.                 if(KEY!=0)                                                                //當有按鍵按下時
  287.                 {      
  288.                         if(key_disable==1)                                        //鎖定鍵盤標志為1時
  289.                         {
  290.                                 second=0;                                                //秒清零
  291.                         }
  292.                         else                                                                //沒有鎖定鍵盤時
  293.                         {
  294.                                 NUM=coding(KEY);                                //根據按鍵的位置將其編碼,編碼值賦值給NUM
  295.                                 {
  296.                                         switch(NUM)                                        //判斷按鍵值
  297.                                         {
  298.                                                 case ('A'):         ;                                         break;
  299.                                                 case ('B'):                ;                                     break;
  300.                                                 case ('C'):
  301.                                                                         write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  302.                                                                         for(i=0;i<16;i++)
  303.                                                                         {
  304.                                                                                 write_1602dat(name[i]);//向液晶屏寫開機畫面
  305.                                                                         }
  306.                                                                         if(N>=1) N--;        OneAlam();                                                                //按鍵提示音                                               
  307.                                                                         //DisplayOneChar(6+N,1,'*');
  308.                                                                         for(j=N;j<16;j++)
  309.                                                                         {
  310.                                                                                 write_1602com(er+6+j);
  311.                                                                                 write_1602dat(' ');
  312.                                                                         }
  313.                                                                         for(j=0;j<N;j++)
  314.                                                                         {
  315.                                                                                 write_1602com(er+6+j);                                //顯示位數隨輸入增加而增加
  316.                                                                                 write_1602dat('*');                                        //但不顯示實際數字,用*代替
  317.                                                                         }  
  318.                                                                         InputData[N]=N+4;
  319.                                                                         break;                //ABC是無定義按鍵
  320.                                                 case ('D'): ResetPassword();                break;      //重新設置密碼
  321.                                                 case ('*'): Cancel();                                break;      //取消當前輸入
  322.                                                 case ('#'): Ensure();                                 break;           //確認鍵,
  323.                                                 default:                                                                                 //如果不是功能鍵按下時,就是數字鍵按下
  324.                                                 {      
  325.                                                         //DisplayListChar(0,1,Input);
  326.                                                         if(N<6)                                                           //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
  327.                                                         {
  328.                                                                 write_1602com(er);
  329.                                                                 for(i=0;i<16;i++)
  330.                                                                 {
  331.                                                                         write_1602dat(Input[i]);                                //顯示輸入畫面
  332.                                                                 }
  333.                                                                 OneAlam();                                                                //按鍵提示音      
  334.                                                                  for(j=0;j<=N;j++)
  335.                                                                 {
  336.                                                                         write_1602com(er+6+j);                                //顯示位數隨輸入增加而增加
  337.                                                                         write_1602dat('*');                                        //但不顯示實際數字,用*代替
  338.                                                                 }
  339.                                                                 InputData[N]=NUM;                                                //將數字鍵的碼賦值給InputData[]數組暫存
  340.                                                                 N++;                                                                        //密碼位數加
  341.                                                         }
  342.                                                         else                                                                                //輸入數據位數大于6后,忽略輸入
  343.                                                         {
  344.                                                                 N=6;                                                                        //密碼輸入大于6位時,不接受輸入
  345.                                                                  break;
  346.                                                         }
  347.                                                 }
  348.                                         }
  349.                                 }
  350.                         }
  351.                  }
  352.         }
  353. }

  354. //*********************************中斷服務函數**************************************
  355. void  time0_int(void) interrupt 1                    //定時器T0
  356. {
  357.         TL0=0xB0;
  358.         TH0=0x3C;                  //定時器重新賦初值
  359.         //TR0=1;
  360.         countt0++;                           //計時變量加,加1次時50ms
  361.           if(countt0==20)                   //加到20次就是1s
  362.            {
  363.                 countt0=0;                   //變量清零
  364.                 second++;                   //秒加
  365.                 if(pass==1)                   //開鎖狀態時
  366.                 {
  367.                         if(second==1)                        //秒加到1s時
  368.                         {
  369.                                 TR0=0;                                //關定時器
  370.                                 TL0=0xB0;
  371.                                 TH0=0x3C;                        //再次賦初值
  372.                                 second=0;                        //秒清零
  373.                         }
  374.                 }
  375.                 else                                                //不在開鎖狀態時
  376.                 {
  377.                         if(second==3)                        //秒加到3時
  378.                         {
  379.                                 TR0=0;                                //關閉定時器
  380.                                 second=0;                        //秒清零
  381.                                 key_disable=0;                //鎖定鍵盤清零
  382.                                 s3_keydown=0;      
  383.                                 TL0=0xB0;
  384.                                 TH0=0x3C;                        //重新賦初值
  385.                         }
  386.                         else
  387.                             TR0=1;                                //打開定時器
  388.                 }
  389.                        
  390.            }
  391. }
復制代碼

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

使用道具 舉報

沙發
ID:76027 發表于 2024-5-15 20:49 | 只看該作者
已搞定,發現論壇上有的例程不知都被誰刪掉了關鍵的語句。既然例程發上來了,為什么要刪關鍵語句呢?這個二個地方加上標記紅色的字符就可以修改密碼:
     if(i==6)
                                        {
                                                //DisplayListChar(0,1,ResetOK);
                                                write_1602com(er);
                                                for(j=0;j<16;j++)
                                                {
                                                        write_1602dat(ResetOK[j]);          //密碼修改成功,顯示
                                                }

                                                TwoAlam();                                //操作成功提示
CurrentPassword[6] = TempPassword[6];
                                                 WrToROM(TempPassword,0,6);                //將新密碼寫入24C02存儲
                                                ReInputEn=0;
                                        }
                                        ReInputCont=0;
                                        CorrectCont=0;
                                }



  else                        //=========================當第一次使用或忘記密碼時可以用131420對其密碼初始化============
                        {
                                if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
                                   {
CurrentPassword[6] = initpassword[6];
                                        WrToROM(initpassword,0,6);                                 //強制將初始密碼寫入24C02存儲
                                        write_1602com(er);
                                        for(j=0;j<16;j++)
                                        {
                                                write_1602dat(initword[j]);                                //顯示初始化密碼

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:161164 發表于 2024-5-16 09:08 | 只看該作者
源代碼是6位密碼,用6位數組儲存
CurrentPassword[6] 和 initpassword[6] 是第7位
數組溢出了
回復

使用道具 舉報

地板
ID:76027 發表于 2024-5-16 11:28 | 只看該作者
數組0-5,不就是6位嗎?
回復

使用道具 舉報

5#
ID:161164 發表于 2024-5-16 16:35 | 只看該作者
bd5fna 發表于 2024-5-16 11:28
數組0-5,不就是6位嗎?

那你新加CurrentPassword[6] = initpassword[6] 干嘛?
回復

使用道具 舉報

6#
ID:1112624 發表于 2024-6-19 20:55 | 只看該作者
bd5fna 發表于 2024-5-15 20:49
已搞定,發現論壇上有的例程不知都被誰刪掉了關鍵的語句。既然例程發上來了,為什么要刪關鍵語句呢?這個二 ...

你好,更改了以上操作還是修改不了密碼
回復

使用道具 舉報

7#
ID:1112624 發表于 2024-6-19 20:56 | 只看該作者
lkc8210 發表于 2024-5-16 16:35
那你新加CurrentPassword[6] = initpassword[6] 干嘛?

你知道如何更改代碼嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天天天天天操 | 久久久国产精品一区 | 日韩一二三区视频 | 国产乱码精品一区二区三区五月婷 | 国产精品日本一区二区在线播放 | 欧美日韩视频在线播放 | 性大毛片视频 | 九九热这里 | 久久久久国产一级毛片高清网站 | 成人午夜精品一区二区三区 | 蜜桃视频一区二区三区 | 久久的色 | 国产一区二区精 | 999久久久| 中文字幕免费观看 | www.婷婷 | 国产精品久久一区二区三区 | 最近中文字幕在线视频1 | 91一区二区三区在线观看 | 久久久久久久av | av在线免费观看网站 | 国产专区在线 | 在线日韩av电影 | 九一在线观看 | 精品在线播放 | 日韩在线观看网站 | 特级黄一级播放 | 99视频网站 | 成人欧美日韩一区二区三区 | 久久这里只有精品首页 | 夜夜夜操 | 99视频免费 | 五月婷婷中文 | 天天艹天天干天天 | 日本在线视频中文字幕 | 亚洲一区二区电影网 | 国产免费av在线 | 国产精品久久久久久久久久免费 | 欧美一区二区三区在线 | 精品国产一区二区三区久久久久久 | 亚洲精品久久久久久久久久久 |