电子密码锁:全局变量如何改为局部变量?或者其他方法?

2019-07-18 11:55发布

背景:基于protues的电子密码锁设计
问题:程序有bug
描述:当你设置一个新密码(例:123456),如果你输错一次密码,则正确密码自动修改为初始密码
求助:该如何纠正?
ps:这个礼拜5要上交课程设计,下面这段程序很长,在看的时候可能会占用你一点时间,如果你能帮到我,真的很感谢。不需要其他的程序,我只想把下面这段程序的错误修改正确。谢谢。

/*
六位密码,原始密码为680424,该程序有点问题,也有不完善的地方,就是修改密码后,如果输入的密码与修改的密码
相同,则锁会开,如果有一次输入有错,则密码会变回原来的密码,即362330.可能因为定义的数组
pws[6]为全局变量,但是也不肯定.希望下载的人提出宝贵的意见,大家共同交流,谢谢.
*/
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uint num=10;        //开始让数码管什么都显示
bit set=0;                //定义设置密码的位
char count=-1;        //开始让COUNT=-1,方便后面显示数码管
sbit Beep=P1^2; //蜂鸣器
uchar temp;
uchar pws[6]={6,8,0,4,2,4};        //原始密码
uchar pwx[6];                        //按下的数字存储区
bit rightflag;                        //密码正确标志位
uchar workbuf[6];
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
};                        //段选码,共阴极
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};                        //位选码
uint keyscan();
void delay(uchar z)                //延时,ms级       
{
        uchar y;
        for(;z>0;z--)
                for(y=120;y>0;y--);
}
void setpw()                //设置密码函数
{
        keyscan();
}
uint keyscan()                //键盘扫描函数
{
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(5);        //键盘去抖,最好20ms以上,这里用了5ms
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        count++;//按键计数加1
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:
                                {       
                                        num=7;
                                        if(count<6)        //六位密码,所以COUNT<6
                                        {       
                                                if(set==0)        //设置密码键没有按下时
                                                pwx[count]=num; //存储按下的数字
                                                else
                                                pws[count]=num; //设置密码键按下时,设置新密码
                                                workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的
                                        }
                                }
                                break;
                                case 0xde:
                                {       
                                        num=8;
                                        if(count<6)                //以下扫描键盘的原理差不多同上
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xbe:
                                {       
                                        num=9;
                                        {
                                                if(count<6)
                                                {
                                                        if(set==0)
                                                        pwx[count]=num;
                                                        else
                                                        pws[count]=num;
                                                        workbuf[count]=tabledu[11];
                                                }
                                        }
                                }
                                break;
                                case 0x7e:        //设置密码键按下
                                {
                                        set=1;        //设置密码标志位置1
                                        P1_3=0;        //设置密码指示灯亮
                                        workbuf[0]=0x00;//数码管第一位不显示
                                        workbuf[1]=0x00;//......
                                        workbuf[2]=0x00;//......
                                        workbuf[3]=0x00;
                                        workbuf[4]=0x00;
                                        workbuf[5]=0x00;//......
                                        count=-1;        //按键计数复位为-1
                                        if(count<6)        //密码没有设置完,继续设置密码
                                        {
                                                setpw();        //设置密码
                                        }
                                }               
                                break;
                        }
                        while(temp!=0xf0)  //按键抬起检测
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }       
                }
        }
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        count++;
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:
                                {       
                                        num=4;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xdd:
                                {       
                                        num=5;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xbd:
                                {
                                        num=6;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }
        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        count++;
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:
                                {
                                        num=1;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xdb:
                                {       
                                        num=2;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xbb:
                                {
                                        num=3;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }
        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        count++;
                        temp=P3;
                        switch(temp)
                        {
                                case 0xd7:
                                {       
                                        num=0;
                                        if(count<6)
                                        {
                                                if(set==0)
                                                pwx[count]=num;
                                                else
                                                pws[count]=num;
                                                workbuf[count]=tabledu[11];
                                        }
                                }
                                break;
                                case 0xe7: num=20;break;        //确定键按下检测
                                case 0x77:                 //复位键或者输入密码全部一次删除
                                {       
                                        P1_1=0;                //锁关
                                        P1_3=1;                //密码设置指示灯灭
                                        set=0;                //不设置密码
                                        num=10;                //num复位
                                        count=-1;        //COUNT复位
                                        workbuf[0]=tabledu[10];                //第一位数码管不显示
                                        workbuf[1]=tabledu[10];                //第二位数码管不显示
                                        workbuf[2]=tabledu[10];               
                                        workbuf[3]=tabledu[10];
                                        workbuf[4]=tabledu[10];
                                        workbuf[5]=tabledu[10];                //......
                                        P1_0=1;                                                //锁关
                                }
                                break;
                                case 0xb7:        //输入密码删除键(一位一位删除)
                                {
                                        count--;       
                                        workbuf[count]=0x00;        //因确定键按下时,COUNT也会加1,而确定键不是密码,所以这里是COUNT,而不是COUNT+1
                                        count--;        //因确定键按下时,确定键不是密码,COUNT也会加1,这里COUNT再自减1
                                        if(count<=-1)
                                        count=-1;
                                }
                                break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
        }
        return(num);
}
void init()                //利用定时显示数码管
{
        TMOD=0x01;
        TH0=(65536-500)/200;
        TL0=(65536-500)%200;
        ET0=1;
        EA=1;
        TR0=1;
}
bit compare()        //密码比较函数
{
        if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5]))
        rightflag=1;
        else
        rightflag=0;
        return(rightflag);
}
void main()
{
        uint i,j;
        init();
        P0=0;
        P1_1=0;        //锁关
        while(1)
        {
                keyscan();
                if(num==20)        //如果确定键按下(修改密码和输入密码共用的确定键)
                {
                        if(count==6)
                        {
                                if(set==1)        //修改密码确定
                                {       
                                        P1_3=1;
                                        workbuf[0]=0;       
                                        workbuf[1]=0;
                                        workbuf[2]=0;
                                        workbuf[3]=0;
                                        workbuf[4]=0;
                                        workbuf[5]=0;
                                }
                                else        //输入密码确定
                                {
                                        set=0;
                                        compare();
                                        if(rightflag==1)        //如果密码正确
                                        {
                                                P1_0=0;        //锁开
                                                P1_1=1;
                                                workbuf[0]=tabledu[8];        //数码管第一位显示"8"
                                                workbuf[1]=tabledu[8];        //数码管第二位显示"8"
                                                workbuf[2]=tabledu[8];       
                                                workbuf[3]=tabledu[8];
                                                workbuf[4]=tabledu[8];
                                                workbuf[5]=tabledu[8];        //......
                                        }
                                        else
                                        {
                                                P1_1=0;        //锁仍然是关
                                                workbuf[0]=0X71;        //数码管第一位显示"F"
                                                workbuf[1]=0X71;
                                                workbuf[2]=0X71;
                                                workbuf[3]=0X71;
                                                workbuf[4]=0X71;
                                                workbuf[5]=0X71;        //......
                                                for(i=0;i<1000;i++)        //密码错误报警
                                                {
                                                        for(j=0;j<80;j++);
                                                        Beep=~Beep;
                                                }
                                                break;
                                        }
                                }
                        }
                        else                 //若输入的密码位数不为6位时
                        {
                                P1_1=0;                //锁仍然关
                                workbuf[0]=0X71;        //数码管第一位显示"F"
                                workbuf[1]=0X71;
                                workbuf[2]=0X71;
                                workbuf[3]=0X71;
                                workbuf[4]=0X71;
                                workbuf[5]=0X71;       
                                for(i=0;i<1000;i++)       
                                {
                                        for(j=0;j<80;j++);
                                        Beep=~Beep;
                                }
                                break;
                        }
                }       
        }
}
void timer0() interrupt 1        //显示数码管
{
        uchar i;
        TH0=(65536-500)/200;
        TL0=(65536-500)%200;
        for(i=0;i<6;i++)
        {
                P0=workbuf[i];
                P2=tablewe[i];
                delay(5);
                P0=0;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。