#include
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P2^3;//定义报警器端口p2.3为fmq
sbit wei1=P2^0;//定义数码管1端口p2.0为wei1
sbit wei2=P2^1; //定义数码管2端口p2.1为wei2
sbit wei3=P2^2; //定义数码管3端口p2.2为wei3
uchar Code[3]={0,0,0};
uchar InPut[3]={1,1,1};
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint KEYboard,time;
uchar *p=InPut;
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
uchar temp,ok,Error;
uchar count=0;
uchar Set=0;//修改密码关键字
TMOD=0X11;//
TCON=0X10;//
TH0=(65536-5000)/256;//50ms
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;//定时/计数器T0中断允许位
ET1=1;
EA=1;//开总中断
while(1)
{
if(KeyBoard==11) { }
if(Set==1&&ok==1&&KeyBoard<10)//重新设置密码的条件
{
Set=1;//修改密码关键字
Ok=0;//确认关键字
}
Ok=0;
switch(count)
{
case 0:Code[0]=KeyBoard;count++;break;
case 1:Code[1]=KeyBoard;count++;break;
case 2:Code[2]=KeyBoard;count++;break;
}
if(Set==0&&ok==1&&KeyBoard<10) { }
if(KeyBoard==10)
{
KeyBoard=100;
ok=0;
count=0;
if(Set==1)
{
Set=0;
}
else
{
ok=0;
if(count>2)count=0;
switch(count) { }
case 0:InPut[0]=KeyBoard;count++;break;
case 1:InPut[1]=KeyBoard;count++;break;
case 2:InPut[2]=KeyBoard;count++;break;
if((Code[0]==InPut[0])&&(Code[1]==InPut[1])&&(Code[2]==InPut[2]))
}
}
{ } else//密码输入错误
{ } Error++;
InPut[0]=1;
InPut[1]=1;
InPut[2]=1;
fmq=1;
Error=0;
time=0;
if(Error>=2) { }
}
if(time>200)
{
time=0,Error=0;
}
if(ok==0)
{
P1=0xfe ;//P1口设置为0xfe 1111 1110(第一行置为低电0)
temp=P1;//P1赋给temp
temp=temp&0xf0;//0xf0赋给temp(所有行线置为低电0,所有列线置为高电平)
TR1=1;
if(time<200) { }
else
{
fmq=1;
fmq=0;
if(temp!=0xf0)//检测是否有按键按下 { }
P1=0xfd ;//1111 1101(第二行置为低电0)
temp=P1;
temp=temp&0xf0;//1111 0000
if(temp!=0xf0)
{
delay(5000);
if(temp!=0xf0)
{
Ok=1;
switch(temp)
{
case 0x70:KeyBoard=4;break;
case 0xb0:KeyBoard=5;break;
case 0xd0:KeyBoard=6;break;
delay(5000);//去除干扰
if(temp!=0xf0)//再次检测是否有按键按下 1111 0000 { }
switch(temp) { }
Ok=1;
while(((P1&0xf0)==temp));
case 0x70:KeyBoard=1;
break;//0111 0000
case 0xb0:KeyBoard=2;
break;//1011 0000
case 0xd0:KeyBoard=3;
break;//1101 0000
}
}
}
while(((P1&0xf0)==temp));
P1=0xfb ;//1111 1011 (第三行置为低电0)
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0) { }
P1=0xf7 ;//1111 0111(第四行置为低电0)
delay(5000);
if(temp!=0xf0) { }
ok=1;
switch(temp) { }
while(((P1&0xf0)==temp));
case 0x70:KeyBoard=7;
break;
case 0xb0:KeyBoard=8;
break;
case 0xd0:KeyBoard=9;
break;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5000);
if(temp!=0xf0)
}
}
}
{}
ok=1;
switch(temp){}
while(((p1&0x0f)==temp));
case 0x70:KeyBoard=0;
break;
case 0xb0:KeyBoard=10;
break;
case 0xd0 KeyBoard=11;
break;
}
void timer0()interrupt 1//中断源定时器/计数器0 级别较高
{
static cnt=0;
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
cnt++;
if(cnt>3)cnt=1;
switch(cnt)
{
case 1:P2=P3&0xf8;//1111 1000控制蜂鸣器 数码管位选
P0=table[*p];//
P3=P3|0x01;//0000 0001 选通第一个数码管
break;
case 2: P2=P3&0xf8;//1111 1000
}
}
P0=table[*(p+1)];//
P3=P3|0x02;//0000 0010 选通第二个数码管
break;
case 3: P2=P3&0xf8; //1111 1000
P0=table[*(p+2)];//
P3=P3|0x04;//0000 0100 选通第三个数码管
break;
void timer1() interrupt 3//中断源定时/计数器1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
}
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P2^3;//定义报警器端口p2.3为fmq
sbit wei1=P2^0;//定义数码管1端口p2.0为wei1
sbit wei2=P2^1; //定义数码管2端口p2.1为wei2
sbit wei3=P2^2; //定义数码管3端口p2.2为wei3
uchar Code[3]={0,0,0};
uchar InPut[3]={1,1,1};
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint KEYboard,time;
uchar *p=InPut;
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
uchar temp,ok,Error;
uchar count=0;
uchar Set=0;//修改密码关键字
TMOD=0X11;//
TCON=0X10;//
TH0=(65536-5000)/256;//50ms
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;//定时/计数器T0中断允许位
ET1=1;
EA=1;//开总中断
while(1)
{
if(KeyBoard==11) { }
if(Set==1&&ok==1&&KeyBoard<10)//重新设置密码的条件
{
Set=1;//修改密码关键字
Ok=0;//确认关键字
}
Ok=0;
switch(count)
{
case 0:Code[0]=KeyBoard;count++;break;
case 1:Code[1]=KeyBoard;count++;break;
case 2:Code[2]=KeyBoard;count++;break;
}
if(Set==0&&ok==1&&KeyBoard<10) { }
if(KeyBoard==10)
{
KeyBoard=100;
ok=0;
count=0;
if(Set==1)
{
Set=0;
}
else
{
ok=0;
if(count>2)count=0;
switch(count) { }
case 0:InPut[0]=KeyBoard;count++;break;
case 1:InPut[1]=KeyBoard;count++;break;
case 2:InPut[2]=KeyBoard;count++;break;
if((Code[0]==InPut[0])&&(Code[1]==InPut[1])&&(Code[2]==InPut[2]))
}
}
{ } else//密码输入错误
{ } Error++;
InPut[0]=1;
InPut[1]=1;
InPut[2]=1;
fmq=1;
Error=0;
time=0;
if(Error>=2) { }
}
if(time>200)
{
time=0,Error=0;
}
if(ok==0)
{
P1=0xfe ;//P1口设置为0xfe 1111 1110(第一行置为低电0)
temp=P1;//P1赋给temp
temp=temp&0xf0;//0xf0赋给temp(所有行线置为低电0,所有列线置为高电平)
TR1=1;
if(time<200) { }
else
{
fmq=1;
fmq=0;
if(temp!=0xf0)//检测是否有按键按下 { }
P1=0xfd ;//1111 1101(第二行置为低电0)
temp=P1;
temp=temp&0xf0;//1111 0000
if(temp!=0xf0)
{
delay(5000);
if(temp!=0xf0)
{
Ok=1;
switch(temp)
{
case 0x70:KeyBoard=4;break;
case 0xb0:KeyBoard=5;break;
case 0xd0:KeyBoard=6;break;
delay(5000);//去除干扰
if(temp!=0xf0)//再次检测是否有按键按下 1111 0000 { }
switch(temp) { }
Ok=1;
while(((P1&0xf0)==temp));
case 0x70:KeyBoard=1;
break;//0111 0000
case 0xb0:KeyBoard=2;
break;//1011 0000
case 0xd0:KeyBoard=3;
break;//1101 0000
}
}
}
while(((P1&0xf0)==temp));
P1=0xfb ;//1111 1011 (第三行置为低电0)
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0) { }
P1=0xf7 ;//1111 0111(第四行置为低电0)
delay(5000);
if(temp!=0xf0) { }
ok=1;
switch(temp) { }
while(((P1&0xf0)==temp));
case 0x70:KeyBoard=7;
break;
case 0xb0:KeyBoard=8;
break;
case 0xd0:KeyBoard=9;
break;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5000);
if(temp!=0xf0)
}
}
}
{}
ok=1;
switch(temp){}
while(((p1&0x0f)==temp));
case 0x70:KeyBoard=0;
break;
case 0xb0:KeyBoard=10;
break;
case 0xd0 KeyBoard=11;
break;
}
void timer0()interrupt 1//中断源定时器/计数器0 级别较高
{
static cnt=0;
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
cnt++;
if(cnt>3)cnt=1;
switch(cnt)
{
case 1:P2=P3&0xf8;//1111 1000控制蜂鸣器 数码管位选
P0=table[*p];//
P3=P3|0x01;//0000 0001 选通第一个数码管
break;
case 2: P2=P3&0xf8;//1111 1000
}
}
P0=table[*(p+1)];//
P3=P3|0x02;//0000 0010 选通第二个数码管
break;
case 3: P2=P3&0xf8; //1111 1000
P0=table[*(p+2)];//
P3=P3|0x04;//0000 0100 选通第三个数码管
break;
void timer1() interrupt 3//中断源定时/计数器1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
}