完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
回复本帖可获得 1 分积分奖励! 每人限 2 次(中奖概率 90%) |
背景:基于protues的电子密码锁设计
问题:程序有bug 描述:当你设置一个新密码(例:123456),如果你输错一次密码,则正确密码自动修改为初始密码 求助:该如何纠正? ps:这个礼拜5要上交课程设计,下面这段程序很长,在看的时候可能会占用你一点时间,如果你能帮到我,真的很感谢。不需要其他的程序,我只想把下面这段程序的错误修改正确。谢谢。 /* 六位密码,原始密码为680424,该程序有点问题,也有不完善的地方,就是修改密码后,如果输入的密码与修改的密码 相同,则锁会开,如果有一次输入有错,则密码会变回原来的密码,即362330.可能因为定义的数组 pws[6]为全局变量,但是也不肯定.希望下载的人提出宝贵的意见,大家共同交流,谢谢. */ #include #define uchar unsigned char #define uint unsigned int uint num=10; //开始让数码管什么都显示 bit set=0; //定义设置密码的位 char count=-1; //开始让COUNT=-1,方便后面显示数码管 ***it 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; } } |
|
相关推荐
9个回答
|
|
沙发。帖子不能沉。
|
|
|
|
来个冒泡都行啊。。。
|
|
|
|
回帖奖励 +1 分积分
顶一个
|
|
|
|
回帖奖励 +1 分积分
好东西,分享伟大,感谢楼主分享。
|
|
|
|
回帖奖励 +1 分积分 |
|
|
|
回帖奖励 +1 分积分 |
|
|
|
|
|
回帖奖励 +1 分积分
好东西,分享伟大,感谢楼主分享
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4849 浏览 3 评论
6138 浏览 1 评论
6406 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
8154 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1236 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 00:44 , Processed in 0.866121 second(s), Total 91, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号