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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機密碼鎖程序該如何調試?總是顯示密碼錯誤

[復制鏈接]
跳轉到指定樓層
樓主
ID:1029667 發表于 2022-6-7 13:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,謝謝大家

水平受限,我輸入密碼的時候,總是顯示密碼錯誤,但是我找了半天,也沒發現問題.

/**************************************************************************************
*電子密碼鎖*
實現現象:下載程序輸入正確密碼,會聽到繼電器吸合的聲音
硬件連接:
           P1 -->矩陣鍵盤
                                         P20--> EEPROM模塊SDA
                                         P21--> EEPROM模塊SCL
                                         P22-->繼電器模塊J15
                                         
                                         矩陣鍵盤:
                                         0      1      2       3
                                         
                                         4      5      6       7
                                         
                                         8      9    返回    確定
                                         
                                         $      $      $       $
注意事項:無                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                       //此文件中定義了單片機的一些特殊功能寄存器
#include "lcd.h"
#include "key.h"
#include "i2c.h"

#define u16 unsigned int           //對數據類型進行聲明定義
#define u8 unsigned char

//sbit AS=P2^2;               //繼電器

/*****************************************************************************/

/*****************************************************************************/
u8 pw_num,Error_Num,PassWord_Length=6;
u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
u8 INPUT_PW_Tab[10];
u8 key_num,Step,Step5,Load_first_flag=0;
/*****************************************************************************/

/*******************************************************************************/
bit result_flag,Input_suc_flag;
bit List1=0;
/*****************************************************************************/

/*******************************************************************************/
void Step_0();
void Step_1();
void Step_2();
void Step_3();
void Step_4();
         
void Step_5();
                 void Step5_0();
           void Step5_1();
           void Step5_2();
           void Step5_3();
           void Step5_4();
           void Step5_5();
void Step_6();
/********************************************************************************/

/*******************************************************************************/
void CipherComparison();
void input_password(bit m);
void Read_Password();



/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        u8 data1,a;
        //        ShowString(0x00," Pechin Science ");  
        //        At24c02Write(0,0);                                                //開機顯示密碼
        LcdWriteCom(0x01);  //清屏
        for(data1=0;data1<PassWord_Length+2;data1++)
        {
                a=At24c02Read(data1)+0x30;
                 LcdWriteData(a);        
          delay(1000);        
  }
        
        delay(1000);
        LcdInit();
        delay(1000);
        Step=0;
        Step5=0;
        Error_Num=0x00;
  Read_Password();
        
    //保存 密碼長度
//                for(j=0;j<10;j++)
//                {
//                        At24c02Write(j,j);
//                        delay(100);        
//                }
//        

        
        while(1)
                                {        
                                                                key_num=KeyDown();                   //讀取輸入值

                                                                                switch(Step)
                                                                                {
                                                                                                case 0:
                                                                                                 {Step_0();break;}
                                                                                                case 1:
                                                                                                 {Step_1();break;}
                                                                                                case 2:
                                                                                                 {Step_2();break;}
                                                                                                case 3:
                                                                                                 {Step_3();break;}        
                                                                                                case 4:
                                                                                                 {Step_4();break;}        
                                                                                                case 5:
                                                                                                 {Step_5();break;}        
                                                                                                case 6:
                                                                                                 {Step_6();break;}        
                                                                                                  
                                                                                }

                                 }                                
}

/*****************************************************************************/

/*******************************************************************************/
void Step_0()
{
                                        LcdInit();
                                        ShowString(0x00," Pechin Science ");                           //第一行顯示Pechin Science
                ShowString(0x10,"    WELCOME!    ");                           // 第二行顯示 WELCOME!  
        
                                        while(KeyDown()==0xff)Step=1;                                  //  有按鍵按下進入下一步  
              
                                       
}
/*****************************************************************************/

/*******************************************************************************/
void Step_1()
{
                LcdWriteCom(0x01);                                           //清屏
          ShowString(0x00,"Unlock");
                ShowString(0x0f,"<");                                               //1602第一行顯示unlock
          ShowString(0x10,"Change Password");
                ShowString(0x1f," ");                                                // 1602第二行顯示Change Password                                                                                    
          Step=2;                                                              //
}
/*****************************************************************************/

