#include<reg52.h>
#include<absacc.h>
#include<stdio.h>
#define at8255_PA XBYTE[0xD1FF]
#define at8255_PB XBYTE[0xD2FF]
#define at8255_PC XBYTE[0xD5FF]
#define at8255_CON XBYTE[0xD7FF]
#define uchar unsigned char
#define uint unsigned int
char code dis[11]={0xA0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff};
uchar KeyNumber=0;
uchar temp=1;
uchar flag=0,flagnum=0;
uchar a[3]={0};
uchar wait_time=0;
uchar count=0;
uchar num=0;
void Init_8255();
void Init_timer();
void delay(uchar k);
void display();
void GetKeyNumber();
void Init_8255()
{
at8255_CON=0x81;
at8255_PA=0xff;
at8255_PB=0xff;
}
void Init_timer()
{
TMOD=0X11;
ET0=1;
TH0=(65535-15536)/256;
TL0=(65535-15536)%256;
EA=1;
}
void delay(uchar k)
{
uchar i,j;
for(j=k;j>0;j--)
for(i=120;i>0;i--);
}
void display()
{
at8255_PB=dis[a[0]%10];
at8255_PA=0xdf;
delay(0);
at8255_PA=0xff;
at8255_PB=dis[a[0]/10];
at8255_PA=0xef;
delay(0);
at8255_PA=0xff;
at8255_PB=dis[a[1]%10];
at8255_PA=0xf7;
delay(0);
at8255_PA=0xff;
at8255_PB=dis[a[1]/10];
at8255_PA=0xfb;
delay(0);
at8255_PA=0xff;
at8255_PB=dis[a[2]%10];
at8255_PA=0xfd;
delay(0);
at8255_PA=0xff;
at8255_PB=dis[a[1]/10];
at8255_PA=0xfe;
delay(0);
at8255_PA=0xff;
}
void GetKeyNumber()
{
uchar i,j=0x80,k;
uchar keytab[9]={0x28,0x48,0x88,0x24,0x44,0x84,0x22,0x42,0x82};
at8255_PC=0x00;
for(i=0;i<3;i++)
{
at8255_PC=j;
k=at8255_PC;
k=k&0x0f;
if(k!=0)
{
delay(1);
k=at8255_PC;
k=k&0x0f;
while(at8255_PC&0x0f);
break;
}
j=j>>1;
delay(0);
}
k=k+j;
for(i=0;i<9;i++)
{
if(keytab[i]==k)
{
TR0=0;
count=0;
wait_time=0;
if(flagnum==0)
{
flagnum=k;
a[num]=i*3+temp;
temp++;
}
else if(flagnum!=k)
{
flagnum=k;
flag=1;
if(temp>3)
{
temp=1;
++num;
}
if(num==3)
{
a[0]=i*3+temp;
}
else
{
a[num]=i*3+temp;
}
if(a[num]==27)
{
a[num]=26;
temp++;
}
}
else
{
if(temp>3)
{
temp=1;
a[num]=i*3+temp;
}
if(a[num]==27)
{
a[num]=26;
temp++;
}
}
}
}
}
void main()
{
Init_8255();
Init_timer();
while(1)
{
while(wait_time<3&flag==0)
GetKeyNumber();
display();
}
if(flag==1);
else
{
num++;
flag=0;
temp=1;
TR0=0;
wait_time=0;
count=0;
if(num>=3)
num=0;
}
}
void Timer0_Ser() interrupt 1
{
TH0=(65535-15536)/256;
TL0=(65535-15536)%256;
count++;
if(count==20)
{
count=0;
wait_time++;
}
}