m0_75119017 2022-11-21 00:39 采纳率: 80%
浏览 6

51单片机密码锁密码修改模式

51单片机,芯片STC89C52
密码修改部分,我的思路是这样的:
1.首先输入原密码,若输错就判断为输入错误,直到输入正确才能进入下一个环节;
2.原密码输入正确后进入修改密码环节;
3.第一次输入新密码;
4.第二次输入新密码,若输对就成功修改密码,若输错就只能再次输入直到输入正确。

目前问题出现在第4部分:
1.新密码只能是666666等几位数字都一样的密码,若输入123456等密码就显示错误;
2.密码修改成功后返回到密码输入环节(这部分代码我没发出来,但感觉没问题),重新输入密码,此时无论是输入旧密码还是新密码都会显示错误;
3.若第二次密码输入错误,不能成功进入“再次输入直到输入正确”这一环节。

请问我的代码问题出现在哪里?请各位朋友指正!
下面是部分代码:




#include <REGX52.H>
#include <intrins.H>
#include "LCD1602.h"
#include "juzhen.h"
#include "delay.h"
#include "Buzzer.h"
#include "Timer0.h"


unsigned char KeyNum,i=0,ErrorNum;
unsigned char Password,cout;
char pw[6];
static char realpw[6]={0,0,0,0,0,0}; 
void judge(unsigned char press_flag,unsigned int count);
unsigned char press_flag;
unsigned int count;
void PasswordChange();


//密码修改模块
void PasswordChange()
{
        char i=0,A=6,KeyNum2;
        cout=0;//计算当前输入的密码位数
        while(1)
        {    
            KeyNum2=juzhen(); //juzhen矩阵键盘
            if(KeyNum2) 
            {
                if(KeyNum2<=10)    
                {
                if(KeyNum2==10){KeyNum2=0;}
                    if(cout<6)
                    {
                        pw[i]=KeyNum2;                                           
                        LCD_wfh10(2,cout+1,pw[i],1);  
                        i++; 
                        cout++;
                        Buzzer_Time(100);
                    }    
                }  
            }
            if(KeyNum2==11)      
            { 
                Buzzer_Time(100);    
                for(i=0;i<6;i++)
                { 
                    if(pw[i]!=realpw[i]){A=0;break;}
                    else {A=1;}        
                }
                if(cout<6){A=0;}
            }
                if(A==0)//原密码输入错误
                {
                        Buzzer_Time2(100);
                        LCD_zfc(1,14,"ERR");
                        delay(500);
                        LCD_zfc(1,14,"   ");
                        cout=0;
                        i=0;
                        LCD_zfc(2,1,"      ");
                        pw[6]=0;
                        A=6;
                }
                if(A==1)//正式修改密码前的初始化
                {
                        LCD_zfc(1,14,"OK ");
                        delay(500);
                        LCD_zfc(1,14,"   ");
                        LCD_zfc(1,1,"input new:     ");
                        cout=0;
                        i=0;
                        LCD_zfc(2,1,"      ");
                        pw[6]=0;realpw[6]=0;
                        A=2;
                }
                if(A==2)//修改密码值
                {
                        i=0;
                        KeyNum2=juzhen();
                        if(KeyNum2) 
                        {
                            if(KeyNum2<=10)    
                            {
                            if(KeyNum2==10){KeyNum2=0;}
                                if(cout<6)
                                {
                                    realpw[i]=KeyNum2;                                           
                                    LCD_wfh10(2,cout+1,realpw[i],1);  
                                    i++; 
                                    cout++;
                                    Buzzer_Time(100);
                                }
                            }  
                        }
                        if(cout==6)
                        {
                            LCD_zfc(1,1,"input again:");
                            LCD_zfc(2,1,"      ");
                            Buzzer_Time(100);
                            cout=0;
                            A=3;
                        }
                }
                if(A==3)
                {
                    KeyNum2=juzhen();
                    if(KeyNum2) 
                    {
                        if(KeyNum2<=10)    
                        {
                            if(KeyNum2==10){KeyNum2=0;}
                            if(cout<6)
                            {
                                pw[i]=KeyNum2;                                           
                                LCD_wfh10(2,cout+1,pw[i],1);  
                                i++; 
                                cout++;
                                Buzzer_Time(100);
                            }
                        }
                    }
                    if(cout==6)
                    {
                        for(i=0;i<6;i++)
                        { 
                            if(pw[i]!=realpw[i]){A=4;break;}
                            else{Buzzer_Time(100);LCD_zfc(1,1,"Have changed!");delay(1000);LCD_zfc(1,1,"             ");A=6;main();}
                        }                        
                    }
                }//A==3
                if(A==4)
                {
                    while(A==4)
                    {
                        Buzzer_Time2(100);
                        A=6;
                        LCD_zfc(1,1,"                ");
                        LCD_zfc(1,1,"ERROR!          ");
                        LCD_zfc(2,1,"      ");
                        delay(50);
                        pw[6]=0;
                        i=0;
                        cout=0;
                        KeyNum2=juzhen();
                        if(KeyNum2) 
                        {
                            if(KeyNum2<=10)    
                            {
                                if(KeyNum2==10){KeyNum2=0;}
                                if(cout<6)
                                {
                                    pw[i]=KeyNum2;                                           
                                    LCD_wfh10(2,cout+1,pw[i],1);  
                                    i++; 
                                    cout++;
                                    Buzzer_Time(100);
                                }
                            }
                        }
                        if(cout==6)
                        {
                            for(i=0;i<6;i++)
                            { 
                                if(pw[i]!=realpw[i]){A=4;break;}
                                else {LCD_zfc(1,1,"Have changed!");delay(1000);LCD_zfc(1,1,"             ");A=6;}        
                            }                    
                        }
                    }
                }//A=4
                if(KeyNum2==12)//密码修改模块的取消键,不能删
            {
                    Buzzer_Time(100);
                    LCD_zfc(2,cout," ");
                    cout--;
                    i--;
                    pw[cout]=0;        
            }        
        }//while
}

  • 写回答

1条回答 默认 最新

  • fengyuzhe13 嵌入式领域优质创作者 2022-11-21 10:32
    关注

    1.新密码只能是666666等几位数字都一样的密码,若输入123456等密码就显示错误;
    可能是键盘输入没有去抖延时,导致一次性输入6位数字。
    2.密码修改成功后返回到密码输入环节(这部分代码我没发出来,但感觉没问题),重新输入密码,此时无论是输入旧密码还是新密码都会显示错误;
    建议分步调试:在重新输入密码时,先把密码在LCD上重新显示。同时看看输入密码是否一样。如果都没有问题,则是代码判断密码时出现错误。
    3.若第二次密码输入错误,不能成功进入“再次输入直到输入正确”这一环节。
    while(密码不正确)
    {
    重新输入密码:
    }

    评论

报告相同问题?

问题事件

  • 修改了问题 11月21日
  • 创建了问题 11月21日

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,