有二个问题如下。问了好多人,都没得到解答。
1流水灯
void main()
{
uchar temp;
temp=0xfe;
while(1)
{
uchar x,y,m;
for(x=8;x>0;x--)
{
P1=temp;
delay_10ms(100);
temp=_crol_(temp,1); //循环左移
}
P1=0xff; //熄灭
delay_10ms(100);
for(y=8;y>0;y--)
{
temp=_cror_(temp,1); //循环右移
P1=temp;
delay_10ms(100);
}
P1=0xff;
delay_10ms(100);
for(m=2;m>0;m--) //闪二次
{
P1=0;
delay_10ms(100);
P1=0xff;
delay_10ms(100);
}
}
}
这程序看上去没错,可用起来,左移完了,右移,只有最右第一个灯亮,一直到闪烁开始。不会右移。原因是最后一个闪二次的FOR语句,不用这个FOR就正常,一用就不行。不知道为什么?
2PWM调光,也是单片机上接一个LED.程序如下。
void main()
#define pwm_h 0xff;
#define pwm_l 0;
{
uint cycle=500; //周期
P1=0xff;
delay_10ms(50);
while(1)
{
uint i;
//P1=0xff;
//delay_10ms(200);
for(i=1;i<=cycle;i++) 先渐亮
{
P1=pwm_l;
delay_pwm(i);
P1=pwm_h;
delay_pwm(cycle+400-i);
}
// delay_10ms(100);
for(i=1;i<=cycle;i++) 再渐灭
{
P1=pwm_l;
delay_pwm(cycle-i);
P1=pwm_h;
delay_pwm(i+400);
}
P1=0xff; 灭灯等5S
delay_10ms(500);
}
}
结果是渐灭后,会再宛然亮一下。再灭等5S。灭了后再亮一下,不知道从哪来的???? |