图1
由于图片刷新率不高所以显示不全,实际上,上图是依次亮灯,实现逐渐点亮的效果,下图是依次亮灯后灭灯,实现流水灯的效果。
图2
这两部分的代码的区别在于:
图1是只用了左移,而左移的填充是0,这就会导致LED灯被逐个点亮。
图2是用了左移和逐位取反,先逐位取反后,要点亮的灯为1,不点亮的为0,此时进行左移填充的0就不会导致额外的LED灯被点亮。最后再取反回来就实现所需功能。
算是一个小BUG的修正。
完整代码:
#include <reg51.h>
#include<intrins.h>
sbit LED = P2;
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
u16 aa=0xfe;
u16 num;
void timer0() interrupt 1
{
TF0 = 0;
TH0=(65535-50000)/256; //50ms定时20次
TL0=(65535-50000)%256;
num++;
num %= 8;
P2=aa << num;
//P2=~(~aa << num);
}
void main()
{
LED = ~0x01;
TMOD = 0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0 = 1; // 启动定时器0
ET0 = 1; // 打开T0中断
EA = 1; // 开总中断
while(1);
}