可調亮度值RGB燈光控制代碼架構賞析

#define  DKLEDR_ctl(a)   if(a)\
												 GPIO_SetBits(DKLEDR_GPIO_TYPE,DKLEDR_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(DKLEDR_GPIO_TYPE,DKLEDR_GPIO_PIN)
#define  DKLEDG_ctl(a)   if(a)\
												 GPIO_SetBits(DKLEDG_GPIO_TYPE,DKLEDG_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(DKLEDG_GPIO_TYPE,DKLEDG_GPIO_PIN)
#define  DKLEDB_ctl(a)   if(a)\
												 GPIO_SetBits(DKLEDB_GPIO_TYPE,DKLEDB_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(DKLEDB_GPIO_TYPE,DKLEDB_GPIO_PIN)										 

#define  ZWLEDR_ctl(a)   if(a)\
												 GPIO_SetBits(ZWLEDR_GPIO_TYPE,ZWLEDR_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(ZWLEDR_GPIO_TYPE,ZWLEDR_GPIO_PIN)
#define  ZWLEDG_ctl(a)   if(a)\
												 GPIO_SetBits(ZWLEDG_GPIO_TYPE,ZWLEDG_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(ZWLEDG_GPIO_TYPE,ZWLEDG_GPIO_PIN)
#define  ZWLEDB_ctl(a)   if(a)\
												 GPIO_SetBits(ZWLEDB_GPIO_TYPE,ZWLEDB_GPIO_PIN);\
												 else	\
												 GPIO_ResetBits(ZWLEDB_GPIO_TYPE,ZWLEDB_GPIO_PIN)

#define  LED2S       1000 
#define  LED1S       500 
#define  LED05S      250 
typedef enum  _LED_Flash_Mode{
	LED_Flash_Stop=0x00,
	LED_Flash_Slow=0x01,          //1s
	LED_Flash_Quick=0x02          //0.5s
}LED_FLASH_Mode;

typedef enum _LED_WORK_Mode{
  LED_Work_OFF=0x00,
	LED_Work_ON=0x01,
}LED_WORK_Mode;

//優化
typedef struct _LED_STATE{
	u8             LEDR_NUM;          //R亮度值
	u8             LEDG_NUM;          //G亮度值
	u8             LEDB_NUM;          //B亮度值
	
	u8             LEDR_Light_TMR;    //R亮度計數值
	u8             LEDG_Light_TMR;    //G亮度計數值
	u8             LEDB_Light_TMR;    //B亮度計數值
	u8 			   Color_Num;         //燈有幾種顏色	
	
	u32            LED_Flash_TMR;     //閃爍計數值 	需要在定時器裏面自增
	u32            LED_Flash_DSTMR;   //閃爍計數值		05S 1S 總值 邊界值
	//LED_TYPE          LED_Type;    		//燈類型	
	LED_FLASH_Mode    Flash_Mode;  			//閃爍速度
	LED_WORK_Mode     Work_Mode;   			//工作狀態	對應通信協議總開關
	
	void           (*LEDR)(u8 data);		//在初始化部分指向對應函數地址 指針函數
	void           (*LEDG)(u8 data);
	void           (*LEDB)(u8 data);
	void           (*LEDRGB)(u8 data);	//在初始化部分指向對應函數地址
	
}LED_STATE;	//定時器內部控制燈光使用

LED_STATE  DKLED_State;	//讀卡LED
LED_STATE  TMLED_State;	//條碼LED

void LED_Init(void)
{
	//GPIO初始化
	//讀卡LED
	DKLED_State.Flash_Mode=LED_Flash_Stop;
	DKLED_State.Work_Mode=LED_Work_ON;//LED_Work_OFF;
	DKLED_State.Color_Num = 0x03;
	DKLED_State.LEDR = DKLED_R;	//使函數指針指向對應函數地址
	DKLED_State.LEDG = DKLED_G;
	DKLED_State.LEDB = DKLED_B;
	DKLED_State.LEDRGB = DKLED_RGB;	//使函數指針指向對應函數地址
	DKLED_State.LEDR_NUM=0xff;//0xff;//表示默認打開紅燈
	DKLED_State.LEDG_NUM=0xff; 
	DKLED_State.LEDB_NUM=0xff;
	Dev_Work_State[Dev_List.DKLED_RSta]=Dev_Work_ON;	//新增 設備狀態初始化
	Dev_Work_State[Dev_List.DKLED_GSta]=Dev_Work_ON;	
	Dev_Work_State[Dev_List.DKLED_BSta]=Dev_Work_ON;	
	
	//條碼LED
	TMLED_State.Flash_Mode=LED_Flash_Stop;
	TMLED_State.Work_Mode=LED_Work_ON;//LED_Work_OFF;
	TMLED_State.Color_Num = 0x03;
	TMLED_State.LEDR = TMLED_R;
	TMLED_State.LEDG = TMLED_G;
	TMLED_State.LEDB = TMLED_B;
	TMLED_State.LEDRGB = TMLED_RGB;	//使函數指針指向對應函數地址
	TMLED_State.LEDR_NUM=0xff;
	TMLED_State.LEDG_NUM=0xff; 
	TMLED_State.LEDB_NUM=0xff;
	Dev_Work_State[Dev_List.TMLED_RSta]=Dev_Work_ON;	//新增	設備狀態初始化
	Dev_Work_State[Dev_List.TMLED_GSta]=Dev_Work_ON;	
	Dev_Work_State[Dev_List.TMLED_BSta]=Dev_Work_ON;	
}

//條碼LED
void TMLED_RGB(u8 on_off)
{
 TMLEDR_ctl(on_off);
 TMLEDG_ctl(on_off);
 TMLEDB_ctl(on_off);
}
void TMLED_R(u8 on_off)
{
   TMLEDR_ctl(on_off);
}
void TMLED_G(u8 on_off)
{
   TMLEDG_ctl(on_off);
}
void TMLED_B(u8 on_off)
{
   TMLEDB_ctl(on_off);
}

//讀卡LED
void DKLED_RGB(u8 on_off)
{
	DKLEDR_ctl(on_off);
	DKLEDG_ctl(on_off);
	DKLEDB_ctl(on_off);
}

void DKLED_R(u8 on_off)
{
   DKLEDR_ctl(on_off);
}
void DKLED_G(u8 on_off)
{
   DKLEDG_ctl(on_off);
}
void DKLED_B(u8 on_off)
{
   DKLEDB_ctl(on_off);
}

void TIM5_IRQHandler(void)   	//50us定時器
{
	if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷髮生與否
	{
		TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIMx更新中斷標誌 
		
		SCAN_LED();	//燈光切換總函數
		
	}
}

//燈光切換總函數,在定時器輪詢處理 燈光設備比較多的時候可以分別在多個定時器
void SCAN_LED(void)
{
	Deal_LedSta(&TMLED_State);
	Deal_LedSta(&DKLED_State);
	Deal_LedSta(&ZWLED_State);
	Deal_LedSta(&BG1LED_State);
	Deal_LedSta(&BG2LED_State);
}

//根據設置值修改燈光佔空比,從而修改亮度值和閃爍值
void Deal_LedSta(LED_STATE *LedState)
{
	if((++LedState->LEDR_Light_TMR)==0)LedState->LEDR_Light_TMR++;
	if((++LedState->LEDG_Light_TMR)==0)LedState->LEDG_Light_TMR++;
	if((++LedState->LEDB_Light_TMR)==0)LedState->LEDB_Light_TMR++;
	
	if(LedState->Work_Mode == LED_Work_ON)
	{
		if(((LedState->LED_Flash_TMR >= LedState->LED_Flash_DSTMR)&&(LedState->LED_Flash_TMR < LedState->LED_Flash_DSTMR*2))||(LedState->Flash_Mode==LED_Flash_Stop))
			{
					  if(LedState->LEDR_Light_TMR<=LedState->LEDR_NUM)
							{LedState->LEDR(LedON);}
						else
					   	{LedState->LEDR(LedOFF);}
							
						if(LedState->LEDG_Light_TMR<=LedState->LEDG_NUM)
							{LedState->LEDG(LedON);}
						else
					   	{LedState->LEDG(LedOFF);}		
							
						if(LedState->LEDB_Light_TMR<=LedState->LEDB_NUM)
							{LedState->LEDB(LedON);}	
						else
					   	{LedState->LEDB(LedOFF);}								
			}	
		else if(LedState->LED_Flash_TMR >= LedState->LED_Flash_DSTMR*2) 				
			{
					  LedState->LED_Flash_TMR=0;
				    LedState->LEDRGB(LedOFF);
			}
	}
 else if(LedState->Work_Mode==LED_Work_OFF)
		{LedState->LEDRGB(LedOFF);}
}

//工控機控制燈光指令解析,用於定時器內部進行燈光控制 優化版本
//參數1:定時器內部進行燈光控制對應結構體成員
//參數2:通信協議RGB的首地址 R G B 閃爍值 總開關
//示例: PC_SetLed(&ZWLED_State,&gUART2RevBuf[7]);
void PC_SetLed(LED_STATE *PC_SetLed_state,u8 *PC_set_Buf)
{
	PC_SetLed_state->LEDR_NUM=PC_set_Buf[0];
	PC_SetLed_state->LEDG_NUM=PC_set_Buf[1];
	PC_SetLed_state->LEDB_NUM=PC_set_Buf[2];
	
	if((PC_set_Buf[3]==0x00)||(PC_set_Buf[3]==0x01)||(PC_set_Buf[3]==0x02))	//閃爍
  {
	  PC_SetLed_state->Flash_Mode=(LED_FLASH_Mode)PC_set_Buf[3];//枚舉類型強制性轉換
	  PC_SetLed_state->LEDR_Light_TMR=0; 	//刷新亮度計數值
	  PC_SetLed_state->LEDG_Light_TMR=0;
	  PC_SetLed_state->LEDB_Light_TMR=0;

		if(PC_set_Buf[3]==0x00)	//常亮
		{
		 PC_SetLed_state->LED_Flash_TMR=0;
     PC_SetLed_state->LED_Flash_DSTMR=0;		
		}		
		else if(PC_set_Buf[3]==0x01)	//1S慢閃
		{
		 PC_SetLed_state->LED_Flash_TMR=LED1S+1;	//根據實際修改
     PC_SetLed_state->LED_Flash_DSTMR=LED1S;		
		}
		else if(PC_set_Buf[3]==0x02)	//05S快閃
		{ 
		 PC_SetLed_state->LED_Flash_TMR=LED05S+1;
     PC_SetLed_state->LED_Flash_DSTMR=LED05S;			
		}		
	}
	
	if((PC_set_Buf[4]==0x00)||(PC_set_Buf[4]==0x01))	//總開關
		PC_SetLed_state->Work_Mode=(LED_WORK_Mode)PC_set_Buf[4];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章