#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];
}
可調亮度值RGB燈光控制代碼架構賞析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.