#include<reg52.h>
#include<absacc.h>
#define PA XBYTE[0XD1FF]
#define PB XBYTE[0XD2FF]
#define PC XBYTE[0XD5FF]
#define CON XBYTE[0XD7FF]
#define uchar unsigned char
#define uint unsigned int
uchar count1,count2,count3,f1;
uchar smg[]={0xdf,0xef};
uchar smg1[]={0xf7,0xfb};
uchar table1[]={0x28,0x20,0xb8,0x24,0x2c,0x39,0x2a,0x62,0xbb,0xa0};
uchar table2[]={0xbb,0xa0};
void delay()
{
uint m=100;
while(m--);
}
void delay1(uchar n)
{
while(n--);
}
//此函数扫描是否有进入特殊状态10s的键按下
uchar saomiao()
{
uchar key;
PC=0X10;
delay1(10);
key=PC;
if(key!=0x10)
return 1;
else
return 0;
}
//特殊状态时的10s显示函数
void special()
{
signed char x=0;
uchar count4=0;
while(1)
{
P1=0X00;
PB=0XFF;
PA=smg[0];
if(count1==20)
{
count1=0;
count4++;
if(count4==10)
break;
if(x==9)
x=(-1);
PB=table1[++x];
}
else
PB=table1[x];
PB=0XFF;
PA=smg[1];
PB=0xa0;
}
}
main()
{
uchar f,flag;
signed char i,j;
f=0;
i=0;
j=0;
count1=0;
count2=0;
count3=0;
flag=1;
CON=0X81;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
f1=saomiao();
if(f1)
{
special();
f=0;
i=0;
j=0;
count1=0;
count2=0;
count3=0;
flag=1;
}
//以下else的大括号中是交通灯正常运行时代码
else
{
//东西方向通行
if(flag) //flag为1时东西方向通行20s
{
if(count2<=14)
P1=0X66;
else
{
if(count1%2==0)
{
f=~f;
if(f)
P1=0XFF;
else
P1=0X66;
}
}
PB=0XFF;
PA=smg[0];
if(count1==20)
{
count1=0;
count2++;
if(count2==20)
{
count2=0;
flag=0; //20s后改变flag的值,以使进入南北方向通行的20s
}
count3++;
if(i==9)
i=(-1);
PB=table1[++i];
}
else
PB=table1[i];
PB=0XFF;
PA=smg[1];
if(count3==10)
{
count3=0;
if(j==1)
j=(-1);
PB=table2[++j];
}
else
PB=table2[j];
}
//南北方向通行
else
{
if(count2<=14)
P1=0X99;
else
{
if(count1%2==0)
{
f=~f;
if(f)
P1=0XFF;
else
P1=0X99;
}
}
PB=0XFF;
PA=smg1[0];
if(count1==20)
{
count1=0;
count2++;
if(count2==20)
{
count2=0;
flag=1; //20s后改变flag的值,以使进入东西方向通行的20s
}
count3++;
if(i==9)
i=(-1);
PB=table1[++i];
}
else
PB=table1[i];
PB=0XFF;
PA=smg1[1];
if(count3==10)
{
count3=0;
if(j==1)
j=(-1);
PB=table2[++j];
}
else
PB=table2[j];
}
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count1++;
}