LED跑马灯编程实现

可以参考下这个

#include <reg52.h>

#define LED1 P0
#define LED2 P2

#define PWM_Module_Num 16
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit KEY4 = P3^5;

unsigned int LED_Temp[PWM_Module_Num]={	0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
										0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};

unsigned char Flow_Mode;
void Delay(unsigned int Num)
{
	unsigned int i,j;
	for(i=0;i<Num;i++)
		for(j=0;j<110;j++)
	;
}

void Time0_Mode1(void)
{
	TMOD=0x01;  //设置T0为工作方式0  
	TH0=(65535-50000)/256;     //5000us延时  
	TL0=(65535-50000)%256;     
	/*Timer0工作在模式0下时为13位定时/计数器, 
	TL0只使用前5位,故对32进行求余/模    */  

	EA=1;       //开总中断  
	ET0=1;      //开定时器0中断  
	TR0=1;      //启动定时器0  
}

void KEY_Scan(void)
{
	if(KEY1 == 0)
	{
		Delay(1);
		if(KEY1 ==0)
		{
			Flow_Mode = 1;
			while(!KEY1);
		}
	}
	if(KEY2 == 0)
	{
		Delay(1);
		if(KEY2 ==0)
		{
			Flow_Mode = 2;
			while(!KEY2);
		}
	}
	if(KEY3 == 0)
	{
		Delay(1);
		if(KEY3 ==0)
		{
			Flow_Mode = 3;
			while(!KEY3);
		}
	}
	if(KEY4 == 0)
	{
		Delay(1);
		if(KEY4 ==0)
		{
			Flow_Mode = 4;
			while(!KEY4);
		}
	}	
}
void main()
{
	unsigned int LED;
	Time0_Mode1();
	while(1)
	{
		KEY_Scan();
	}
}
unsigned char i=0;
unsigned char Old_Mode;

void Timer0()interrupt 1  
{  
	TH0=(65535-50000)/256;     //5000us延时  
	TL0=(65535-50000)%256; 	
	
	switch(Flow_Mode)
	{
		case 1:
			i++;
			if(i==PWM_Module_Num)
				i=0;
			Old_Mode = Flow_Mode;
			LED1 = ~LED_Temp[i]/256;
			LED2 = ~LED_Temp[i]%256;			

		break;
		
		case 2:
			i--;
			LED1 = ~LED_Temp[i]/256;
			LED2 = ~LED_Temp[i]%256;
			if(i==0)
				i=PWM_Module_Num-1;
			Old_Mode = Flow_Mode;
			
	
		break;

		case 3:
			P2 = 0x0f;
			i=0;
		break;	
		
		case 4:
			Flow_Mode = Old_Mode;
			P2 = 0xf0;
		break;
		
		default:
			Flow_Mode = 1;
		break;
	}
}  

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632