led.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. @copyright None
  3. @file led.c
  4. @author Comment Vivre
  5. @date 2025-12-19
  6. @brief None
  7. */
  8. #include <MyProject.h>
  9. LED_Control_t ledCtrl;
  10. /**
  11. @function LED_GPIO_Init
  12. @brief LED GPIO初始化
  13. @date 2025-12-19
  14. */
  15. void LED_GPIO_Init(void)
  16. {
  17. SetBit(LED_PXIN, LED_PINX);
  18. LED_OFF;
  19. }
  20. /**
  21. @function LED_State_Display
  22. @brief 指示运行与故障代码
  23. @param[in] Xn0: [输入/出] 故障代码
  24. @date 2025-05-30
  25. */
  26. void LED_State_Display(unsigned char Xn0)
  27. {
  28. // 故障指示状态下 检测到故障码清除 立刻清除故障
  29. if ((ledCtrl.ledState != LED_STATE_OFF ) && (ledCtrl.ledState != LED_STATE_ON))
  30. {
  31. if (Xn0 == 0)
  32. {
  33. LED_OFF;
  34. ledCtrl.ledState = LED_STATE_OFF;
  35. return;
  36. }
  37. }
  38. switch (ledCtrl.ledState)
  39. {
  40. // 关闭状态
  41. case LED_STATE_OFF:
  42. // 存在故障 切入故障状态 清零计数
  43. if (Xn0)
  44. {
  45. ledCtrl.ledState = LED_STATE_FAULT_HIGH_BLINK;
  46. ledCtrl.PauseDelayCnt = 0;
  47. ledCtrl.BlinkCnt = 0;
  48. ledCtrl.FaultHighBit = Xn0 >> 4;
  49. ledCtrl.FaultLowBit = Xn0 & 0x0F;
  50. LED_OFF;
  51. }
  52. // 开启状态且无故障 切入开启状态并打开LED
  53. else if (isCtrlPowOn)
  54. {
  55. ledCtrl.ledState = LED_STATE_ON;
  56. LED_ON;
  57. }
  58. break;
  59. // 开启状态
  60. case LED_STATE_ON:
  61. // 故障或停止时 关闭LED并切回关闭状态
  62. if (!isCtrlPowOn || Xn0)
  63. {
  64. ledCtrl.ledState = LED_STATE_OFF;
  65. LED_OFF;
  66. }
  67. break;
  68. // 高4位闪烁
  69. case LED_STATE_FAULT_HIGH_BLINK:
  70. if (ledCtrl.FaultHighBit == 0)
  71. {
  72. LED_OFF;
  73. ledCtrl.BlinkCnt = 0;
  74. ledCtrl.PauseDelayCnt = 0;
  75. ledCtrl.ledState = LED_STATE_FAULT_HIGH_GAP;
  76. break;
  77. }
  78. if (++ledCtrl.PauseDelayCnt >= 500)
  79. {
  80. ledCtrl.PauseDelayCnt = 0;
  81. LEDPinONOFF;
  82. if (LED_PIN) // 灭灯计数
  83. {
  84. ledCtrl.BlinkCnt++;
  85. if (ledCtrl.BlinkCnt >= ledCtrl.FaultHighBit)
  86. {
  87. LED_OFF;
  88. ledCtrl.BlinkCnt = 0;
  89. ledCtrl.ledState = LED_STATE_FAULT_HIGH_GAP;
  90. }
  91. }
  92. }
  93. break;
  94. // 高低位间隔 1s
  95. case LED_STATE_FAULT_HIGH_GAP:
  96. if (++ledCtrl.PauseDelayCnt >= 1000)
  97. {
  98. ledCtrl.PauseDelayCnt = 0;
  99. ledCtrl.ledState = LED_STATE_FAULT_LOW_BLINK;
  100. }
  101. break;
  102. // 低4位闪烁
  103. case LED_STATE_FAULT_LOW_BLINK:
  104. if (ledCtrl.FaultLowBit == 0)
  105. {
  106. LED_OFF;
  107. ledCtrl.BlinkCnt = 0;
  108. ledCtrl.PauseDelayCnt = 0;
  109. ledCtrl.ledState = LED_STATE_FAULT_CYCLE_GAP;
  110. break;
  111. }
  112. if (++ledCtrl.PauseDelayCnt >= 500)
  113. {
  114. ledCtrl.PauseDelayCnt = 0;
  115. LEDPinONOFF;
  116. if (LED_PIN)
  117. {
  118. if (++ledCtrl.BlinkCnt >= ledCtrl.FaultLowBit)
  119. {
  120. LED_OFF;
  121. ledCtrl.BlinkCnt = 0;
  122. ledCtrl.ledState = LED_STATE_FAULT_CYCLE_GAP;
  123. }
  124. }
  125. }
  126. break;
  127. // 整码间隔 3s
  128. case LED_STATE_FAULT_CYCLE_GAP:
  129. if (++ledCtrl.PauseDelayCnt >= 3000)
  130. {
  131. ledCtrl.PauseDelayCnt = 0;
  132. ledCtrl.ledState = LED_STATE_FAULT_HIGH_BLINK;
  133. }
  134. break;
  135. default:
  136. LED_OFF;
  137. ledCtrl.ledState = LED_STATE_OFF;
  138. break;
  139. }
  140. }