/*******************************************************************************/
void Step_2()
{

        if(key_num!=0x0b)  
                {
                                        if((key_num==0x01) ||( key_num==0x09))                    //1鍵或9鍵按下
                                        {
                                                                List1=~List1;                           //Change Password
                                                                if(List1==0)
                                                                        {                                                  
                                                                        ShowString(0x0f,"<");                           // Unlock            <
                                                                        ShowString(0x1f," ");                                  // Change Password  
                                                                }
                                                                else
                                                                {
                                                                        ShowString(0x0f," ");                           // Unlock            
                                                                        ShowString(0x1f,"<");                                  // Change Password   <
                                                                }
                                        }
                }
        else                                                           //確認鍵按下
        {
                                        if(List1==0){Step=3;}
                                        else        {Step=5;List1=0;}
        }
}
/*****************************************************************************/

/*******************************************************************************/
void Step_3()                                             //
{
                                                                Step=4;
                      pw_num=0;
                                                                LcdInit();
                                                                ShowString(0x00,"Pass Word:  ");

                                                
}
/*****************************************************************************/

/*******************************************************************************/
void Step_4()                                                
{
           input_password(0);                                              //輸入密碼并以*顯示
           if(Input_suc_flag==1){Step=6;}                                  //密碼輸入完成進入下一步
      Input_suc_flag=0;                                              //清除密碼輸入完成標志
}
/*****************************************************************************/

/*******************************************************************************/
void Step_5()                                                        //修改密碼
{
        switch(Step5)
        {
               
                        case 0: {Step5_0();}  break;
                        case 1: {Step5_1();}  break;
                        case 2: {Step5_2();}  break;
                        case 3: {Step5_3();}  break;
                  case 4: {Step5_4();}  break;
                        case 5:        {Step5_5();}        break;

        }
}
/*****************************************************************************/

/*******************************************************************************/
void Step_6()
{
        CipherComparison();                                //密碼比對
        if(result_flag==1)                                 //密碼正確
                {
                                LcdInit();
                                ShowString(0x00,"    WELCOME!");
                        //        AS=0;                                         //開繼電器
                                delay(60000);
                                delay(60000);
                                //AS=1;                                                //關繼電器
                }
        else                                                //密碼錯誤
                {
                                LcdInit();
                                ShowString(0x00,"Error 01!");
                }
               
                Step=0;
        

}

/****************************************************************************************
密碼輸入函數
密碼長度:pw_num
密碼輸入完成標志:Input_suc_flag
*****************************************************************************************/

void Step5_0()                 
{
                LcdWriteCom(0x01);  //清屏
          ShowString (0x00,"Input PassWord:");     //1602顯示:輸入密碼
          Step5=1;
          pw_num=0;
}
void Step5_1()               
{
                input_password(0);                  //   輸入密碼并以*顯示
                if(Input_suc_flag==1)               //密碼輸入完成
                        {
                                                        Step5=2;                  //
                                                        Input_suc_flag=0;         //清除密碼輸入完成標志
                        }
}
void Step5_2()                //
{
     CipherComparison();                //密碼比對
           Step5=3;
}
void Step5_3()                //
{
    if(result_flag==0)         //        密碼錯誤
                                {
                                                        if(Error_Num<3)             //輸出錯誤次數小于3
                                                        {
                                                                Error_Num++;
                                                                LcdInit();
                                                                ShowString (0x00,"Error 01");
                                                                delay(20000);
                                                                Step5=0;
                                                        }
                                                        else                          //密碼錯誤次數大于3
                                                        {
                                                                Error_Num=0;
                                                                Step=0;
                                                        }
                                       
                                }
                else                                                                                                     //密碼正確
                                {
                                        LcdInit();
                                        ShowString (0x00,"New PassWord:");        
                                        pw_num=0;
                                        Step5=4;
                                }
                        
                                       
}
void Step5_4()
{
                input_password(1);                                                    //輸入密碼并顯示
                if(Input_suc_flag==1)                  //輸入完成
                        {
                                Step5=5;
                                Input_suc_flag=0;
                                LcdWriteCom(0x01);  //清屏
              ShowString (0x00,"      OK!");
                        }
}
void Step5_5()
{
        unsigned char j;
        
        PassWord_Length=pw_num;                         //讀取輸入密碼長度
        At24c02Write(0,Load_first_flag);        
  delay(100);        
        At24c02Write(1,PassWord_Length);                //保存 密碼長度
        delay(100);
        for(j=0;j<PassWord_Length;j++)         
        {
                PASSWORD[j]=INPUT_PW_Tab[j];                                //讀取密碼
                At24c02Write(j+2,INPUT_PW_Tab[j]);                          //保存密碼至EEPROM
                delay(100);
}
        Step5=0;
        Step=0;
}


