基于STC89C52单片机毕业设计完整版附原理图pcb图源程序仿真图 下载本文

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); //实时显示