case 0xbb:
genggai=1; wei=0; break;
case 0x7b: if(allow) ok=1; break; }
while(temp!=0xf0) {
temp=P3;
temp=temp&0xf0; beep=0; }
beep=1; } }
P3=0xf7; temp=P3;
temp=temp&0xf0; if(temp!=0xf0) {
delay(10); if(temp!=0xf0) {
temp=P3; switch(temp) {
case 0xe7: retry=1; break;
case 0xd7: close=1; break; }
while(temp!=0xf0) {
temp=P3;
temp=temp&0xf0; beep=0;
}
beep=1; } } } }
void shumima() //对按键采集来的数据进行分配 {
if(!wanbi) {
switch(wei) {
case 1:new1=key;
if(!allow) a=17; else a=key; break; case 2:new2=key;
if(a==17) b=17; else b=key; break; case 3:new3=key;
if(a==17) c=17; else c=key; break; case 4:new4=key;
if(a==17) d=17; else d=key; break; case 5:new5=key;
if(a==17) e=17; else e=key; break; case 6:new6=key;
if(a==17) f=17; else f=key;
wanbi=1; break; } } }
void yanzheng() //验证密码是否正确 {
if(wanbi) //只有当六位密码均输入完毕后方进行验证 {
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //当输入的密码正确,会得到allowe置一 }
}
void main() {
while(1) {
keyscan(); shumima(); yanzheng();
if(allow) //验证完后,若allow为1,则开锁 {
P1=0x00; if(!genggai) wanbi=0; }
if(genggai) //当S16更改密码键被按下,genggai会被置一 {
if(allow) //若已经把锁打开,才有更改密码的权限 {
while(!wanbi) //当新的六位密码没有设定完,则一直在这里循环 {
keyscan(); shumima();
if(retry|close) //而当探测到重试键S18或者关闭密码锁键S19被按下时,则跳出
{ wanbi=1; break; }
display(a,b,c,d,e,f); } } }
if(ok) //更改密码时,当所有六位新密码均被按下时,可以按下此键,结束密码更改
{ //其他时间按下此键无效 ok=0; wei=0; genggai=0;
old1=new1;old2=new2;old3=new3; //此时,旧的密码将被代替 old4=new4;old5=new5;old6=new6; a=16;b=16;c=16;d=16;e=16;f=16; }
if(retry) //当重试按键S18被按下,retry会被置位 {
retry=0; wei=0;wanbi=0;
}
}
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0; }
if(close) //当关闭密码锁按键被按下,close会被置位 {
close=0;genggai=0;//所有变量均被清零。 wei=0; wanbi=0; allow=0; P1=0xff;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0; }
display(a,b,c,d,e,f); //实时显示