本帖最后由 Howard16 于 2016-3-17 18:46 编辑
l 支持芯片系列: M451 series l 所使用的开发软件包: M451SeriesBSP_v3.01.001 l Project 所在的目录. \M451SeriesBSP_v3.01.001_RGBLED\SampleCode\NuEdu\ l Project Name: Smpl_Basic01_RGBLED l 所使用的板子:NuEdu-SDK-M451 用Timer控制I/O显示LED的各种表现方式,包括RGB调光、闪烁以及常见的呼吸灯,通常调光都是用PWM设定duty的方式,但是当LED数量比PWM还多的时候,就轮到Timer出场了,只需要一组Timer定时去处理I/O状态即可。 程序中有五个参数可以设定,LED1_R, LED1_G, LED1_B这三个是设定RGB的亮度,输入值可为0~100对应0~100%的亮度,Blink参数是闪烁设定,输入值可为0~10,定义是1秒钟切成10份,设定要亮多久,例如:Blink=5,那就是亮0.5秒,灭0.5秒,来做闪烁功能,最后是brea参数,输入值为0或1,设定为1则将呼吸灯功能打开。
详细如何控制可以看Timer interrupt中的程序代码,有需要也可以增加I/O数量控制更多LED。
void TMR1_IRQHandler(void)
{
if(TIMER_GetIntFlag(TIMER1) == 1)
{
uint32_t LED_duty,RLED,BLED,GLED,LED_brea;
/* Clear Timer1 time-out interrupt flag */
TIMER_ClearIntFlag(TIMER1);
LED_cnt++;
LED_duty=LED_cnt%100;
if ((brea==1)&&((brea_cnt%2)==0))
LED_brea=100-(LED_cnt/100);
else if (brea==1)
LED_brea=LED_cnt/100;
else
LED_brea=0;
RLED=((int32_t)(LED1_R-LED_duty-LED_brea)>0)?1:0;
BLED=((int32_t)(LED1_B-LED_duty-LED_brea)>0)?1:0;
GLED=((int32_t)(LED1_G-LED_duty-LED_brea)>0)?1:0;
if (LED_cnt>=(Blink*1000))
{
RLED=0;
BLED=0;
GLED=0;
}
PC->DOUT = (PC->DOUT|BIT9|BIT10|BIT11)&(~((RLED<<9)|(GLED<<10)|(BLED<<11)));
if (LED_cnt==10000)
{
LED_cnt=0;
brea_cnt++;
}
}
}
M451SeriesBSP_v3.01.001_RGBLED.rar
(753.69 KB)
|