分享自己写的LED闪烁程序,请高手拍砖

2020-02-20 20:24发布

此程序可以实现led闪烁的频率和执行时间,若有不足之处,请指正

上传原工程文件,环境:MDK5.12,MK64FN1M0VLQ12


以下为部分代码
  1. //定义并初始化led结构体
  2. led_blink_t        led3_blink = {0,0,0,0,0,0,LED3open,LED3close,ledBlink};
  3. led_blink_t        led4_blink = {0,0,0,0,0,0,LED4open,LED4close,ledBlink};
  4. led_blink_t        led5_blink = {0,0,0,0,0,0,LED5open,LED5close,ledBlink};
  5. led_blink_t        led6_blink = {0,0,0,0,0,0,LED6open,LED6close,ledBlink};


  6. led_blink_t *ledBlinkTable[led_start_end] = {
  7.                                             &led3_blink,
  8.                                             &led4_blink,
  9.                                             &led5_blink,
  10.                                             &led6_blink,
  11.                                             };

  12. /*************************************************************************
  13. ** Function Name :  
  14. ** Description   : led闪烁控制
  15. ** Input         :  
  16. ** Return        :  
  17. ** Notice        :
  18. **************************************************************************/
  19. static uint8_t ledBlink( struct led_blink_s *led )
  20. {
  21.         if(led->workstatus)
  22.         {
  23.                 if( led->worktime )//LED工作时间判断
  24.                 {
  25.                         if(led->worktime > 1)led->worktime -= 1;
  26.                         else
  27.                         {
  28.                                 uint8_t status = led->workstatus;
  29.                                 led->workstatus = 0;
  30.                                 led->worktime = 0;
  31.                                 led->openCount = 0;
  32.                                 led->closeCount = 0;
  33.                                 led->led_close();
  34.                                 return status;
  35.                         }
  36.                 }
  37.                
  38.                 if(led->openCount <= led->opentime)
  39.                 {
  40.                         led->openCount++;
  41.                         led->closeCount = 0;
  42.                         led->led_open();
  43.                 }
  44.                 else
  45.                 {                       
  46.                         led->closeCount++;
  47.                         led->led_close();
  48.                         if(led->closeCount > led->closetime)led->openCount = 0;
  49.                 }               
  50.         }
  51.         return 0;       
  52. }

  53. /*************************************************************************
  54. ** Function Name :  
  55. ** Description   : 开启LED
  56. ** Input         :  start:led编号,
  57.                     worktime:led工作时间,0为永久工作,时间单位为led_working_loop执行周期时间
  58.                     opentime:led亮灯时间
  59.                     closetime:led关灯时间
  60.                     status:led状态,工作为1
  61. ** Return        :  
  62. ** Notice        :
  63. **************************************************************************/
  64. void led_start( uint8_t start ,uint32_t worktime,uint32_t opentime,uint32_t closetime,uint8_t status)
  65. {
  66.         ledBlinkTable[start] ->workstatus = status;
  67.         ledBlinkTable[start] ->worktime = worktime/(1000/LED_BASE_TIME_PER_SEC);
  68.         ledBlinkTable[start] ->opentime = opentime/(1000/LED_BASE_TIME_PER_SEC);
  69.         ledBlinkTable[start] ->closetime = closetime/(1000/LED_BASE_TIME_PER_SEC);
  70.         ledBlinkTable[start] ->openCount = 0;       
  71.         ledBlinkTable[start] ->closeCount = 0;
  72. }
  73. /*************************************************************************
  74. ** Function Name :  
  75. ** Description   : 关闭led
  76. ** Input         :  
  77. ** Return        :  
  78. ** Notice        :
  79. **************************************************************************/
  80. void led_close( uint8_t start )
  81. {
  82.         ledBlinkTable[start] ->workstatus = 0;
  83.         ledBlinkTable[start] ->worktime = 0;
  84.         ledBlinkTable[start] ->opentime = 0;
  85.         ledBlinkTable[start] ->closetime = 0;
  86.         ledBlinkTable[start] ->openCount = 0;       
  87.         ledBlinkTable[start] ->closeCount = 0;
  88.         ledBlinkTable[start] ->led_close();
  89. }

  90. /*************************************************************************
  91. ** Function Name :  
  92. ** Description   : 周期性执行,执行频率LED_BASE_TIME_PER_SEC
  93. ** Input         :  
  94. ** Return        :  
  95. ** Notice        :
  96. **************************************************************************/
  97. void led_working_loop(void)
  98. {
  99.         uint8_t i,temp;
  100.        
  101.     for(i = 0;i< led_start_end;i++)
  102.     {
  103.         temp |= ledBlinkTable[i] ->led_blink( ledBlinkTable[i] );
  104.     }
  105. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。