其实到后面看都是模块化的东西,各行翻译都在图片上,无聊的可以自己对照看看电开的板子复制下面我写的就行了
#include<reg52.h>
sbit ENLED = P1^1;
unsigned char code LedChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsigned char LedBuff[7]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
bit flagls=1;
unsigned char T0RH=0;
unsigned char T0RL=0;
void ConfigTimer0(unsigned int ms);
void TrafficLight();
void main()
{
EA=1;
ENLED=0;
ConfigTimer0(1);
while(1)
{
if(flagls)
{flagls=0;
TrafficLight();
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp=32768000/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp;
tmp=tmp+13;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
void TrafficLight()
{
static unsigned char color=2;
static unsigned char timer=0;
if(timer==0)
{
switch(color)
{
case 0:
color=1;
timer=2;
LedBuff[6]=0xE7;
break;
case 1:
color=2;
timer=29;
LedBuff[6]=0xFC;
break;
case 2:
color=0;
timer=39;
LedBuff[6]=0x3F;
break;
default:
break;
}
}
else
{
timer--;
}
LedBuff[1]=LedChar[timer%10];
LedBuff[0]=LedChar[timer/10];
}
void LedScan()
{
static unsigned char i=0;
P0=0xFF;
P2=(P2&0xF8)|i;
P0=LedBuff[i];
if(i<6)
i++;
else i=0;
}
void InterruptTimer() interrupt 1
{
static unsigned int tmrls=0;
TH0=T0RH;
TL0=T0RL;
LedScan();
tmrls++;
if(tmrls>=1000)
{
tmrls=0;
flagls=1;
}
}
|