#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uintaj;
voiddelay(uint s) //延时函数
{
uchar t;
while(s--)
{
for(t=0;t<120000;t++);
}
}
void anxia() //按键程序
{
uchar Tmp;
P1=0x0f;
delay(1);
Tmp=P1^0x0f;
switch(Tmp)
{
case1: aj=0;break;
case2: aj=1;break;
case4: aj=2;break;
case8: aj=3;break;
default:aj=16;
}
P1=0xf0;
delay(1);
Tmp=P1>>4^0x0f;
switch(Tmp)
{
case1: aj+=0;break;
case2: aj+=4;break;
case4: aj+=8;break;
case8: aj+=12;break;
}
}
voidmain()
{
uint mima[]={0,0,0,0,0,0}; //初始密码
uint ls[6];
uint lst[6];
uint i=0,a,b,flog=0,f=0;
P0=0x00;
while(1)
{
f=0;
P1=0xf0;
if(P1!=0xf0) //键盘有键按下
{
f=1;
anxia();
if(aj<10) // 输入的是密码
{
ls[ i]=aj;
i++;
if(i==5) //密码输完
{
for(i=0;i<6;i++)
{
a=mima[ i];
b=ls[ i];
if(a!=b)//密码错误
{
P0=0xfd;//第二个led亮红灯报错
P2=0x79;//显示E error
delay(5);
for(i=0;i<6;i++)
{
ls[ i]=0;
}
i=0;
}
if(a==b&&i==5)
{
P0=0xfe;//第一个led亮绿灯报对
P2=0x39;//显示C correct
flog=1;
i=0;
}
}
delay(5);//延时还原
P0=0x00;
P2=0x00;
if(P1==0xf0)
flog=0;
break;
}
}
}
if(aj==10) //手动清除按键
{
for(i=0;i<6;i++)
ls[ i]=0;
}
if(flog==1&&aj==11)//重置密码
{
for(i=0;i<6;i++)
ls[ i]=0;
while(1)
{
if(P1!=0xf0)
anxia();
if(P0!=0xfb)
{
ls[ i]=aj;
i++;
}
if(i==5)
{
P0=0xfb;//第三个led亮
i=0;
}
if(P0==0xfb)
{
lst[ i]=aj;
i++;
}
if(i==5&&P0==0xfb)
{
for(i=0;i<6;i++)
{
a=ls[ i];
b=lst[ i];
if(a==b)
{
mima[ i]=a;
P2=0x39;//显示C correct
P0=0xf7;//第四个led亮
}
else
{
for(i=0;i<6;i++)
ls[ i]=0;
lst[ i]=0;
P0=0xfd;//第二个led亮红灯报错
P2=0x79;//显示E error
break;
}
}
}
while(!f);
}
}
while(!f);
}
}
|