找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2363|回复: 14
收起左侧

求解,这种单片机LED闪烁程序要怎么简化才好,感觉写的好多.

  [复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:586048 发表于 2020-9-27 11:59 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /*===========================================================
  2. -------------------------------------------------------------
  3. 函数名称: LED_Flicker LED闪烁程序
  4. 函数说明: 红蓝灯闪烁程序,固定先红后蓝,每0.5s交换一次
  5. 参  数    : Flicker_num
  6. 输入变量: 无
  7. 输出变量: 无
  8. 注意事项:
  9. -------------------------------------------------------------
  10. =============================================================*/
  11. void LED_Flicker()
  12. {
  13.         if(LED_status_old != LED_status)
  14.         {
  15.                 LED_status_old = LED_status;
  16.                 Timer.Flag_500ms = 1;
  17.                 TimerCount.C100ms_5ci = 0;
  18.                 Flicker_count = 0;
  19.                 Flicker_Flag = 0;
  20.         }
  21.         if(Timer.Flag_500ms)
  22.         {
  23.                 Timer.Flag_500ms = 0;
  24.                 switch (LED_status)
  25.                 {
  26.                         case B_R_OFF:                                                        // 红蓝灯都关闭
  27.                                 LED_Blue = Blue_off;
  28.                                 LED_Red  = Red_off;
  29.                                 Flicker_count = 0;
  30.                                 Flicker_Flag = 0;
  31.                         break;
  32.         
  33.                         case Blue_Light:                                                // 只亮蓝灯
  34.                                 LED_Blue = Blue_on;
  35.                                 LED_Red  = Red_off;
  36.                         break;
  37.                         
  38.                         case Red_Light:                                                        // 只亮红灯
  39.                                 LED_Blue = Blue_off;
  40.                                 LED_Red  = Red_on;
  41.                         break;

  42.                         case R_B_Flicker_1:                                                // 红蓝灯闪烁1次
  43.                                 
  44.                                 if(Flicker_Flag == 0)
  45.                                 {
  46.                                         Flicker_Flag = 1;
  47.                                         LED_Blue = Blue_off;
  48.                                         LED_Red  = Red_on;
  49.                                 }
  50.                                 else
  51.                                 {
  52.                                         Flicker_Flag = 0;
  53.                                         LED_Blue = Blue_on;
  54.                                         LED_Red  = Red_off;
  55.                                 }
  56.                                 Flicker_count++;
  57.                                 if(Flicker_count > 2)
  58.                                 {
  59.                                         Flicker_count = 0;
  60.                                         LED_status = 0;
  61.                                 }
  62.                         break;

  63.                         case R_B_Flicker_15:                                        // 红蓝灯闪烁15次
  64.                                 Flicker_count++;
  65.                                 if(Flicker_count >= 30)
  66.                                 {
  67.                                         Flicker_count = 0;
  68.                                         LED_status = 0;
  69.                                 }
  70.                                 if(Flicker_Flag == 0)
  71.                                 {
  72.                                         Flicker_Flag = 1;
  73.                                         LED_Blue = Blue_off;
  74.                                         LED_Red  = Red_on;
  75.                                 }
  76.                                 else
  77.                                 {
  78.                                         Flicker_Flag = 0;
  79.                                         LED_Blue = Blue_on;
  80.                                         LED_Red  = Red_off;
  81.                                 }
  82.                         break;

  83.                         case R_Flicker_10:                                                // 红灯闪烁10次
  84.                                 LED_Blue = Blue_off;
  85.                                 LED_Red  = ~LED_Red;
  86.                                 Flicker_count++;
  87.                                 if(Flicker_count >= 20)
  88.                                 {
  89.                                         Flicker_count = 0;
  90.                                         LED_status = 0;
  91.                                 }
  92.                         break;

  93.                         case Blue_Light_1s:                                                // 蓝灯亮一秒
  94.                                 LED_Blue = Blue_on;
  95.                                 LED_Red  = Red_off;
  96.                                 Flicker_count++;
  97.                                 if(Flicker_count >= 2)
  98.                                 {
  99.                                         Flicker_count = 0;
  100.                                         LED_status = 0;
  101.                                 }
  102.                         break;

  103.                         case Red_Light_5s:                                                // 红灯亮5s
  104.                                 LED_Blue = Blue_off;
  105.                                 LED_Red  = Red_on;
  106.                                 Flicker_count++;
  107.                                 if(Flicker_count >= 10)
  108.                                 {
  109.                                         Flicker_count = 0;
  110.                                         LED_status = 0;
  111.                                 }
  112.                         break;
  113.                         
  114.                         default:
  115.                                 LED_status = 0;
  116.                         break;
  117.                 }
  118.         }
  119.         
  120. }
复制代码

回复

使用道具 举报

ID:586048 发表于 2020-9-27 12:04 | 显示全部楼层
这一段要怎么去掉才好,因为有一个按键,按下去就要立即反应,有什么比较好的方法来实现.注意:这个500ms标志我不想去掉,换成一百毫秒确实会变快,但是闪烁是固定500ms闪烁一次的,不想在多加变量了,空间有限.当然,如果有合适的方法都可以提出来,哪怕加了变量,我可以参考参考
回复

使用道具 举报

ID:553941 发表于 2020-9-27 14:30 | 显示全部楼层
感觉可以写一个函数,通过输入变量,判断亮哪个灯,以及间隔时间,需要使用的时候调用此函数,应该可以简化一些重复的代码。
回复

使用道具 举报

ID:586048 发表于 2020-9-27 14:54 | 显示全部楼层
13303022280 发表于 2020-9-27 14:30
感觉可以写一个函数,通过输入变量,判断亮哪个灯,以及间隔时间,需要使用的时候调用此函数,应该可以简化 ...

感觉不可行,如果是调用的话,这个函数只在调用的时候运行了,但是灯亮又是有一定的延时的,一定是反复执行中,所以这种方法不太适用
回复

使用道具 举报

ID:739545 发表于 2020-9-27 15:37 | 显示全部楼层
画个流程图,根据流程图判断是否能够简化。
回复

使用道具 举报

ID:584814 发表于 2020-9-28 09:06 | 显示全部楼层
从结构化上看很规范没毛病也很难减。感觉从简的角度就不要搞那么多变量标记直接0和1就简了。
回复

使用道具 举报

ID:586048 发表于 2020-9-28 10:18 | 显示全部楼层
man1234567 发表于 2020-9-28 09:06
从结构化上看很规范没毛病也很难减。感觉从简的角度就不要搞那么多变量标记直接0和1就简了。

这样只是看起来简化了
回复

使用道具 举报

ID:367460 发表于 2020-9-29 11:33 | 显示全部楼层
程序的结构复杂与否关键看需求, 如果想看起来简单点可以试试将不同的代码封装成子函数进行调用,这样看起来也简洁一点
回复

使用道具 举报

ID:808634 发表于 2020-10-8 19:26 | 显示全部楼层
做.h文件,这样就不会显得主函数太臃肿
回复

使用道具 举报

ID:827243 发表于 2020-10-9 15:23 | 显示全部楼层
如果你只要求  函数说明: 红蓝灯闪烁程序,固定先红后蓝,每0.5s交换一次, 那只要保留 case R_B_Flicker_1:                                                // 红蓝灯闪烁1次  即可,如果还要其他要求,这个代码没啥好优化了。
回复

使用道具 举报

ID:451718 发表于 2020-10-9 17:20 | 显示全部楼层
这个程序,结构清晰,描述详尽,易于移植,方便修改。是标准的简易范例了。  等你做多几个项目后明白了,这样的程序,绝对可以当成模块来用。  
回复

使用道具 举报

ID:827215 发表于 2020-10-9 18:20 | 显示全部楼层
加一个定时器,只负责计数,单数则是亮红灯,偶数亮蓝灯。那么在我看来,三个部分就可以,一个定时器计数,一个判断条件红灯亮,一个判断条件蓝灯亮。(这个判断条件指的是判断计数器的数)至于你说的什么按键,我没懂意思,如果是按下按键起什么额外作用,那可以加外部中断。
回复

使用道具 举报

ID:235954 发表于 2020-10-10 08:25 | 显示全部楼层
定时器里面LED=!LED;
回复

使用道具 举报

ID:827643 发表于 2020-10-10 11:05 | 显示全部楼层
lovezjf234 发表于 2020-9-27 15:37
画个流程图,根据流程图判断是否能够简化。

流程图是可以很好的整理逻辑结构的,挺好的建议,也建议楼主可以试试,根据流程图看看是逻辑结构方面来找问题会比较快啦
回复

使用道具 举报

ID:708637 发表于 2020-10-10 11:59 | 显示全部楼层
基本可以了,结构也比较清晰。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表