2020-12-07

一起看流星

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
 #define uchar unsigned char
 sbit k1=P3^1;
 sbit k2=P3^0;
 sbit k3=P3^2;
 sbit k4=P3^3;
 sbit shuma=P3^4;
 uchar num=1;
 uchar table[4]={0x50,0x5b,0x4f,0x66};
 uchar a=0,b=0,c=1;
 uchar changdu=5;
 uchar sudu=20;
 uchar flag1=0;
 uchar flag2=0;
 uchar flag3=0;
 uchar weiyi=0;
 uchar huxi=40;
 uchar prew;
 void delay(uchar i);
 void key();
 void init0();
 void init1();
 void xianshi();
 void init0(){	
 TMOD=0x01;
TH0=(65535-25000)/256;
TL0=(65535-25000)%256;
	EA=1;	
	ET0=1;	
	TR0=1;}
	void init1(){	
	TMOD=0x10;
	TH1=(65535-25000)/256;	
	TL1=(65535-25000)%256;	
	EA=1;
	ET1=1;	
	TR1=1;}
	void main(){	
	init0();	
	while (1)	{ 	
	xianshi();	
	}
	}
	void timer0() interrupt 1	{	   
	TH0=(65535-25000)/256;	
   TL0=(65535-25000)%256;		
    a++;		
    if (a==sudu)		{	
   		a=0;		
   	flag3=1;		}	
   	}	
   	void timer1()  interrupt  3	{		
   	 TH0=(65535-25000)/256;	  
   	  TL0=(65535-25000)%256;	
   	  	 b++;	
   	  	 	if (b==huxi/10)		{		
   	  	 		b=0;c++;		
   	  	 		}		
   	  	 	if (c==10)		{	
   	  	 		c=0;		
   	  	 		}	
   	  	 		}
   	  	 		void key(){ 
   	  	 		  if (k1==0){	
   	  	 		  	delay (500);		 
   	  	 		  	if (k1==0)		
   	  	 		  		 num++;	
   	  	 		  	 if (num==6){	 
   	  	 		  	 num=1;	 
   	  	 		  	 P0=table[num];}}	
   	  	 		  	 	 switch (num)		 {		
   	  	 			 case 1:
   	  	 			   if (k2==0){			
   	 						delay(500);			
   	 					 if (k2==0)				
   							changdu++; 			    
   			           while (!k2);}			
   			  		 if (k3==0){				
   					 delay(500);				
   						 if(k3==0)				
   						changdu--;					
   					 while (!k3);}					
   					break;			 
   					case 3:if (k2==0){		
   							delay(500);		
   						 if (k2==0)				
   						 sudu/=2; 				
   					     while(!k2);}				
 			 			 if (k3==0){					
 			 			 delay(500);				
 							 if(k3==0)				
 						sudu*=2 ;					
 						 while (!k3);}				
 								break;		
 				case 4:if (k2==0){			
 					delay(500);				
 				 if (k2==0)				
 				 	 huxi+=20;					
 				 	 	 }							 
 					 if (k3==0){				
 				 delay(500);			
 				 	 if(k3==0)			
						 huxi-=20;			}		
							break;	 
							}
							}
void delay (uchar i){	
uchar j;	
for (j=0;j<i;j++);}
void xianshi(){ 
uchar w,e,l,diyi;	
uchar duan=0xfe;
	while (1){		
	key();		
	diyi=0xff;	
	for (e=0;e<changdu;e++)	{		
	diyi<<=1;	}
	if (flag3==1)	{		
	flag3=0;		
	weiyi++;		
	if (weiyi==changdu)		{
	weiyi=0;		}	
	}	
	P2=diyi;	
	delay(10);	
	w=P2;
	for (e=0;e<(changdu-1);e++)	{	
		if (flag3==0){		
		w=~w;		
		w<<=1;		
		w=w&(~diyi);		
		w=~w;		
		prew=w;			
		if (changdu-weiyi!=changdu)		    prew=_cror_(prew,(changdu-weiyi));			
		if (changdu-weiyi==changdu)		
		prew=w;		
		prew|=diyi;		
		P2=prew;		
		delay(50*e);		
		}	
		}
	delay(50*c);	
			 }	
	}

效果:可以控制灯的长度以及流动的快慢,亮度依次减小,计时器控制其流动,另一个计时器控制灯的呼吸,即全部的灯慢慢变暗,用占空比实现
在这里插入图片描述
在这里插入图片描述
效果如上图所示,一直流动,此时长度为8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值