簡單LED燈管理

LED燈的設置較爲簡單,整合起來管理,讓應用更加方便。(以下代碼爲本人朋友設計思路,僅供參考)

#define LEDn		2
#define LED_TIMEBASE	10	

#define LED_MODE_OFF	0x00
#define LED_MODE_ON	0x01
#define LED_MODE_FLASH	0x02

#define LED_IDLE	0x00
#define LED_BUSY	0x01

typedef struct {
 uint8_t   mode;		/* led燈工作模式 */
 uint8_t   isBusy;		/* 忙碌狀態 */
 uint16_t  onTime;		/* 亮燈時間,單位:ms*/
 uint16_t  offTime;		/* 滅燈時間,單位:ms */
 uint32_t  tick;		/* 時間計數 */
 uint8_t   enableDuration; 	/* 使能持續週期 */
 uint32_t  duration;		/* 持續週期 */
}led_info_t;
static led_info_t ledtbl[LEDn];

void bsp_led_set_mode(LEDn_TypeDef_t led, int mode, uint32_t onTime, uint32_t offTime, uint32_t cycle)
{
  if (led >= LEDn) return;
  
  switch (mode) {
	case LED_MODE_OFF:
	  ledtbl[led].isBusy = LED_IDLE;
	  if (ledtbl[led].mode != mode) {
	 	bsp_led_off(led);
   		ledtbl[led].mode = mode;
	  }
	 break;
	case LED_MODE_ON:
	  ledtbl[led].isBusy = LED_BUSY;
	  if (ledtbl[led].mode != mode) {
		bsp_led_on(led);
   		ledtbl[led].mode = mode;
	  }
	 break;
	case LED_MODE_FLASH:
	  ledtbl[led].isBusy = LED_BUSY;
	  ledtbl[led].offTime = offTime;
	  ledtbl[led].onTime = onTime;
	  if (ledtbl[led].mode != mode)
	  	ledtbl[led].tick = 0;
	  ledtbl[led].mode = mode;
	  ledtbl[led].duration = cycle * (offTime + onTime);
	  ledtbl[led].enableDuration = ledtbl[led].duration > 0 ? 1 : 0;
	  break;
	default :
	   break;
  }
}

void bsp_led_tick_handler(void)
{
    int i;
    for (i = 0; i < LEDn; i++) {
	if (ledtbl[i].isBusy == LED_IDLE) continue;
	if (ledtbl[i].mode == LED_MODE_FLASH) {
	    ledtbl[i].tick += LED_TIMERBASERS;
	    ledtbl[i].tick %= (ledtbl[i].onTime + ledtbl[i].offTime);
	    if ((ledtbl[i].tick <= ledtbl[i].onTime) && (ledtbl[i].tick > 0)) 
	        bsp_led_on((LEDn_TypeDef_t)i);
	    else 
	        bsp_led_off((LEDn_TypeDef_t)i);   
	    if (ledtbl[i].enableDuration == 0) continue;
	    if (ledtbl[i].duration > LED_TIMERBASERS) {
	        ledtbl[i].duration -= LED_TIMERBASERS;
	    } else if (ledtbl[i].duration > 0) {
	        ledtbl[i].tick = 0;
		ledtbl[i].duration = 0;
		ledtbl[i].isBusy = LED_IDLE;
		bsp_led_off((LEDn_TypeDef_t)i);
		ledtbl[i].mode = LED_MODE_OFF;
	    }
	}
    }
}
	
	```
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章