LED流水灯效果
低阶版本
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
对于这个版本主要实现的功能是:使得LED灯从右到左依次闪烁,间隔时间为500ms。对于闪烁的原因可以去看之前的点亮一个LED文章。通过引用延时函数,从而实现第一个灯闪烁后间隔500ms第二个灯闪烁。
但是随之而来的问题是想要调整闪烁的间隔时间就比较麻烦,需要改变延时函数。那么有没有一种方法可以实现将闪烁的间隔时间当做变量直接通过改变变量的方法来改变间隔时间。于是就有了进阶版。
进阶版本
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz xms为延时长度
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms=xms-1;
}
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay1ms(500);
P2=0xFD;//1111 1101
Delay1ms(500);
P2=0xFB;//1111 1011
Delay1ms(500);
P2=0xF7;//1111 0111
Delay1ms(500);
P2=0xEF;//1110 1111
Delay1ms(500);
P2=0xDF;//1101 1111
Delay1ms(500);
P2=0xBF;//1011 1111
Delay1ms(500);
P2=0x7F;//0111 1111
Delay1ms(500);
}
}
对于进阶版主要是将延时函数改为1ms,1ms的延时函数如下。(延时函数的获取方法可以去看我的2-2那篇文章)
void Delay1ms() //@12.000MHz
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
主要的修挂是在函数中添加变量unsigned int xms(其中 unsigned int 为数据类型 xms 为变量名)
然后再延时函数中添加了一个while函数使得1ms的延时函数在执行过程中循环xms次。以此来达到通过改变变量的的大小来修改延时的长度。修改后的延时函数为:
void Delay1ms(unsigned int xms) //@12.000MHz xms为延时长度
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms=xms-1;
}
}