注意:本程序中LED动态扫描函数必须使用
if
else if
语句,使用switch语句或简写语句数码管和LED小灯不会亮或者会闪一下直接熄灭,具体原因不知为何,可能是照抄金沙滩代码出现单片机型号不同所致;
此外按住回车键和ESC键会使倒计时数字从第五位和第六位转移到第一位和第二位(算是小发现)
#include <reg52.h>
sbit ENLED=P1^1;
sbit ADDR0=P2^0;
sbit ADDR1=P2^1;
sbit ADDR2=P2^2;
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;
ENLED=0;
ConfigTimer0(1);
while(1)
{
if(flag1s==1)
{
flag1s=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[0]=LedChar[timer%10];
LedBuff[1]=LedChar[timer/10];
LedBuff[2]=0xFF;
LedBuff[3]=0xFF;
LedBuff[4]=0xFF;
LedBuff[5]=0xFF;
}
void LedScan()
{
static unsigned char i=0;
P0=0xFF;
if(i==0)
{ADDR0=1;ADDR1=0;ADDR2=1;i++0=LedBuff[0];}
else if(i==1)
{ADDR0=0;ADDR1=0;ADDR2=1;i++0=LedBuff[1];}
else if(i==2)
{ADDR0=1;ADDR1=1;ADDR2=0;i++0=LedBuff[2];}
else if(i==3)
{ADDR0=0;ADDR1=1;ADDR2=0;i++0=LedBuff[3];}
else if(i==4)
{ADDR0=1;ADDR1=0;ADDR2=0;i++0=LedBuff[4];}
else if(i==5)
{ADDR0=0;ADDR1=0;ADDR2=1;i++0=LedBuff[5];}
else if(i==6)
{ADDR0=0;ADDR1=1;ADDR2=1;i=00=LedBuff[6];}
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s=0;
TH0=T0RH;
TL0=T0RL;
LedScan();
tmr1s++;
if(tmr1s>=1000)
{
tmr1s=0;
flag1s=1;
}
}
|