请教单片机C语言关于比较长子函数中及时跳出的问题

  • k
    kfg
    最近琢磨给高达模型加灯,一开始想在淘宝上找一些跑马灯、呼吸灯的成品,但是花样都不是我想要的。
    偶尔看到有一家店买C51控制的心形灯。作为野生码农,就决定自己搞搞,用C51来控制花样切换等等。
    作为单片机零基础的人,在论坛看了不少范例,借鉴了论坛上http://www.51hei.com/bbs/dpj-153979-1.html(谢谢该程序的作者)的代码自己写了一个,用了P1和P2两组IO,总共16个灯组(每组等1-4个灯不等),灯的样式有3个花样,各个样式通过按钮(p3.2 int0)切换
    花样1:所有灯按顺序渐亮,LED1逐渐点亮,然后LED2逐渐点亮,最终所有灯全亮,耗时大概5、6秒
    花样2:所有灯循环呼吸灯,一个循环大概1秒
    花样3:所有灯一直全亮

    3个样式我都实现了,但是切换按钮有点问题。
    如果处于花样1、花样2,按下按钮后不会马上切换,而是要等花样执行完之后才会切换。

    后来经过研究、对比,发现是因为花样1和花样2的耗时太长,需要等执行完了再回去判断花样代码才会调整花样。

    然后我就在花样1、花样2的每个delay函数前加一个if,来判断是否有按按键,如果有就终止花样重新判断花样代码,并执行相应的花样。最终实现了我要的效果,花样切换很及时。

    但是这样的话,就有很多if语句,整个代码看起来很不美光。

    请问各位大佬,在主循环或子函数需要执行很多指令或耗时比较长,在执行过程中因为某些情况需要终止当前循环或者函数时,你们是怎么处理的呢?谢谢
  • s
    sspda568
    单片机按键直接用中断处理不行么,每个花样都做成一个个函数,直接跑过去执行。
  • 豪爵太子
    你的程序结构没规划好,要采用轮询主程序,减少不必要的时间浪费
  • k
    kfg
    都是同一个优先级的中断的话,后面的中断要等前面的中断处理完才会执行。
  • k
    kfg
    老乡,能否详细点说说呢?或者放个简单的范例?
  • b
    buwangyu
    直接用中断吧。看下你单片机的中断部分,不用自己软件去轮询按键状态了。
  • 痴汉
    状态机啊
  • s
    sunever999
    看起来挺好玩的啊 iOS fly ~
  • j
    jckimi
    呼吸灯,最好上pwm
  • s
    sspda568
    你不就一个按钮么,代码不要放在中断里面,中断只负责配状态。外面一个while循环,case专门负责切换花样,时间片分的小点。
  • k
    kfg
    回复10#sspda568


    恩,1个按钮。按一下切换到某个样式,如果再按一下,这个样式耗时又比较长的话,会等到这个样式执行完了再执行中断的。
  • k
    kfg
    回复9#jckimi


    不只是呼吸灯。呼吸灯做好了。