0

我是 AVR 的新手,但我以前编写过 PIC,只是这次我也在 linux 中做所有事情,所以你会猜我正在使用 avrdude ......

我对这个项目的目标是根据特定状态改变双色 LED 的颜色。

默认情况下,LED 是红色的(如果你当然正确连接),那么我希望它变成黄色(这是绿色和红色之间的快速变化),而用户按住按钮然后释放,它将变为绿色,然后下一次将关闭。

所以,回顾一下,

LED 为红色

当我按住按钮时它会变成黄色

当我释放它会是绿色的

当我再次按住按钮时,它会变成黄色

当我释放它会关闭

当我再次按住按钮时,它会变成黄色

当我释放它会是红色的(等等......)

在我的实际代码中,有时一切都很好,但有时 LED 卡在黄色,我不知道为什么

有任何想法吗?

代码在 ideone 上:http: //ideone.com/LI9gH

谢谢

4

2 回答 2

1

我不知道问题出在哪里,但如果有帮助,我可以建议一种替代方法。:-)

因为您正在循环浏览一系列 LED 状态,所以您只需将它们列在一个数组中并沿着它前进(到达终点时环绕),每当按钮状态发生变化时,每次都更新 LED。

编辑:

这是一个替代方案:

colours = [red, yellow, green, yellow, off, yellow]
current button = released
state = 0
repeat
    check button
    if button != current button
        current button = button
        state += 1
        if state >= len(colours)
            state = 0
    // showing the colour sets the LED and includes a delay
    show colours[state]
于 2012-01-28T01:46:36.670 回答
1

我猜你只是看到随机生成器缺少按钮的变化大约有 1/3 的时间,因为去抖动稍微偏离了。考虑在不同状态下花费的时间:

check button
wait 10ms
check button again
if button values differ, update state
if yellow
  shine red for 1ms
  shine green for 4ms then leave green on
otherwise
  set current color

那是你的主循环。如您所见,它在大约 15 毫秒的时间内两次检查按钮;并且它不会与更新状态的最后一个值进行比较,仅与 10ms 之前的值进行比较。在“黄色”的 5ms 时间内松开按钮,allumerAmbre 将不会重置,直到下一次恰好落在 10ms 时间段内的释放。此外,黄色最终变成红色的 1/15,可能不是您想要的混合。

于 2012-01-28T14:59:21.283 回答