流星灯(呼吸灯带拖尾)

#include <REGX52.H>
#include <INTRINS.H>
#include <stdlib.h>                 //产生随机函数用的
#define LED P2
unsigned char D1=0xFE,D2=0xFD,D3=0xFB,D4=0xF7,D5=0xEF,D6=0xDF,D7=0xBF,D8=0x7F;
unsigned char KeyNum=0;
char Compare=0,Count3,A=0,x;
void Key()
{	
	if(P3_1==0)KeyNum=1;
	if(P3_0==0)KeyNum=2;
	if(P3_2==0)KeyNum=3;
	if(P3_3==0)KeyNum=4;

}
void Timer0_Init()
{
	TMOD &=0xF0;
	TMOD |=0x01;
	TL0=0xA4;		
	TH0=0xFF;		
	TF0=0;			
	TR0=1;			
	ET0=1;			
	EA=1;			
	PT0=0;			
}
void main(void)
{
	Timer0_Init();//定时器初始化
	while(1);
}
void Timer0_Routine() interrupt 1  						//0.1ms执行一次	
{	
	static unsigned int Count,t;
	TL0 = 0xA4;		//设置定时初始值
	TH0 = 0xFF;		//设置定时初值
	Count++;
	Count3=Count;	
	t++;
	Key();
	Count%=101;											//固定Count属于0-100
	if(t>=800)											
	 {	
		if(KeyNum==1){                                  //流星灯右移功能
		t=0; 											//80ms循环左移一次
		D1=_crol_(D1,1);
		D2=_crol_(D2,1);
		D3=_crol_(D3,1);
		D4=_crol_(D4,1); 
		D5=_crol_(D5,1); 
		D6=_crol_(D6,1);
		D7=_crol_(D7,1);
		D8=_crol_(D8,1);			
		}
		if(KeyNum==2){									//流星灯左移功能
		t=0;											//80ms循环右移一次
		D1=_cror_(D1,1);
		D2=_cror_(D2,1);
		D3=_cror_(D3,1);
		D4=_cror_(D4,1); 
		D5=_cror_(D5,1); 
		D6=_cror_(D6,1); 
		D7=_cror_(D7,1); 
		D8=_cror_(D8,1); 
		}
		if(KeyNum==3){                                  //加载条功能
		if(Count%100==0){Compare-=1;}					//从最亮到最暗
		if(Compare<=0)
		{
		Compare=100;
		A%=8;
		x|=(0x01<<A);                               	//不断往左移动
		A++;
		}
		}
		if(KeyNum==4){                                  //打地鼠??功能
		if(Count%50==0){Compare-=1;}
		if(Compare<=0)
		{
		Compare=100;
		A=rand()%8;                                     //随机亮灯
		x=(0x01<<A);
		}
		}
	 }                          //通过与和或的运算,让每个I/O口输出不同的pwm,而且不干扰其他I/O口的pwm输出
	if(KeyNum==1){
	if(Count<0)LED&=D1;			//与等于D1复位一位,不影响其他7位  
	else LED|=~D1;				//或等于D1置位一位,不影响其他7位
	if(Count<0)LED&=D2;			
	else LED|=~D2;
	if(Count<=3)LED&=D3;
	else LED|=~D3;
	if(Count<=7)LED&=D4;		//拿15举例,因为他是一遍一遍扫下去的如果小于设定值则是暗大于则是亮
	else LED|=~D4;				//与等于可以保存上面的情况并且控制当前亮的频率(因为1&0=0),或等于取反控制暗(因为0|~0=1)频率
	if(Count<=14)LED&=D5; 		//因为初始赋值就是11110111(与上)上一次的值只会改变当前位数上的值
	else LED|=~D5;
	if(Count<=25)LED&=D6;
	else LED|=~D6;
	if(Count<=79)LED&=D7;		
	else LED|=~D7;
	if(Count<=100)LED&=D8;      
	else LED|=~D8;
	}
	if(KeyNum==2){
	if(Count<0)LED&=D8;		
	else LED|=~D6;				
	if(Count<0)LED&=D7;
	else LED|=~D7;
	if(Count<=3)LED&=D6;
	else LED|=~D6;
	if(Count<=7)LED&=D5;
	else LED|=~D5;
	if(Count<=14)LED&=D4;
	else LED|=~D4;
	if(Count<=56)LED&=D3;
	else LED|=~D3;
	if(Count<=79)LED&=D2;
	else LED|=~D2;
	if(Count<=100)LED&=D1;
	else LED|=~D1;
	}
	if(KeyNum==3){
		if(Count3<Compare){                         //呼吸灯基本原理
		P2=~x;
		}
		else				
		{
		P2=~0x00;
		}
	}
	if(KeyNum==4){                                 //这个也是
		if(Count3<Compare){
		P2=~x;
		}
		else				
		{
		P2=~0x00;
		}
}
}

按键1流星灯向左移动

按键2流星灯向右移动

按键3加载条呼吸灯

按键4随机闪烁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值