在点亮LED灯的程序中我们知道开发板上的LED灯是接到高电平的,如果单片机引脚输出电平,LED导通发亮。如果单片机引脚输出高电平,LED截止熄灭。知道这个原理后我们把单片机的P0端口的8个引脚都按照同样的方法接上8个LED灯,这样我们就能玩出更多的花样啦。
流水灯电路原理图
1、所有LED灯亮灭闪烁
先来一个简单的,先全部点亮和全部熄灭,间隔500ms,上次我们点亮LED灯的程序中我们只操作了P0端口的一位P0.0,现在只需要将原来操作一个端口的一位更改为操作操作整个端口即可。
将P0口定义为一个宏定义,方便后续理解。
#define LED P0
将原来的LED操作函数
void LedDisplay(unsigned char num)
{
Led0 = num;
}
更改为:
void LedDisplay(unsigned char num)
{
LED = num;
}
该函数传入的形参刚好是8bit的无符号整型数据,对应P0口的8个bit,P0.0为最低位。也就是说我们只需要改变LED操作函数传入的形参,P0口对应的8个LED灯状态就能对应改变。所以,我们需要实现全部LED灯的亮灭操作,全都LED点亮,形参传入16进制的0X00,P0口所有引脚置为低电平,延时后熄灭所有的LED灯,LED灯操作函数传入形参0XFF,P0端口所有引脚置为高电平。需要将主函数中对应做如下修改。
void main()
{
for(;;)
{
LedDisplay(0x00);
delay_ms(500);
LedDisplay(0xFF);
delay_ms(500);
}
}
2、间隔一个LED交替闪烁
根据上面我们实现所有LED亮灭的操作方法,如果要实现间隔一个LED交替闪烁,我们只需要更改传入的LED形参即可。对应为8bit的二进制数据为1010 1010为奇数的LED灯点亮,对应二进制为0101 0101为偶数的LED点亮。转化为16进制就是0xAA和0x55。我们对应修改主函数程序如下。编译下载到单片机,你会神奇地发现这时候已经有流水的效果了。
void main()
{
for(;;)
{
LedDisplay(0xAA);
delay_ms(500);
LedDisplay(0x55);
delay_ms(500);
}
}
3、从低位到高位依次点亮
从上面我们已经知道原理了,一次点亮的话我们需要给P0口依次赋值0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。那我们有没有更简单一下的方法呢,有的,我们发现上面的数据取反后是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80。然后0x02等于0x01向左移动一位,也就是说上面所有的数据可以用0x01通过移位和取反两个操作得到。
我们先定义一个全局变量并且初始值赋值0x01
unsigned char dat = 0x01;
在主函数中循环操作,循环一次移位一次。过更改延时函数的传入的形参大小可以调节流水的速度
void main()
{
unsigned char i;
for(;;)
{
dat = 0x01;
for(i=0;i<8;i++)
{
LedDisplay(~dat);
delay_ms(500);
dat = dat<<1;
}
}
}
给大家讲解了一下LED流水灯的原理和一些基本的操作方法,可以通过更改传入的数据和延时的时间,实现更多的流水灯样式。