m0_75119017 2022-11-17 21:21 采纳率: 80%
浏览 22
已结题

51单片机,ATC89C52,密码锁锁死问题

我在我的代码中加入了ErrorNumber变量,用来计数密码输入错误的次数,当次数达到3密码锁就会暂时锁死(用延时函数实现锁死功能)。感觉自己的代码没问题,但是貌似没有实现我上面所说的这个功能。
后来对ErrorNumber做了跟踪,发现它只能自增到1,然后就一直保持值为1了。怎样改才能让它实现我想要的功能?
希望有懂的人来帮我解决这个问题。谢谢!
附上代码:


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


unsigned char KeyNum;
unsigned int Password,cout,ErrorNumber;
int pw[6];
int realpw[6]={0,0,0,0,0,0};    

void Delay5000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 36;
    j = 5;
    k = 211;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void main()
{
    int a=0,i=0,b=1,j=0,A=0,B=0;
    LCD_csh();
    LCD_zfc(1,1,"Password:");     
    while(1)
    {    
        KeyNum=juzhen(); 
            if(KeyNum) 
            {
                if(KeyNum<=10)    
                {
                if(KeyNum==10){KeyNum=0;}
                    if(cout<6)
                    {
                        pw[i]=KeyNum;                                           
                        LCD_wfh10(2,cout+1,pw[i],1);  
                        i++;
                        b++;  
                        cout++;
                        Buzzer_Time(100);
                    }    
                }  
            }    
            if(KeyNum==11)      
            { 
                Buzzer_Time(100);
                
                for(i=0;i<6;i++)
                { 
                    if(pw[i]!=realpw[i]){A=2;break;}
                    else {A=1;}        
                }
                if(cout<6){A=2;}
                if(A==1) 
                {                                
                    for(B=0;B<3;B++)
                    {
                        LCD_zfc(1,14,"OK ");
                        i=30000;
                        while(i--);
                        LCD_zfc(1,14,"   ");
                    }                                
                    cout=0;
                    i=0;
                    b=0;
                    A=0;
                    for(i=0;i<6;i++) LCD_zfc(2,1,"      ");
                    pw[6]=0;
                    main();
                }
                if(A==2)        
                {
                    for(B=0;B<3;B++)
                    {
                        LCD_zfc(1,14,"ERR");
                        i=30000;
                        while(i--);
                        LCD_zfc(1,14,"   ");
                    }
                    cout=0;
                    i=0;
                    b=0;
                    A=0;
                    for(i=0;i<9;i++)LCD_zfc(2,1,"      ");
                    pw[6]=0;
                    ErrorNumber++;
                    if(ErrorNumber==3)
                    {
                        LCD_zfc(2,1,"WRONG!WAIT 5S!");
                        Delay5000ms();
                        LCD_zfc(2,1,"              ");
                        ErrorNumber=0;
                    }
                    main();
                }
            }
            if(KeyNum==12)    
            {
                    Buzzer_Time(100);
                    LCD_zfc(2,cout," ");
                    cout--;
                    i--;
                    pw[cout]=0;        
            }
    }
}


  • 写回答

2条回答 默认 最新

  • 伍六七0804 2022-11-17 21:41
    关注

    你改成>=3的判断条件试试 ,或者你代码加个打印或者断点调一下看下这个变量的值,你没初始化他,全局变量按理来说是0 但你最好跟踪下这个变量吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 修改了问题 11月17日
  • 修改了问题 11月17日
  • 展开全部

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因