#include <reg51.h>
#include <INTRINS.H>
unsigned char count; //中斷次數(shù)計數(shù)
unsigned char s; //狀態(tài)變量
unsigned char sn,ew; //倒計時變量
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0~9十個數(shù)字和共陽型段碼
sbit r1=P1^0; //兩個方向的紅黃綠燈
sbit y1=P1^1;
sbit g1=P1^2;
sbit r2=P1^5;
sbit y2=P1^4;
sbit g2=P1^3;
void delay(unsigned int j)
{
while(j--);
}
display()
{
unsigned char i,wk=0x01;//wk變量作位控,初始選通右邊第1位
unsigned char buf[4]; //聲明數(shù)碼管顯示字形緩沖數(shù)組
buf[0]=seg[sn%10]; //南北方向計時變量
buf[1]=seg[sn/10%10];
buf[2]=seg[ew%10];
buf[3]=seg[ew/10%10];
for (i=0;i<4;i++)
{
P3=wk; //輸出位控
P0=buf[i]; //依次輸出段碼
delay(50); //延時
wk=_crol_(wk,1); //位控左移一位
P0=0xff; //熄滅所有數(shù)碼管(消隱)
}
}
int main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
sn=40;
ew=45;
while(1)
{
display();
switch(s)
{
case 0: //狀態(tài)一
r1=1;y1=1;g1=0;
r2=0;y2=1;g2=1;
if(sn==255) //字符型數(shù)據(jù)0減1等255
{
sn=4;
s=1;
}
break;
case 1: //狀態(tài)二
r1=1;y1=0;g1=1;
r2=0;y2=1;g2=1;
if(sn==255)
{
sn=35;
ew=30;
s=2;
}
break;
case 2: //狀態(tài)三
r1=0;y1=1;g1=1;
r2=1;y2=1;g2=0;
if(ew==255)
{
ew=4;
s=3;
}
break;
case 3: //狀態(tài)四
r1=0;y1=1;g1=1;
r2=1;y2=0;g2=1;
if(ew==255)
{
sn=40;
ew=45;
s=0;
}
break;
}
}
}
void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20) //1秒定時
{
count=0;
sn--;
ew--;
}
}
|