#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灯光控制代码架构赏析
猜你喜欢
转载自blog.csdn.net/weixin_37787043/article/details/104444188
今日推荐
周排行