该函数是一个呼吸灯效果的实现函数。其中,dE_CP_count_down_bright_up_dark() 函数用于控制 PWM 输出的逐渐增大和逐渐减小。当呼吸计数器 breath_time_counter 小于等于 dE_CP_PWM_value * 4 时,PWM 输出逐渐增大;当呼吸计数器大于 dE_CP_PWM_value * 4 时,PWM 输出逐渐减小。

为了控制呼吸灯的速度,程序中使用了一个计数器 dE_breath_time_counter。当 dE_breath_time_counter 小于 i 时,每隔一段时间就会执行一次呼吸灯效果。当 dE_breath_time_counter 等于 i 时,进行一次呼吸灯效果的切换。

在呼吸灯效果的切换中,根据 dE 的值选择不同的呼吸灯效果。当 dE 等于 0 时,呼吸计数器 breath_time_counter 向上计数,到达 1100 之后向下计数;当 dE 等于 1 时,呼吸计数器 breath_time_counter 向下计数,到达 0 之后向上计数。根据呼吸计数器 breath_time_counter 的变化,调用 dE_CP_count_down_bright_up_dark() 函数控制 PWM 输出的逐渐增大和逐渐减小。

函数 Pwm_Out_Update() 用于更新 PWM 输出的值。根据 state 的值选择不同的 PWM 输出通道,将 pwm_value 的高 8 位和低 8 位分别写入 PWM 寄存器中,并触发 PWM 输出。

void dE_CP_count_dowm_bright_up_dark(u8 dE_CP_PWM_value,u8 Light_num)  //dE 模式,向下计数亮,向上暗
{


	
	
		if(breath_time_counter>=(dE_CP_PWM_value*4))// 计数器向下计数的时候  渐明 向上计数的时候   渐暗
				Pwm_Out_Update(Light_num,0X00);
			else
				Pwm_Out_Update(Light_num, dE_CP_PWM_value*4  - breath_time_counter);//下降计数渐明

	

}

void dExx_CPxx_timer1_function(u16 i)///// i = 203- 2 * mode3_4_5;
{
	if(dE_breath_time_counter < i)//呼吸灯一呼一吸分为200格,每改变一格的时间1-xms
		 dE_breath_time_counter++;
	else//呼吸灯每改变一格的时间
	{	
		 dE_breath_time_counter = 1;
		
		switch(dE)//呼吸来回切换
		{
			case 0:	 //dE == 0 	breath_time_counter向上计数,到达440之后向下计数			
				 if(breath_time_counter < 1100)// && breath_time_counter >9)//10-500
					{
						breath_time_counter++;//呼吸每一格					
						if(breath_time_counter == 1100)
						{
							 dE = 1;
							if(dE_color<8)
								 dE_color++;
							else
								 dE_color = 1;
						}
						else{}
					}
					else
					{
					  dE = 1;
					}
					
			break;
							
			case 1: //dE == 1 	breath_time_counter向下计数,到达10之后向上计数
				 if(breath_time_counter > 0)//11-500 breath_time_counter >10 && 
					{
						breath_time_counter--;//呼吸每一格					
						if(breath_time_counter ==0)
						{
							 dE = 0;
							if(dE_color<8)
								 dE_color++;
							else
								 dE_color = 1;	
						}
						else{}
					}
					else
					{
						 dE = 0;
					}					
			break;
			default: display_ErrO();//错误
		}
	}
}

void Pwm_Out_Update(u8 state,u16 pwm_value) //state PWM_Num1-6 RGBWAU   pwm_value PWM数值 0-512
{
  
	switch(state)
	{
		case 1: // R
			
		PWM3H = (pwm_value>>8)&0xff;					
		  PWM3L = (pwm_value>>0)&0xff;
		break;
		case 2: // G
		set_SFRPAGE;
		PWM4H = (pwm_value>>8)&0xff;					
		  PWM4L = (pwm_value>>0)&0xff;
		clr_SFRPAGE;
		break;
		case 3: // B
		PWM2H = (pwm_value>>8)&0xff;					
		  PWM2L = (pwm_value>>0)&0xff;
		break;
		case 4: // W
		PWM1H = (pwm_value>>8)&0xff;					
		  PWM1L = (pwm_value>>0)&0xff;
		break;
		default:break;
	}

	set_LOAD;	
}
呼吸灯效果实现函数分析:PWM 输出逐渐增大和减小

原文地址: https://www.cveoy.top/t/topic/oEzm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录