流水灯个性化点亮


流水灯个性化点亮

实现发光二极管先由上往下、再由下往上、奇数、偶数循环点亮的流水灯

(ps:软件操作、烧录等参考博客之流水灯)

一、Proteus电路图

?

二、Keil代码

1、用数组实现

#include 
#define uchar unsigned char
  uchar tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfb,0xef,0xbf,0xfd,0xf7,0xdf,0x7f};//前八个数据为左移点亮数据、后八个为右移点亮数据、再后面四个数是奇数左移、最后四个数是偶数左移

	void delay ()    //延时函数
	{
		uchar i,j;
		for(i=0;i<255;++i)
		for(j=0;j<255;++j);			
	}
	
	void main()       //主函数
	{
		uchar i;
		while(1)
		{
			for(i=0;i<24;++i)
			{
				P1=tab[i];    //向P1口送出点亮数据
				delay();
			}
		}
	}

2、用移位运算符实现

#include 
#define uchar unsigned char
	
	void delay ()     //延时函数
	{
		uchar i,j;
		for(i=0;i<255;++i)
		for(j=0;j<255;++j);			
	}
	
	void main()
	{
	   uchar i,temp;
		
		while(1)
		{
			temp=0x01;  //左移初值(第一个发光二极管)赋给temp
			for(i=0;i<8;++i)
			{
				P1=~temp; //temp中的数据取反后送P1口
				delay();
				temp=temp<<1;  //temp中数据左移一位
			}
			
			temp=0x80;  //右移初值(第八个发光二极管)赋给temp
			for(i=0;i<8;++i)
			{
				P1=~temp;  //temp中的数据取反后送P1口
				delay();
				temp=temp>>1;  //temp中数据右移一位
			}
			
			temp=0x01;  //左移初值(第一个发光二极管)赋给temp
			for(i=0;i<8;++i)
			{
				P1=~temp;  //temp中的数据取反后送P1口
				delay();
				temp=temp<<2;  //temp中数据左移两位
			}
			
			temp=0x02;   //右移初值(第二个发光二极管)赋给temp
			for(i=0;i<8;++i)
			{
				P1=~temp;
				delay();
				temp=temp<<2; //temp中数据右移两位
			}
			
		}
			
	}

3、用移位函数实现

#include 
#include    //包含左、右移位函数的头文件
#define uchar unsigned char
	
	void delay ()
	{
		uchar i,j;
		for(i=0;i<255;++i)
		for(j=0;j<255;++j);			
	}
	
	void main()
	{
	   uchar i,temp;
		
		while(1)
		{
			temp=0xfe;  //初值为11111110
			for(i=0;i<7;++i)
			{
				P1=temp;   //temp中的点亮数据送P1口
				delay();
				temp=_crol_(temp,1); //执行循环左移函数,temp中的数据左移一位
			}
			
			for(i=0;i<7;++i)
			{
				P1=temp; //temp中的数据送P1口输出
				delay();
				temp=_cror_(temp,1);  //执行循环右移函数,temp中的数据右移一位
			}
			
			for(i=0;i<4;++i)
			{
				P1=temp;
				delay();
				temp=_crol_(temp,2);  //temp中的数据左移两位
			}
			
			temp=0xfd;   //赋值为第二个发光二极管
			for(i=0;i<4;++i)
			{
				P1=temp;
				delay();
				temp=_crol_(temp,2); //temp中的数据左移两位
			}
					
		}
			
	}

三、效果展示

四、感言

对于for循环的结束条件,如果没有控制对,发光情况会错乱或者某一规律的没有显示完。第二种方法,在奇数发光后,右移两位实现偶数发光时,间隔较长,不知道为什么。