|
/********************************************************************************
功能鍵
S6---S115 數(shù)字鍵0-9
S16---更改密碼 S17---更改密碼完畢后確認(rèn)
S18---重試密碼、重新設(shè)定 S19---關(guān)閉密碼鎖
初始密碼:000000 密碼位數(shù):6位
注意:掉電后,所設(shè)密碼會丟失,重新上點時,密碼恢復(fù)為原始的000000
與P1相連的8位發(fā)光LED點亮代表鎖被打開;熄滅代表鎖被鎖上
程序功能:
1、開鎖:
下載程序后,直接按六次S6(即代表數(shù)字0),8位LED亮,鎖被打開,輸入密碼時,
六位數(shù)碼管依次顯示小橫杠。
2、更改密碼:
只有當(dāng)開鎖(LED亮)后,該功能方可使用。
首先按下更改密碼鍵S16,然后設(shè)置相應(yīng)密碼,此時六位數(shù)碼管會顯示設(shè)置密碼對應(yīng)
的數(shù)字。最后設(shè)置完六位后,按下S17確認(rèn)密碼更改,此后新密碼即生效。
3、重試密碼:
當(dāng)輸入密碼時,密碼輸錯后按下鍵S18,可重新輸入六位密碼。
當(dāng)設(shè)置密碼時,設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。
4、關(guān)閉密碼鎖:
按下S19即可將打開的密碼鎖關(guān)閉。
推薦初級演示步驟:輸入原始密碼000000按6次S6密碼正確后LED全部亮表示鎖已打開---按下更
改密碼按鍵S16---按S6到S15設(shè)置密碼---按S17
確認(rèn)密碼更改---按S19關(guān)閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
uchar new1,new2,new3,new4,new5,new6; //每次MCU采集到的密碼輸入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數(shù)碼管顯示的變量
uchar wei,key,temp;
bit allow,genggai,ok,wanbi,retry,close; //各個狀態(tài)位
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
void delay(unsigned char i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[b];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[c];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[d];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=table[e];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[f];
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;
case 0xde:
key=1;
wei++;
break;
case 0xbe:
key=2;
wei++;
break;
case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;
case 0xdd:
key=5;
wei++;
break;
case 0xbd:
key=6;
wei++;
break;
case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;
case 0xdb:
key=9;
wei++;
break;
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() //對按鍵采集來的數(shù)據(jù)進行分配
{
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) //只有當(dāng)六位密碼均輸入完畢后方進行驗證
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //當(dāng)輸入的密碼正確,會得到allowe置一
}
}
void main()
{
while(1)
{
keyscan();
shumima();
yanzheng();
if(allow) //驗證完后,若allow為1,則開鎖
{
P1=0x00;
if(!genggai)
wanbi=0;
}
if(genggai) //當(dāng)S16更改密碼鍵被按下,genggai會被置一
{
if(allow) //若已經(jīng)把鎖打開,才有更改密碼的權(quán)限
{
while(!wanbi) //當(dāng)新的六位密碼沒有設(shè)定完,則一直在這里循環(huán)
{
keyscan();
shumima();
if(retry|close) //而當(dāng)探測到重試鍵S18或者關(guān)閉密碼鎖鍵S19被按下時,則跳出
{ wanbi=1;
break;
}
display(a,b,c,d,e,f);
}
}
}
if(ok) //更改密碼時,當(dāng)所有六位新密碼均被按下時,可以按下此鍵,結(jié)束密碼更改
{ //其他時間按下此鍵無效
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) //當(dāng)重試按鍵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) //當(dāng)關(guān)閉密碼鎖按鍵被按下,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); //實時顯示
}
}
|
|