找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1805|回复: 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;}
        
}

回复

使用道具 举报

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
输入密码还是显示密码错误啊!

串口打印出来的密码是一样的吗?
回复

使用道具 举报

ID:1029667 发表于 2022-6-10 20:40 | 显示全部楼层
lkc8210 发表于 2022-6-10 17:28
串口打印出来的密码是一样的吗?

串口没有打印出来东西,我刚学一个月,还是不太懂。就是我键盘输入密码后,一直显示密码错误,我初始密码是888888,但是输进去不行,感觉是没有储存在存储器里吧!
回复

使用道具 举报

ID:161164 发表于 2022-6-10 21:16 | 显示全部楼层
行歌 发表于 2022-6-10 20:40
串口没有打印出来东西,我刚学一个月,还是不太懂。就是我键盘输入密码后,一直显示密码错误,我初始密码 ...

那就学一下如何用串口打印资料吧
要不就把整个Keil Project打包上传
现在你贴的代码还缺一些头文档
想跑一下都不行
回复

使用道具 举报

ID:1029667 发表于 2022-6-11 00:04 | 显示全部楼层
lkc8210 发表于 2022-6-10 21:16
那就学一下如何用串口打印资料吧
要不就把整个Keil Project打包上传
现在你贴的代码还缺一些头文档

这个就是项目

Project9.zip

73.08 KB, 下载次数: 5

回复

使用道具 举报

ID:1035510 发表于 2022-6-18 08:53 | 显示全部楼层
这个问题解决了吗,我也是一模一样的代码,一模一样的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表