信号灯(对矩阵按钮与led灯的 综合应用同时对中断的加强)
利用中断实现随着数码管的时间减少同时led的发生变化
#include<reg52.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 flag=1;
unsigned char T0RH=0;
unsigned char T0RL=0;
sbit ENLED=P1^4;
sbit ADDR3=P1^3;
void configTimer0(unsigned ms);
void trafficlight();
void main()
{
EA=1;
ENLED=0;
ADDR3=1;
configTimer0(1);
while(1)
{
if(flag==1)
{
flag=0;
trafficlight();
}
}
}
void configTimer0(unsigned ms)
{
unsigned char tmp;
tmp=11059200/12;
tmp=tmp*ms/1000;
tmp=65536-tmp+13;
T0RH=(unsigned char )(tmp>>8);
T0RL=(unsigned char )tmp;
TMOD=TMOD&0xF0;
TMOD=TMOD|0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
void trafficlight()
{
unsigned char color=3;
unsigned char timer=0;
if(timer==0)
{
switch(color)
{
case 0: color=0;timer=39;ledbuff[6]=0x3F;break;
case 1: color=1;timer=3;ledbuff[6]=0xE7;break;
case 2: color=2;timer=1;ledbuff[6]=0xFC;break;
default:break;
}
}
else
{
timer--;
}
ledbuff[0]=ledchar[timer%10];
ledbuff[1]=ledchar[timer/10];
}
void LedScan()
{
static unsigned char i=0;
P0=0xFF;
P1=(P1&0xF8)|i;
P0=ledbuff[i];
if(i<6)
i++;
else
i=0;
}
void InterruptTimer0() interrupt 1
{
static unsigned int trmls=0;
TH0=T0RH;
TL0=T0RL;
LedScan();
trmls++;
if(trmls>=1000)
{
trmls=0;
flag=1;
}
}
|