正向普通流水灯:
void inittime1()
{
TMOD=0x01;//0000 0001
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void t1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==10)
{
i++;
count=0;
}
if(i==8)
{i=0;}
P0=~(0x01<<i);hc138(4);hc138(0);
}
正向呼吸流水灯:
void t0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
count++;
count1++;
if(count==pwm) //计数值达到所设置的占空比时
{P0=0xff;hc138(4);hc138(0);}
if(count==100) //计数值一个周期为100份
{
count=0; //每个亮度等级隔10ms切换一次
P0=~(0x01<<i);hc138(4);hc138(0);
pwm++;
} //1份为0.1ms,100份为10ms
if(pwm==100) //占空比达到最大后,清零重新开始
{
pwm=0;
}
if(count1==10000) //1s时间到,移位一次
{
count1=0;
i++;
}
if(i==8) //移位到达最后一位,又重新流水
{
i=0;
}
}
对于led灯的常规用法:(不存在流水灯状态的情况下均可实用下面写法)
对单个led灯进行操作且不会出现led的显示受到P0口其他数据影响的情况:
void led_switch() //只要不存在流水灯情况下解决外设冲突LED写法
{
P0=0xff; //先将P0清零防止干扰
if(l1_state==0)
P0&=~0x01; //1111 1110
else
P0|=0x01; //0000 0001
if(l2_state==0)
P0&=~0x02; //1111 1101
else
P0|=0x02; //0000 0010
if(l3_state==0)
P0&=~0x04; //1111 1011
else
P0|=0x04; //0000 0100
if(l4_state==0)
P0&=~0x08; //1111 0111
else
P0|=0x08; //0000 1000
if(l5_state==0)
P0&=~0x10; //1110 1111
else
P0|=0x10; //0001 0000
if(l6_state==0)
P0&=~0x20; //1101 1111
else
P0|=0x20; //0010 0000
if(l7_state==0)
P0&=~0x40; //1011 1111
else
P0|=0x40; //0100 0000
if(l8_state==0)
P0&=~0x80; //1000 0000
else
P0|=0x80; //1000 0000
hc138(4);
hc138(0);
}