#include <STC12C5A60S2.H>
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 flag1s = 1;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
void ConfigTimer0(unsigned int ms);
void TrafficLight();
void main()
{
EA = 1;
P11 = 0;
ConfigTimer0(1);
while (1)
{
if (flag1s)
{
flag1s = 0;
TrafficLight();
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32000000 / 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 = 0; timer = 60; LedBuff[6] = 0xE7; break;
case 1: color = 1; timer = 60; LedBuff[6] = 0xFC; break;
case 2: color = 2; timer = 60; LedBuff[6] = 0x3F; break;
}
}
else
{
timer--;
}
LedBuff[1] = LedChar[timer%10];
LedBuff[0] = LedChar[timer/10];
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
P2 = (P1 & 0xF8) | i;
P0 = LedBuff[i];
if (i < 6)
i++;
else
i = 0;
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s = 0;
TH0 = T0RH;
TL0 = T0RL;
LedScan();
tmr1s++;
if (tmr1s >= 1000)
{
tmr1s = 0;
flag1s = 1;
}
}
|