|
2黑幣
現(xiàn)在程序可以運(yùn)行,主要就是密碼正確LED亮,密碼錯誤三次報警10S,如果在報警時間內(nèi)按鍵,則重載報警時間,這個不知道怎么改程序,求大佬們幫幫忙。以下是程序代碼:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //字模定義
void delay(uint z); //延時函數(shù)
void get_key(); // 鍵盤掃描子程序
void fun_key(); //按鍵C,D子程序
void init(); // 初始化設(shè)置
void exter0(); //定時器T0中斷服務(wù)
void disp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f);
//6位數(shù)字顯示子函數(shù)
void rest_cipher(); // 重置密碼子程序
uchar cou_dis(uchar); //數(shù)字右移函數(shù)
void display(uchar); // 數(shù)碼管顯示程序
void alarm(); //報警電路程序
void delay_us(uchar); //延時函數(shù)
uchar hang,lie,addres,num,temp,flag,sum,fun,mark,con,N,km;
uint to,aa;
uchar a,b,c,d,e,f; //數(shù)碼管顯示位數(shù)
uchar a1,b1,c1,d1,e1,f1;
sbit D0=P3^0;
sbit K=P3^1;
void main()
{ init(); //初始化設(shè)置
while(1)
{
get_key(); //鍵盤掃描子程序
if(N<6)
cou_dis(num); //數(shù)字右移函數(shù)
fun_key(); //按鍵C,D子程序
display(N); // 數(shù)碼管顯示程序
if(to==2000)
{
to=0;
D0=1; //數(shù)碼管熄滅
TR0=0;
mark=0;
}
alarm(); // 報警電路程序
if(num=='A')
{ to=0;
TR0=0;
while(mark)
{
rest_cipher(); // 重置密碼子程序
mark=0;
}
}
}
}
void init() // 初始化設(shè)置
{
K=0; // p3.1口置零
con=1;
mark=0;
temp=0xfe;
flag=0;
fun=0;
a1=6; //從右往左數(shù)第六位密碼
b1=5; //第五位密碼
c1=4; //第四位密碼
d1=3; //第三位密碼
e1=2; //第二位密碼
f1=1; //第一位密碼
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
}
void rest_cipher() // 重置密碼子程序
{ a=b=c=d=e=f=0; //熄滅數(shù)碼管
N=0; //輸入密碼個數(shù)清零
D0=1; //熄滅led燈
while(con)
{
get_key(); //鍵盤掃描子程序
if(N<6) //判斷輸入密碼的個數(shù)
cou_dis(num); //數(shù)字右移函數(shù)
disp(a,b,c,d,e,f); //數(shù)字顯示函數(shù)
if(num=='D')
{con=0;}
if(num=='C')
{a=b=c=d=e=f=0; //熄滅數(shù)碼管
N=0;}
a1=a;
b1=b;
c1=c;
d1=d;
e1=e;
f1=f;
}
a=b=c=d=e=f=0;
N=0;
}
void delay(uint z) // 延時函數(shù)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
uchar cou_dis(uchar num) //數(shù)字右移函數(shù)
{
if((num==0)||(num==1)||(num==2)||(num==3)||(num==4)||(num==5)
||(num==6)||(num==7)||(num==8)||(num==9))
//判斷是否輸入的是其中一個數(shù)字
{ //N=1; //輸入密碼個數(shù)為1
if(flag!=0) //說明有數(shù)輸入
{ N++; //輸入密碼個數(shù)加1
flag=0;
f=e;
e=d;
d=c;
c=b;
b=a;
a=num; //輸入密碼右移
}
}
}
void get_key() //鍵盤掃描子程序
{
P1=0xf0;
lie=P1;
P1=0x0f;
hang=P1;
addres=hang|lie; //行列寄存器中的值相或得到按鍵值
while(addres!=0xff)
//判斷是否有鍵按下,若adres的值不為0xff則有鍵按下
{
delay(5); // 延時消抖
P1=0xf0;
lie=P1;
P1=0x0f;
hang=P1;
addres=hang|lie;
if(addres!=0xff)
{ flag++;
switch(addres) // 讀取鍵值
{
case 0xee:num=1;break; //按鍵1動作,設(shè)num=1
case 0xde:num=2;break; //按鍵2動作,設(shè)num=2
case 0xbe:num=3;break; //按鍵3動作,設(shè)num=3
case 0x7e:num='A';break; // 按鍵A動作,設(shè)num=A
case 0xed:num=4;break; //按鍵4動作,設(shè)num=4
case 0xdd:num=5;break; //按鍵5動作,設(shè)num=5
case 0xbd:num=6;break; // 按鍵6動作,設(shè)num=6
case 0x7d:num='B';break; // 按鍵B動作,設(shè)num=B
case 0xeb:num=7;break; //按鍵7動作,設(shè)num=7
case 0xdb:num=8;break; // 按鍵8動作,設(shè)num=8
case 0xbb:num=9;break; //按鍵9動作,設(shè)num=9
case 0x7b:num='C';break; // 按鍵C動作,設(shè)num=C
case 0xd7:num=0;break; //按鍵0動作,設(shè)num=0
case 0x77:num='D';break; // 按鍵D動作,設(shè)num=D
}
}
}
}
void fun_key() //按鍵C,D子程序
{
if(num=='C') //判斷按鍵是否為C
{
a=b=c=d=e=f=0; //按鍵為C熄滅數(shù)碼管
N=0; //輸入密碼個數(shù)為0
}
if(num=='D') //按鍵是否為D
{ num=0xff;
if((a1==a)&&(b1==b)&&(c1==c)&&(d1==d)&&(e1==e)&&(f1==f))
//比較密碼是否正確
{ mark=1;
TR0=1;
to=0;
D0=0; //led燈點亮
a=b=c=d=e=f=0; //數(shù)碼管熄滅
N=0; //輸入密碼個數(shù)為0
km=0; //輸入密碼錯誤次數(shù)為0
}
if((a1!=a)||(b1!=b)||(c1!=c)||(d1!=d)||(e1!=e)||(f1=!f))
//密碼錯誤
{ if(D0!=0) //led燈不亮
{ km++; //錯誤次數(shù)累加
N=0; //輸入密碼個數(shù)為0
a=b=c=d=e=f=0; //數(shù)碼管熄滅
} }
}
}
void display(uchar N) // 數(shù)碼管顯示程序
{
if(N==1) //判斷輸入密碼個數(shù)是否為1
{ temp=0xfe;
P0=0x40; //點亮g段使顯示為“—”
P2=temp;
delay(1);
P2=0xff; //點亮數(shù)碼管右邊N位使顯示“—”
}
if(N==2) //判斷輸入密碼個數(shù)是否為2
{ temp=0xfe;
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1); //帶循環(huán),使其挨個點亮
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
}
if(N==3) // 判斷輸入密碼個數(shù)是否為3
{ temp=0xfe;
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
}
if(N==4) // 判斷輸入密碼個數(shù)是否為4
{ temp=0xfe;
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
}
if(N==5) //判斷輸入密碼個數(shù)是否為5
{ temp=0xfe;
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
}
if(N==6) //判斷輸入密碼個數(shù)是否為6
{ temp=0xfe;
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=0x40;
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
}
}
void exter0() interrupt 1 //定時器T0中斷服務(wù)
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
to++;
}
void alarm() //報警電路子程序
{
if(km==3) //判斷輸入錯誤密碼的次數(shù)
{ uchar n,m;
km=0;
for(m=50;m>0;m--)
{
for(n=200;n>0;n--)
{
K=~K; //p3.1口取反
delay_us(1000); // 調(diào)用延時函數(shù)
}
K=0; //p3.1口置零
delay(100); // 調(diào)用延時函數(shù)
}
}
}
void disp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) //數(shù)字顯示
{
P0=table[a]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff; //打開數(shù)碼管所有位
temp=_crol_(temp,1);
P0=table[b]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=table[c]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=table[d]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=table[e]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff;
temp=_crol_(temp,1);
P0=table[f]; //輸入從左往右第一個數(shù)
P2=temp;
delay(1);
P2=0xff;
if(temp=0xef)
temp=0xfe;
}
void delay_us(uchar z) //延時子函數(shù)
{
while(--z);
}
|
|