流水灯作为LED点亮的进阶类实验,在编程难度上稍微提升了一点点,但只要琢磨一下还是非常容易搞懂的,直接上程序。
方法一:最简单易懂的流水灯了,缺点是过于冗长
#include<reg52.h>
#define uint unsigned int
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
void delay(uint i)
{
while(i--);
}
void main()
{
while(1)
{
LED1=0;
delay(50000);
LED1=1;
delay(50000);
LED2=0;
delay(50000);
LED2=1;
delay(50000);
LED3=0;
delay(50000);
LED3=1;
delay(50000);
LED4=0;
delay(50000);
LED4=1;
delay(50000);
LED5=0;
delay(50000);
LED5=1;
delay(50000);
LED6=0;
delay(50000);
LED6=1;
delay(50000);
LED7=0;
delay(50000);
LED7=1;
delay(50000);
LED8=0;
delay(50000);
LED8=1;
delay(50000);
}
}
方法二:利用库函数来实现流水灯效果
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint i)
{
while(i--);
}
void main()
{
uchar i;
i=0xFE;
while(1)
{
P2=i;
i=_crol_(i,1);
delay(50000);
}
}
方法三:通过移位来完成流水灯,个人认为比方法二稍微难懂一些
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint i)
{
while(i--);
}
void main()
{
while(1)
{
uchar a,i;
a=0xfe;
for(i=0;i<8;i++)
{
P2=a;
a<<=1;
a|=0X01;
delay(50000);
}
}
}
方法四:利用数组的方式来完成
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint i)
{
while(i--);
}
void main()
{
while(1)
{
uchar i;
for(i=0;i<8;i++)
{
P2=led[i];
delay(50000);
}
}
}