void Read_Password()
{
        unsigned char j;

        Load_first_flag=At24c02Read(0x00);
        if(Load_first_flag==0)                          //初次運行
        {
        
                Load_first_flag=1;
                At24c02Write(0,0x01);
                delay(100);
                At24c02Write(1,0x06);           //寫默認密碼長度6至EEPROM
                delay(100);
                for(j=0;j<PassWord_Length;j++)
                {
                        At24c02Write(j+2,8);              //寫默認密碼888888至EEPROM
                        PASSWORD[j]=INPUT_PW_Tab[j];     //讀密碼
                        delay(100);
                }
        }
        
        Load_first_flag=At24c02Read(0x00);
        PassWord_Length=At24c02Read(0x01);  //讀取密碼長度
        for(j=0;j<PassWord_Length;j++)       //讀取密碼
        {
                PASSWORD[j]=At24c02Read(j+2);
        }
        
}
void input_password(bit m)
{
        unsigned char j;
        if(key_num!=0x0b)                                      //ok鍵沒有按下
                {
                                        if(key_num<0x0a)                               //1-9按下
                                        {
                                                INPUT_PW_Tab[pw_num]=key_num;                //保存至輸入密碼數組
                                                pw_num=pw_num+1;                              //密碼長度+1
                                                
                                                 LcdWriteCom(0xc0);
                                                 for(j=0;j<pw_num;j++)
                                                                {
                                                                                                if(m==0) {LcdWriteData('*');        }                        //密碼隱藏
                                                                                                else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}         //顯示密碼
                                                                }
                                                                                       
                                        }
                                        if(key_num==0x0a)                              //返回鍵按下
                                        {
                                                if(pw_num!=0) {pw_num=pw_num-1;}
                                                else          {Step=0;}
                                                
                                                         
                                                // ShowString (0x00,"Pass Word:");  
                    LcdWriteCom(0xc0);                                                
                                                                                for(j=0;j<pw_num;j++)
                                                                                        {
                                                                                                                if(m==0) {LcdWriteData('*');        }                   //密碼隱藏
                                                                                                                else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}    //顯示密碼        
                                                                                   }
                                                                                        LcdWriteData(' ');
                                        }
                }
        else                          //ok鍵按下
          {
                        if(pw_num==0)         
                                        {
                                                        Step=0;
                                                  LcdWriteCom(0x01);
                                                  ShowString (0x00,"Error 02!");
                                                        delay(10000);
                                        }
               
                        else{               
                                                        Input_suc_flag=1;
                                        }
                                         //AS=0;                        
                }               
}
/*******************************************************
                密碼比對
********************************************************/
void CipherComparison()
{
        u8 i,j=0;

        if(PassWord_Length==pw_num)                       //密碼長度比對
        {
                for(i=0;i<PassWord_Length;i++)                  //密碼比對
                {
                        
                                if(PASSWORD[ i]!=INPUT_PW_Tab[ i])
                                        {
                                                result_flag=0;break;                     //密碼錯誤
                                        }
                                else
                                        {
                                                result_flag=1;                          //密碼正確
                                        }
                                          INPUT_PW_Tab[ i]=0XFF;                   //清除密碼緩存數組
                }
        }
        else
        {result_flag=0;}
        
}

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

使用道具 舉報

