简易花式流水灯

先看看效果

在这里插入图片描述

具体思路

  实现流水灯的效果其实就是控制相应的I/O口,以P2为例,通过有规律的改变P2各I/O口的状态就可实现相应规律的流水灯效果,这其中需要用到与、或、异或、左移、右移等操作。
  流水灯向左闪烁点亮就是将P2最低位的1不断左移,每次左移其最低位都补0且延时一段时间,所以在初始时P2可赋值0x01
  流水灯向右闪烁点亮就是将P2最高位的1不断右移,每次右移其最高位都补0且延时一段时间,所以在初始时P2可赋值0x80
  流水灯逐个向左点亮是说在初始时,P2赋值为0x01,并将P2整体左移,每移动一次就将最低为置为1且延时一段时间。
  流水灯逐个向右点亮是说在初始时,P2赋值为0x80,并将P2整体右移,每移动一次就将最高为置为1且延时一段时间。
  流水灯两端向内点亮是结合了逐个向左和逐个向右点亮的思想,P2 低4位 逐个向左点亮, 高4位逐个向右点亮。
  流水灯由内向两端熄灭同样是结合了逐个向左和逐个向右点亮的思想,P2 低4位逐个向右熄灭,高4位逐个向左熄灭。
  流水灯以两个灯为主体向左移动点亮其本质也就是一个灯向左移动点亮。

程序

#include <reg51.h>

#define Led	P2

unsigned int time=0;	 //延时时长变量

void InitTimer0(void)	 //10ms
{
    TMOD = 0x01;		 //定时器模式1
	//赋值
    TH0 = 0xDC;
    TL0 = 0x00;
    EA = 1;				 //开总中断
    ET0 = 1;			 //开定时器0中断
}

void delay(unsigned int ms_10)		   //延时函数
{
	 time=ms_10;					   //给time赋予具体延时时间的数值
	 TR0 = 1;						   //打开定时器0
	 while(time);					   //等待延时结束
	 TR0 = 0;						   //关闭定时器0
}

void light_water()					   //流水灯函数
{
	int i=0,Led_H=0,Led_L=0,temp=0x06,num=0;	 //Led_H存储P2高8位Led_L存储P2低8位
	Led=0x01;
	delay(10);//100ms
	for(;i < 7;i++)	  //单个左移
	{
		Led=Led<<1;							 //P2数值左移
		delay(10);//100ms	
	}
	for(i=0;i < 7;i++)	  //单个右移
	{
		Led=Led>>1;							 //P2数值右移
		delay(10);//100ms	
	}
	for(i=0;i < 7;i++)	  //依次向左点亮
	{
		Led=Led<<1|0x01;						 //P2数值左移并将最低位置为1
		delay(10);//100ms	
	}
	for(i=0;i < 7;i++)	  //依次向右点亮
	{
		Led=Led>>1;							 //P2数值右移,依次将位1清零
		delay(10);//100ms	
	}
	Led=0x00;
	for(i=0;i < 7;i++)	  //两端向内依次点亮
	{
		Led_L=Led<<1|0x01&0x0f;				 //取出P2的低4位,并将其左移最低位置1
		Led_H=((Led&0xf0)>>1)^0x80;			 //取出P2的高4位,并将其右移最高位置1
		Led=Led|Led_L;							 //将低4位赋予P2
		Led=Led|Led_H;							 //将高4位赋予P2
		delay(10);//100ms	
	}
	for(i=0;i < 7;i++)	  //由内向两端依次点亮
	{
		Led_L=(Led&0x0f)>>1;					 //取P2低4位并右移
		Led_H=(Led&0xf0)<<1;					 //取P2高4位并左移
		Led=Led&Led_L;							 //将低4位赋予P2
		Led=Led^Led_H;							 //将高4位赋予P2
		delay(10);//100ms	
	}
	Led=0x00;
	for(i=0;i < 10;i++)	  //依次向左点亮2个灯
	{
		num=Led<<1|0x01;						 //P2数值左移并最低位置1
		if(num>=0x06)						 //第2、3个灯亮后,以2个灯为主体向左移动
		{
			Led=num&temp;
			temp=temp<<1;	
		}
		else 
			Led=num;
		delay(7);//100ms	
	}
	Led=0x00;
	temp=0xc0;
	for(i=0;i < 10;i++)	  //依次向右点亮2个灯
	{
		num=Led>>1|0x80;						//将P2数值右移并最高位置1
		if(num>=temp)					    	//第6、7个灯亮时以两个灯为整体向右移动
		{
			Led=num&temp;
			temp=temp>>1;
		}
		else
			Led=num;
		delay(7);//100ms	
	}
}

void main(void)
{
    InitTimer0();			 //定时器初始化
	while(1)
	{
		light_water();
	}
}

void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0xDC;
    TL0 = 0x00;
	time--;
	if(time < 0)
	{
		time = 0;			  //time为0时不在减
	}
}

花样最多 8 灯流水灯代码 #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include /******************************************************************/ /* 花样表格 */ /******************************************************************/ unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt)//简易延时 { while(--cnt); } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { unsigned char i; while(1) { P2=0xFE; //第一个LED亮 for(i=0;i<8;i++) { delay(10000); P2 <<=1; } P2=0x7F; //第七个LED亮 for(i=0;i>=1; } P2=0xFE; //第一个LED亮 for(i=0;i<8;i++) { delay(10000); P2 <<=1; P2 |=0x01; } P2=0x7F; //第七个LED亮 for(i=0;i>=1; P2 |=0x80; } /*下面通过查表方法获得花样参数*/ for(i=0;i<16;i++)//查表可以简单的显示各种花样 实用性更强 { delay(20000); P2=seg[i]; } } } 补充: 再给你一个流星雨灯,这个程序有点暴力。。。 #include #include #define uint unsigned int void delay(uint n) { while(n--); } main() { mmm:P1=0xfe; delay(15000); while(1) { P1=P1<<1; delay(15000); if(P1==0x00) {P1=0x01;delay(15000);goto mm;} } mm: while(1) { P1=_crol_(P1,1)+1; delay(15000); if(P1==0xff) {delay(15000);goto mmm;} } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值