|
附錄一 程序源代碼
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define GPIO_DIG P0 //數(shù)碼管送數(shù)據(jù)
#define GPIO_KEY P1 //矩形按鍵
sbit LSA=P2^0; //數(shù)碼管位選
sbit LSB=P2^1;
sbit LSC=P2^2;
sbit k1=P2^3; //獨(dú)立按鍵
sbit k2=P2^4;
sbit beep=P3^0; //蜂鳴器
sbit led=P3^1; //LED開(kāi)鎖
char srmm[8]= //輸入密碼
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08};
char ysmm[8]= //原始密碼1111 1111
{0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06};
u8 code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
u16 b,n,x,y,i,mm,ss,m1,m2,s1,s2,z=0,j=1,s=0,m=0,t=0;
u8 Mima; // 存放密碼
u8 KeyValue; // 按鍵值定義
void delay(u16 i) //延時(shí)函數(shù)
{while(i--);}
void shuoding() //鎖定
{
mm=1;ss=30;
m2=mm/10;m1=mm%10;
s2=ss/10;s1=ss%10;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;ss--;
if(ss==0)
{j=1;}
}
m2=mm/10;m1=mm%10;
s2=ss/10;s1=ss%10;
}
void bep() //蜂鳴器函數(shù)
{
for(b=0;b<100;b++)
{
beep=~beep;
delay(50);
}
b=0;
}
void xgmm() //修改密碼顯示函數(shù)
{ for(n=0;n<=7;n++)
{srmm[n]=0x01;}
}
void dsmm() //待輸入密碼顯示函數(shù) _ _ _ _ _ _ _ _
{ for(n=0;n<=7;n++)
{srmm[n]=0x08;}
}
void mmzq() //密碼正確顯示函數(shù) - - - - - - - -
{ for(n=0;n<=7;n++)
{srmm[n]=0x40;}
}
void DigDisplaysr() //輸入顯示函數(shù)
{for(i=0;i<8;i++)
{switch(i)
{
case(0):LSA=0;LSB=0;LSC=0;P0=srmm[0];break;//顯示第0位
case(1):LSA=1;LSB=0;LSC=0;P0=srmm[1];break;//顯示第1位
case(2):LSA=0;LSB=1;LSC=0;P0=srmm[2];break;//顯示第2位
case(3):LSA=1;LSB=1;LSC=0;P0=srmm[3];break;//顯示第3位
case(4):LSA=0;LSB=0;LSC=1;P0=srmm[4];break;//顯示第4位
case(5):LSA=1;LSB=0;LSC=1;P0=srmm[5];break;//顯示第5位
case(6):LSA=0;LSB=1;LSC=1;P0=srmm[6];break;//顯示第6位
case(7):LSA=1;LSB=1;LSC=1;P0=srmm[7];break;//顯示第7位
}delay(100);P0=0x00;
}
}
void daojishi() //鎖定后倒計(jì)時(shí)顯示
{
for(i=0;i<8;i++)
{ switch(i)
{
case(0): LSA=0;LSB=0;LSC=0;P0=0x00;break;
case(1): LSA=1;LSB=0;LSC=0;P0=0x00;break;
case(2): LSA=0;LSB=1;LSC=0;P0=table[m2];break;
case(3): LSA=1;LSB=1;LSC=0;P0=table[m1];break;
case(4): LSA=0;LSB=0;LSC=1;P0=0x40;break;
case(5): LSA=1;LSB=0;LSC=1;P0=table[s2];break;
case(6): LSA=0;LSB=1;LSC=1;P0=table[s1];break;
case(7): LSA=1;LSB=1;LSC=1;P0=0x00;break;
}delay(100);P0=0x00;
}
}
void key() //獨(dú)立按鍵掃描
{
if(k1==0)
{ delay(100);
if(k1==0)
{j=1;dsmm();led=0;}
while(!k1);
}
if(k2==0)
{ delay(2);
if(k2==0)
{j=2;xgmm();led=0;}
while(!k2);
}
}
void KeyDownsr(void) //矩形按鍵掃描
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f) //讀取按鍵是否按下
{ delay(1000); //延時(shí)10ms進(jìn)行消抖
if(GPIO_KEY!=0x0f) //再次檢測(cè)鍵盤(pán)是否按下
{ GPIO_KEY=0X0F; //測(cè)試列
switch(GPIO_KEY)
{ case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0XF0; //測(cè)試行
switch(GPIO_KEY)
{ case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測(cè)按鍵松手檢測(cè)
{delay(1000);a++;}
switch(KeyValue) //給相應(yīng)的按鍵賦值
{ case(0):Mima=0x06; break;
case(1):Mima=0x5b; break;
case(2):Mima=0x4f; break;
case(3):break;
case(4):Mima=0x66; break;
case(5):Mima=0x6d; break;
case(6):Mima=0x7d; break;
case(7):break;
case(8):Mima=0x07; break;
case(9):Mima=0x7f; break;
case(10):Mima=0x6f; break;
case(11):Mima=0x3f; break;
case(12):break;
case(13):break;
case(14):break;
case(15):break;
case(16):break;
}srmm[s]=Mima;s++;bep();
}
}
}
void main()
{ led=0;
while(1)
{ key();
if(j==1)
{ do
{ KeyDownsr();DigDisplaysr();
if(s==8)
{ s=0;m=0; if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7])
{mmzq();led=1;z=0;}
else
{ z++;dsmm();
if(z==3)
{led=0;z=0;shuoding();
while(mm!=0||ss!=0)
{daojishi();}
}
}
}
}while(m==8);if(m==8){m=0;}
}
if(j==2)
{ while(m<8)
{KeyDownsr();DigDisplaysr();
if(s==8)
{ s=0;m=0;
if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7])
{mmzq();z=0;led=1;
while(m<8)
{ KeyDownsr();DigDisplaysr();
if(s==8)
{
for(x=0;x<=7;x++)
{ysmm[x]=srmm[x];}
s=0;led=0;
}
}j=1;dsmm();
}
else
{z++;xgmm();
if(z==3)
{z=0;shuoding();
while(mm!=0||ss!=60)
{daojishi();}
}
}s=0;
}
}
if(m==8)m=0;
}
}
} |
|