沙發
ID:161164 發表于 2022-6-8 00:06 | 只看該作者
  1. /*******************************************************
  2.                 密碼比對
  3. ********************************************************/
  4. void CipherComparison()
  5. {
  6.         u8 i,j=0;

  7.         if(PassWord_Length==pw_num)                       //密碼長度比對
  8.         {
  9.                 for(i=0; i<PassWord_Length; i++)                //密碼比對
  10.                 {
  11.                         printf("PASSWORD=%u, INPUT_PW_Tab=%u\r\n",(u16)PASSWORD[ i],(u16)INPUT_PW_Tab[ i]);//<<<<<<<<<<<設置好串口并在這里打印密碼出來
  12.                         if(PASSWORD[ i]!=INPUT_PW_Tab[ i])
  13.                         {
  14.                                 result_flag=0;
  15.                                 break;                     //密碼錯誤
  16.                         }
  17.                         else
  18.                         {
  19.                                 result_flag=1;                          //密碼正確
  20.                         }
  21.                         INPUT_PW_Tab[ i]=0XFF;                   //清除密碼緩存數組
  22.                 }
  23.         }
  24.         else
  25.         {
  26.                 result_flag=0;
  27.         }

  28. }
復制代碼


回復

使用道具 舉報

板凳
ID:1029667 發表于 2022-6-10 16:57 | 只看該作者

輸入密碼還是顯示密碼錯誤啊!
回復

使用道具 舉報

地板
ID:161164 發表于 2022-6-10 17:28 | 只看該作者
行歌 發表于 2022-6-10 16:57
輸入密碼還是顯示密碼錯誤啊!

串口打印出來的密碼是一樣的嗎?
回復

使用道具 舉報

5#
ID:1029667 發表于 2022-6-10 20:40 | 只看該作者
lkc8210 發表于 2022-6-10 17:28
串口打印出來的密碼是一樣的嗎?

串口沒有打印出來東西,我剛學一個月,還是不太懂。就是我鍵盤輸入密碼后,一直顯示密碼錯誤,我初始密碼是888888,但是輸進去不行,感覺是沒有儲存在存儲器里吧!
回復

使用道具 舉報

6#
ID:161164 發表于 2022-6-10 21:16 | 只看該作者
行歌 發表于 2022-6-10 20:40
串口沒有打印出來東西,我剛學一個月,還是不太懂。就是我鍵盤輸入密碼后,一直顯示密碼錯誤,我初始密碼 ...

那就學一下如何用串口打印資料吧
要不就把整個Keil Project打包上傳
現在你貼的代碼還缺一些頭文檔
想跑一下都不行
回復

使用道具 舉報

7#
ID:1029667 發表于 2022-6-11 00:04 | 只看該作者
lkc8210 發表于 2022-6-10 21:16
那就學一下如何用串口打印資料吧
要不就把整個Keil Project打包上傳
現在你貼的代碼還缺一些頭文檔

這個就是項目

Project9.zip

73.08 KB, 下載次數: 5

回復

使用道具 舉報

8#
ID:1035510 發表于 2022-6-18 08:53 | 只看該作者
這個問題解決了嗎,我也是一模一樣的代碼,一模一樣的問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品视频一区二区三区 | 毛片国产 | 91精品国产91久久久久久最新 | 欧美一区二区在线观看视频 | 亚洲国产精品久久人人爱 | 亚洲综合伊人 | 精品九九| 天天爽网站 | 久久国内 | 国产激情视频在线 | 欧美精品国产精品 | 免费观看黄色一级片 | 日韩欧美三区 | 国产精品一区在线观看 | 一级免费毛片 | 韩国av一区二区 | 九色视频网站 | 97国产爽爽爽久久久 | 日韩在线免费视频 | 国产精品久久久久一区二区三区 | 色网在线观看 | 国产欧美一区二区在线观看 | 国产亚洲一区精品 | 韩国av网站在线观看 | 色桃网| 天天草视频 | 在线观看www| 九九九视频在线观看 | 国产精品区一区二区三 | 久久国产精品亚洲 | 久久久亚洲综合 | 四虎永久免费黄色影片 | 五月激情久久 | 九九精品网 | 国产精品国产精品国产专区不片 | 操操日 | 欧美日韩国产一区二区三区 | 国产精品欧美一区二区三区 | 久久无毛| 日本久久精品 | 一级欧美一级日韩片免费观看 |