51单片机的电子密码锁程序,用KEILC写的

2021-11-04 体育 151阅读

以前帮别人做过一个类似的

#include

#include 

#include"lcd.c"

ucharkey;

ucharnum;

sbitalarm=P2^4;

sbitopen=P2^1;

ucharcodetable[]={'','1','2','3',

'4','5','6','7',

'8','9','0'};

voidkeyscan();

ucharhptable[10];

ucharpassword[6];

ucharwordbuf[6];

ucharfom[]="inputpassword:";

ucharchange[]="setmask:";

ucharstate1[]="right";

ucharstate2[]="error";

ucharsflag;

uchardflag,cnt;

ucharsetf,fset;

ucharflag;

voidmain()

{

ucharhp;

alarm=0;

flag=0;

setf=0;

fset=0;

dflag=0;

lcden=0;

lcdrw=1;

lcdrs=1;

P3=0x0f;

for(hp=0;hp<6;hp++)

{

password[hp]='8';

}

write(0x38,0); //0为写命令

delay(9);

write(0x08,0);

write(0x01,0);

write(0x06,0);

write(0x0c,0);

write(0x80,0);

for(hp=0;hp<15;hp++)

{

write(fom[hp],1);

}



while(1)

{

// alarm=!alarm;

keyscan();

if(setf==0)

{

if(num>=1&&num<=10)

{

write(0x80+0x40+cnt,0);

write('*',1);

wordbuf[cnt]=table[num];

cnt++;

num=0;


}

}

else

{

write(0x01,0);

write(0x80,0);

for(hp=0;hp<9;hp++)

{

write(change[hp],1);

}

fset=1;

cnt=0;

while(fset)

{

keyscan();

if(num>=1&&num<=10)

{

write(0x80+0x40+cnt,0);

write('*',1);

password[cnt]=table[num];

cnt++;

num=0;


}

if(num==11)

{

write(0x80+0x40+cnt-1,0);

write('\0',1);

cnt--;

num=0;

}

if(num==13)

{



flag=1;

num=0;

fset=0;

setf=0;

// gotochuz;

}


}

cnt=0;

}

if(flag==1)

{

write(0x01,0);

write(0x80,0);

for(hp=0;hp<15;hp++)

{

write(fom[hp],1);

}

flag=0;

}

if(num==11)

{

write(0x80+0x40+cnt-1,0);

write('\0',1);

cnt--;

num=0;

}

if(num==12)

{

if(dflag==1)

setf=1;

num=0;

}

if(num==13)

{

num=0;

write(0x80+0x40+10,0);

if(wordbuf[0]==password[0]&&wordbuf[1]==password[1]&&wordbuf[2]==password[2]&&wordbuf[3]==password[3]&&wordbuf[4]==password[4]&&wordbuf[5]==password[5])

{


for(hp=0;hp<5;hp++)

{

write(state1[hp],1);

}

sflag=0;

dflag=1;

}

else

{

for(hp=0;hp<5;hp++)

{

write(state2[hp],1);

}

sflag++;


}

}

if(sflag==3)

{

alarm=!alarm;

//delay(9);

}

if(num==14)

{

num=0;

cnt=0;

write(0x01,0);

write(0x80,0);

for(hp=0;hp<15;hp++)

{

write(fom[hp],1);

}

}

if(num==15)

{

if(dflag==1)

{

open=0;

dflag=0;

}

}

}

}


voidkeyscan()


{

uchartem,temp;

P3=0xfe;

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0) //没有键按下时它的值是不变的,即仍为0XF0,而有键接下时要变

{

delay(5); //延时消抖

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0) //确认有键按下

{

temp=P3;

tem=temp&0xf0; //这里也可以不要这一步,但下面的case里的值也要变

switch(tem)

{

case0xe0:num=0;break;

case0xd0:num=1;break;

case0xb0:num=2;break;

case0x70:num=3;break;

default: ;break;



}

while(tem!=0xf0) //等待松手

{

temp=P3;

tem=temp&0xf0;


}

}


}

P3=0xfd;

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

delay(5);

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;

switch(tem)

{

case0xe0:num=4;break;

case0xd0:num=5;break;

case0xb0:num=6;break;

case0x70:num=7;break;

default: ;break;



}

while(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;


}

}


}

P3=0xfb;

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

delay(5);

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;

switch(tem)

{

case0xe0:num=8;break;

case0xd0:num=9;break;

case0xb0:num=10;break;

case0x70:num=11;break;

default: ;break;



}

while(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;


}

}


}

P3=0xf7;

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

delay(5);

temp=P3;

tem=temp&0xf0;

if(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;

switch(tem)

{

case0xe0:num=12;break;

case0xd0:num=13;break;

case0xb0:num=14;break;

case0x70:num=15;break;

default: ;break;



}

while(tem!=0xf0)

{

temp=P3;

tem=temp&0xf0;


}

}


}

}

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com