/* ****************************************************************************** * * @file led.c * @brief led module * @ic sy8835 * * @version 1.0 * @date 2024/11/01 15:00:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2024/11/01 Alex build this file ******************************************************************************/ /*_____ I N C L U D E S ____________________________________________________*/ #include "led.h" #include "pwm.h" #ifdef LED_DISPLAY volatile uint8_t Display_RSta; // 显示状态 volatile uint8_t Display_GSta; // 显示状态 volatile uint8_t Display_YSta; // 显示状态 volatile uint8_t Display_BSta; // 显示状态 /******************************************************************************\ Macro definitions \******************************************************************************/ /******************************************************************************\ Variables definitions \******************************************************************************/ static TS_LED_INFO LED; /******************************************************************************\ Functions definitions \******************************************************************************/ /* * 函数名称 : LED_Init * 功能描述 : LED初始化 * 参 数 : NONE * 返回值 : NONE */ /******************************************************************************/ void LED_Init(void) /******************************************************************************/ { SFRADDR = P1_OE; SFRDATA = 0x0F; SFRADDR = LED_CTL; SFRDATA = 0x0F; SFRADDR = P1_DRV0; //配置P10-P13输出驱动能力:0:800Ω;1:400Ω SFRDATA = LED_DRV_LIMIT_SET; Display_RSta = LED_OFF; Display_GSta = LED_OFF; Display_YSta = LED_OFF; Display_BSta = LED_OFF; LEDR_OFF(); LEDG_OFF(); LEDB_OFF(); LEDY_OFF(); } /* * 函数名称 : LED_On * 功能描述 : 点亮LED * 参 数 : LED的ID * 返回值 : NONE */ /******************************************************************************/ static void LED_On(uint8_t LedId) /******************************************************************************/ { switch(LedId) { case LED_R: LEDR_ON(); break; case LED_G: LEDG_ON(); break; case LED_Y: LEDY_ON(); break; case LED_B: LEDB_ON(); break; default: break; } } /* * 函数名称 : LED_Off * 功能描述 : 熄灭LED * 参 数 : LED的ID * 返回值 : NONE */ /******************************************************************************/ static void LED_Off(uint8_t LedId) /******************************************************************************/ { switch(LedId) { case LED_R: LEDR_OFF(); break; case LED_G: LEDG_OFF(); break; case LED_Y: LEDY_OFF(); break; case LED_B: LEDB_OFF(); break; default: break; } } /* * 函数名称 : LED_Clr * 功能描述 : 熄灭全部LED * 参 数 : NONE * 返回值 : NONE */ /******************************************************************************/ void LED_Clr(void) /******************************************************************************/ { uint8_t i; for(i=0;i= LED.Flash_Period[i]) //LED.Timer[i]表示累加的时间 { LED.Timer[i] = 0; if(LED.Flash_Times[i] > 0) { LED.Flash_Times[i]--; } if(LED.Flash_Times[i] == 0) { LED.State[i] = LED_OFF; } } break; case LED_KEEP_FLASHING: if(LED.Timer[i] <= LED.Flash_Duty[i]) { LED_On(i); } else { LED_Off(i); } if(LED.Timer[i] >= LED.Flash_Period[i]) { LED.Timer[i] = 0; } break; #ifdef PWM_ENABLE case LED_BREATHING_LIGHT: if( LED.Light_Dir[i] == SHOW_NONE ) { PWM_Disable(i); PWM_Dir_Flag = FALSE; LED.State[i] = LED_OFF; } else { if( LED.Light_Dir[i] == SLOW_LIGHT ) { if( !PWM_Dir_Flag ) { PWM_Dir_Flag = TRUE; LED.Flash_Duty[i] = PWM_REL_VALUE; } LED.Flash_Duty[i]++; if( LED.Flash_Duty[i] >= PWM_REL_FULL ) { LED.Light_Dir[i] = SHOW_NONE; } } else if( LED.Light_Dir[i] == SLOW_DARK ) { if( !PWM_Dir_Flag ) { PWM_Dir_Flag = TRUE; LED.Flash_Duty[i] = PWM_REL_FULL; } LED.Flash_Duty[i]--; if( LED.Flash_Duty[i] <= PWM_REL_VALUE ) { LED.Light_Dir[i] = SHOW_NONE; } } else if( LED.Light_Dir[i] == SHOW_NORMAL ) { if( LED.Flash_Duty[i] >= PWM_REL_FULL ) { PWM_Dir_Flag = TRUE; } else if( LED.Flash_Duty[i] <= (PWM_REL_VALUE + 1) ) { PWM_Dir_Flag = FALSE; } if(PWM_Dir_Flag) { LED.Flash_Duty[i]--; } else { LED.Flash_Duty[i]++; } } PWM_Duty_Set(i, LED.Flash_Duty[i]); } break; #endif default: break; } if (i == LED_R) { Display_RSta = LED.State[i]; // LED_OFF == DISPLAY_OFF } else if (i == LED_G) { Display_GSta = LED.State[i]; // LED_OFF == DISPLAY_OFF } else if (i == LED_Y) { Display_YSta = LED.State[i]; // LED_OFF == DISPLAY_OFF } else if (i == LED_B) { Display_BSta = LED.State[i]; // LED_OFF == DISPLAY_OFF } // printf("LED.Flash_Duty[%d]:%d,LED.State:%d,LED.Light_Dir:%d.\r\n",(u16)i,(u16)(LED.Flash_Duty[i]),(u16)(LED.State[i]),(u16)(LED.Light_Dir[i])); } for(i=0;i