电子密码锁程序.docx
《电子密码锁程序.docx》由会员分享,可在线阅读,更多相关《电子密码锁程序.docx(19页珍藏版)》请在冰豆网上搜索。
电子密码锁程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P3^0;/*解密成功指示*/
sbitsound=P3^7;/*三次错误后报警*/
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitx0=P1^0;
sbitx1=P1^1;
sbitx2=P1^2;
sbitx3=P1^3;
sbitx4=P1^4;
sbitx5=P1^5;
sbitx6=P1^6;
sbitx7=P1^7;
sbitBUSY=P0^7;/*判忙位*/
ucharm,n,lg,t;
ucharcodedis0[]={"pleaseinput..."};/*开机显示*/
uchardis2[]={0x00,0x00,0x00,0x00,0x00,0x00};/*存放6位密码*/
ucharcodedis3[]={"error"};/*显示错误*/
ucharcodedis4[]={"UnlockOk"};/*显示开锁*/
voiddelay(uintms)/*延时*/
{
uinti;
while(ms--)
for(i=250;i>0;i--);
}
voidwait(void)/*查忙程序*/
{
P0=0xFF;
do
{
RS=0;
RW=1;
EN=0;
EN=1;
}while(BUSY==1);
EN=0;
}
voidw_dat(uintdat)/*写数据*/
{
wait();
EN=0;
P0=dat;
RS=1;
RW=0;
EN=1;
EN=0;
}
voidw_cmd(uintcmd)/*写命令*/
{
wait();
EN=0;
P0=cmd;
RS=0;
RW=0;
EN=1;
EN=0;
}
voidInit_LCD1602(void)/*初始化1602*/
{
w_cmd(0x38);/*16*2显示,5*7点阵,8位数据接口*/
w_cmd(0x0c);/*显示器开、光标开、光标允许闪烁*/
w_cmd(0x06);/*文字不动,光标自动右移*/
w_cmd(0x01);/*清屏*/
}
voidkey()/*键盘查询值按下了另标志lg=1*/
{
x0=0;x1=1;x2=1,x3=1;
if(!
x4)
{
delay(4);
if(!
x4)
{
lg=1;
m=0;
while(!
x4);
}
}
if(!
x5)
{
delay(4);
if(!
x5)
{
lg=1;
m=1;
while(!
x5);
}
}
if(!
x6)
{
delay(4);
if(!
x6)
{
m=2;
lg=1;
while(!
x6);
}
}
if(!
x7)
{
delay(4);
if(!
x7)
{
m=3;
lg=1;
while(!
x7);
}
}
x0=1;x1=0;x2=1;;x3=1;
if(!
x4)
{
delay(4);
if(!
x4)
{
m=4;
lg=1;
while(!
x4);
}
}
if(!
x5)
{
delay(4);
if(!
x5)
{
m=5;
lg=1;
while(!
x5);
}
}
if(!
x6)
{
delay(4);
if(!
x6)
{
m=6;
lg=1;
while(!
x6);
}
}
if(!
x7)
{
delay(4);
if(!
x7)
{
m=7;
lg=1;
while(!
x7);
}
}
x0=1;x1=1;x2=0;x3=1;
if(!
x4)
{
delay(4);
if(!
x4)
{
m=8;
lg=1;
while(!
x4);
}
}
if(!
x5)
{
delay(4);
if(!
x5)
{
m=9;
lg=1;
while(!
x5);
}
}
if(!
x6)
{
delay(4);
if(!
x6)
{
m=10;
lg=1;
while(!
x6);
}
}
if(!
x7)
{
delay(4);
if(!
x7)
{
m=11;
lg=1;
while(!
x7);
}
}
x0=1;x1=1;x2=1;x3=0;
if(!
x4)
{
delay(4);
if(!
x4)
{
m=12;
lg=1;
while(!
x4);
}
}
}
voidCompare()/*密码确认函数*/
{
uchari;
uintk1,k2,k3=1;
if((dis2[0]==(1+0x30))&&(dis2[1]==(2+0x30))&&(dis2[2]==(3+0x30))&&(dis2[3]==(4+0x30))&&(dis2[4]==(5+0x30))&&(dis2[5]==(6+0x30)))
{
led=0;
w_cmd(0xc6);
for(i=0;i<9;i++)
{
w_dat(dis4[i]);
}
w_cmd(0xc0);
w_dat(0x20);
w_cmd(0xc1);
w_dat(0x20);
w_cmd(0xc2);
w_dat(0x20);
w_cmd(0xc3);
w_dat(0x20);
w_cmd(0xc4);
w_dat(0x20);
w_cmd(0xc5);
w_dat(0x20);
}
else
{
t=t+1;/*累积错误次数*/
m=0;n=0;/*可以重新输入密码*/
w_cmd(0xc0);
w_dat(0x20);
w_cmd(0xc1);
w_dat(0x20);
w_cmd(0xc2);
w_dat(0x20);
w_cmd(0xc3);
w_dat(0x20);
w_cmd(0xc4);
w_dat(0x20);
w_cmd(0xc5);
w_dat(0x20);
w_cmd(0xc6);
for(i=0;i<5;i++)
{
w_dat(dis3[i]);
}
if(t>3)/*三次以上错误报警锁*/
{
t=0;
while(k3)
{
for(k1=0;k1<2000;k1++)
{
for(k2=0;k2<90;k2++);
sound=~sound;
}
for(k1=0;k1<2500;k1++)
{
for(k2=0;k2<120;k2++);
sound=~sound;
}
}
}
}
}
voidBackspace()/*逐个删除*/
{
n=n-1;
if(n<0)
n=0;
dis2[n]=0x00;
w_cmd(n+0xc0);
w_dat(0x20);
}
voidDelete()/*全部删除并锁门*/
{
n=0;
led=1;
w_cmd(0xc0);
w_dat(0x20);
w_cmd(0xc1);
w_dat(0x20);
w_cmd(0xc2);
w_dat(0x20);
w_cmd(0xc3);
w_dat(0x20);
w_cmd(0xc4);
w_dat(0x20);
w_cmd(0xc5);
w_dat(0x20);
w_cmd(0xc6);
w_dat(0x20);
w_cmd(0xc7);
w_dat(0x20);
w_cmd(0xc8);
w_dat(0x20);
w_cmd(0xc9);
w_dat(0x20);
w_cmd(0xca);
w_dat(0x20);
w_cmd(0xcb);
w_dat(0x20);
w_cmd(0xcc);
w_dat(0x20);
w_cmd(0xcd);
w_dat(0x20);
w_cmd(0xce);
w_dat(0x20);
w_cmd(0xcf);
w_dat(0x20);
dis2[0]=0x00;
dis2[1]=0x00;
dis2[2]=0x00;
dis2[3]=0x00;
dis2[4]=0x00;
dis2[5]=0x00;
}
voidinput_password()/*输密码程序*/
{
if(n==0)
{
key();
if(lg==1&&m<10)
{
w_cmd(0xc6);/*使重新输入时候清除error*/
w_dat(0x20);
w_dat(0x20);
w_cmd(0xc7);
w_dat(0x20);
w_cmd(0xc8);
w_dat(0x20);
w_cmd(0xc9);
w_dat(0x20);
w_cmd(0xca);
w_dat(0x20);
w_cmd(0xcb);
w_dat(0x20);
w_cmd(0xcc);
w_dat(0x20);
w_cmd(0xcd);
w_dat(0x20);
w_cmd(0xce);
w_dat(0x20);
w_cmd(0xcf);
w_dat(0x20);
dis2[0]=(m+0x30);
w_cmd(0xc0);
w_dat(dis2[0]);
n=1;
lg=0;
}
else
{
w_cmd(0xc0);
w_dat(0x20);
}
}
if(n==1)
{
key();
if(lg==1&&m<10)
{
dis2[1]=(m+0x30);
w_cmd(0xc1);
w_dat(dis2[1]);
n=2;
lg=0;
}
}
if(n==2)
{
key();
if(lg==1&&m<10)
{
dis2[2]=(m+0x30);
w_cmd(0xc2);
w_dat(dis2[2]);
n=3;
lg=0;
}
}
if(n==3)
{
key();
if(lg==1&&m<10)
{
dis2[3]=(m+0x30);
w_cmd(0xc3);
w_dat(dis2[3]);
n=4;
lg=0;
}
}
if(n==4)
{
key();
if(lg==1&&m<10)
{
dis2[4]=(m+0x30);
w_cmd(0xc4);
w_dat(dis2[4]);
n=5;
lg=0;
}
}
if(n==5)
{
key();
if(lg==1&&m<10)
{
dis2[5]=(m+0x30);
w_cmd(0xc5);
w_dat(dis2[5]);
n=6;
lg=0;
}
}
key();
delay(4);
if(lg==1&&m==10)
{
Compare();
lg=0;/*这里没有,那么Comare()就不断的执行,使t>3*/
}/*蜂鸣器就不断的名叫*/
if(lg==1&&m==11)
{
Backspace();
lg=0;/*没有会将所有密码全清除*/
}
if(lg==1&&m==12)
{
Delete();
lg=0;
}
}
voidmain()/*主程序*/
{
uchari;
Init_LCD1602();
w_cmd(0x80+0x00);
for(i=0;i<16;i++)
{
w_dat(dis0[i]);/*写入1602第一行*/
}
while
(1)
{
input_password();/*反复查询*/
}
}