首先我们需要使用硬件定时器来实现类似软件PWM,开一个定时器,运行如下代码来达到我们想要的目的,之后我们只需要依次改变r_duty、g_duty、b_duty 占空比就可以实现想要的效果。
if(r_duty == 0)
{
BSP_LED_Off(LEDR);
}
else if(r_duty == 255)
{
BSP_LED_On(LEDR);
}
else
{
if(now_duty < r_duty)
{
BSP_LED_On(LEDR);
}
else
{
BSP_LED_Off(LEDR);
}
}
if(g_duty == 0)
{
BSP_LED_Off(LEDG);
}
else if(g_duty == 255)
{
BSP_LED_On(LEDG);
}
else
{
if(now_duty < g_duty)
{
BSP_LED_On(LEDG);
}
else
{
BSP_LED_Off(LEDG);
}
}
if(b_duty == 0)
{
BSP_LED_Off(LEDB);
}
else if(b_duty == 255)
{
BSP_LED_On(LEDB);
}
else
{
if(now_duty < b_duty)
{
BSP_LED_On(LEDB);
}
else
{
BSP_LED_Off(LEDB);
}
}
}
now_duty ++;
七彩渐变效果实现,本例七彩渐变灯,前面还有红、绿、蓝、黄、紫、青、白七种单色灯,且七彩以这七种颜色实现,单色灯只需要给定初始占空比即可实现,本例不讨论,故now_rgb从8开始。以下代码仅供学习参考使用。
if(now_rgb == 8)//七彩灯模式
{
if(now_duty == 255)
{
switch(now_Seven_and_SOS_Step)
{
case 0 :
if(now_seven_and_SOS_Cnt == 0)
{
if(r_duty == 255)
{
now_seven_and_SOS_Cnt = 1;
}
else
r_duty ++;
}
else
{
if(r_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
r_duty --;
}
break;
case 1 :
if(now_seven_and_SOS_Cnt == 0)
{
if(g_duty == 255)
{
now_seven_and_SOS_Cnt = 1;
}
else
g_duty ++;
}
else
{
if(g_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
g_duty --;
}
break;
case 2 :
if(now_seven_and_SOS_Cnt == 0)
{
if(b_duty == 255)
{
now_seven_and_SOS_Cnt = 1;
}
else
b_duty ++;
}
else
{
if(b_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
b_duty --;
}
break;
case 3 :
if(now_seven_and_SOS_Cnt == 0)
{
if(g_duty == 255)
{
now_seven_and_SOS_Cnt = 1;
}
else
{
r_duty ++;
g_duty ++;
}
}
else
{
if(g_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
{
r_duty --;
g_duty --;
}
}
break;
case 4 :
if(now_seven_and_SOS_Cnt == 0)
{
if(r_duty == 128)
{
now_seven_and_SOS_Cnt = 2;
}
else
{
now_seven_and_SOS_Cnt = 1;
}
}
else if(now_seven_and_SOS_Cnt == 1)
{
r_duty ++;
b_duty ++;
now_seven_and_SOS_Cnt = 0;
}
else if(now_seven_and_SOS_Cnt == 2)
{
if(r_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
{
now_seven_and_SOS_Cnt = 3;
}
}
else if(now_seven_and_SOS_Cnt == 3)
{
r_duty --;
b_duty --;
now_seven_and_SOS_Cnt = 2;
}
break;
case 5 :
if(now_seven_and_SOS_Cnt == 0)
{
if(b_duty == 128)
{
now_seven_and_SOS_Cnt = 2;
}
else
{
now_seven_and_SOS_Cnt = 1;
}
}
else if(now_seven_and_SOS_Cnt == 1)
{
g_duty ++;
b_duty ++;
now_seven_and_SOS_Cnt = 0;
}
else if(now_seven_and_SOS_Cnt == 2)
{
if(b_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step ++;
}
else
{
now_seven_and_SOS_Cnt = 3;
}
}
else if(now_seven_and_SOS_Cnt == 3)
{
g_duty --;
b_duty --;
now_seven_and_SOS_Cnt = 2;
}
break;
case 6 :
if(now_seven_and_SOS_Cnt == 0)
{
if(g_duty == 255)
{
now_seven_and_SOS_Cnt = 1;
}
else
{
r_duty ++;
g_duty ++;
b_duty ++;
}
}
else
{
if(g_duty == 0)
{
now_seven_and_SOS_Cnt = 0;
now_Seven_and_SOS_Step = 0;
}
else
{
r_duty --;
g_duty --;
b_duty --;
}
}
break;
}
}
}
SOS功能实现 红灯快闪3下,然后慢闪3下,再快闪3下,接着停顿8s,再继续上述循环闪烁,(快闪1s三下,慢闪2s一下)
else if(now_rgb == 9)//SOS模式
{
if(now_duty == 255)
{
switch(now_Seven_and_SOS_Step)
{
case 0 :
case 1 :
case 2 :
if(now_seven_and_SOS_Cnt < 30)
{
r_duty = 255;
g_duty = 0;
b_duty = 0;
}
else if(now_seven_and_SOS_Cnt < 60)
{
r_duty = 0;
}
else
{
now_Seven_and_SOS_Step ++;
now_seven_and_SOS_Cnt = 255;
}
now_seven_and_SOS_Cnt ++;
break;
case 3 :
case 4 :
case 5 :
if(now_seven_and_SOS_Cnt < 180)
{
r_duty = 255;
g_duty = 0;
b_duty = 0;
}
else if(now_seven_and_SOS_Cnt < 240)
{
r_duty = 0;
}
else
{
now_Seven_and_SOS_Step ++;
now_seven_and_SOS_Cnt = 255;
}
now_seven_and_SOS_Cnt ++;
break;
case 6 :
case 7 :
case 8 :
if(now_seven_and_SOS_Cnt < 30)
{
r_duty = 255;
g_duty = 0;
b_duty = 0;
}
else if(now_seven_and_SOS_Cnt < 60)
{
r_duty = 0;
}
else
{
now_Seven_and_SOS_Step ++;
now_seven_and_SOS_Cnt = 255;
}
now_seven_and_SOS_Cnt ++;
break;
case 9 :
case 10 :
case 11 :
case 12 :
case 13 :
case 14 :
if(now_seven_and_SOS_Cnt >= 240)
{
if(now_Seven_and_SOS_Step == 14)
now_Seven_and_SOS_Step = 0;
else
now_Seven_and_SOS_Step ++;
now_seven_and_SOS_Cnt = 255;
}
now_seven_and_SOS_Cnt ++;
break;
}
}
}
以上代码都是利用上述rgb占空比所用定时器时基now_duty实现,具体时间可以适时调整。