#include<reg52.h>
#include<absacc.h>
#define a8255A XBYTE[0xd1ff]
#define a8255B XBYTE[0xd2ff]
#define a8255C XBYTE[0xd4ff]
#define a8255CON XBYTE[0xd6ff]
sbit SP1=P3^2;
sbit SB=P3^3;
sbit D1=P1^6;
unsigned char code dispcode[]={0xff,0xA0,0xBB,0x62,0x2A,0x39,0x2C,
0x24,0xBA,0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74,};
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0x2f,0x1f,}; //位码存的数组
unsigned char dispbuf[6]={0,0,0,0,0,0}; //键盘输入数字所存的数组
unsigned char dispbuf0[6]={5,4,3,2,1,0}; //键盘输入数字所存的数组
unsigned char dispbuf1[6]={5,4,3,2,1,0}; //原始密码存的数组
unsigned char dispbitcount;
unsigned char temp;
unsigned char key;
unsigned char keypos,PC;
void delay(int z)
{
while(z--);
}
void change(unsigned char *p,unsigned char count)
{
while(count>0)
{
*(p+count)=*(p+count-1);
count--;
}
}
void setting()
{
unsigned char i,j;
a8255CON=0x81;
j=0x10;
P3=0xff;
while(1) {
a8255A=0xff;
a8255B=dispcode[dispbuf[dispbitcount]+1]; //数码管显示
a8255A=dispbitcode[dispbitcount];
dispbitcount++;
delay(400);
if (dispbitcount==6)
{
dispbitcount=0;
}
for(i=0;i<4;i++)
{
a8255C=j;
PC=a8255C&0x0f;
while(PC!=0x00)
{ delay(400);
a8255C=j;
PC=a8255C&0x0f;
while(PC!=0x00)
{
PC=a8255C;
switch(PC)
{
case 0x11:key=0;break;
case 0x12:key=1;break;
case 0x14:key=2;break;
case 0x18:key=3;break;
case 0x21:key=4;break;
case 0x22:key=5;break;
case 0x24:key=6;break;
case 0x28:key=7;break;
case 0x41:key=8;break;
case 0x88:key=15;break;
}
if ((key>=0) && (key<10))
{
if(keypos<6)
{
change(dispbuf,keypos); //按键数字存入数组
dispbuf[0]=key;
}
else
{
keypos=6;
}
keypos++;
}
while(PC!=0x00)
{
PC=a8255C;
PC=PC&0x0f;
}
}
}
if(i<3)
j=j<<1;
else
{
j=0x10;
} }
if(SP1==0) //6位密码输完,按sp1键跳出键盘输入数字程序,即该程序
break;
}
}
void main()
{
unsigned char i;
setting(); //调用键盘扫描程序,得到输入的密码
if(key==15)
{for(i=0;i<6;i++) //输入密码所存的数组,与原存的原始密码进行比较
{
if(dispbuf0[i]==dispbuf1[i])
continue; //如果相同继续比较
} }
else
for(i=0;i<6;i++) //输入密码所存的数组,与原存的原始密码进行比较
{
if(dispbuf[i]==dispbuf1[i])
continue; //如果相同继续比较
else if(dispbuf[i]!=dispbuf1[i]) //如果不相同,给i赋值10,且跳出for循环
{ i=10;
break; } }
while(1) {
while(i==6) //密码正确,流水灯第一个灯亮
{
D1=0;}
while(i==10) //如果密码不正确,蜂鸣器报警
{
SB=~SB;
delay(400);
}
}
}