【问题标题】:8051/C: Enter blink-mode when button is pressed, exit when pressed again or after 30 seconds8051/C:按下按钮时进入闪烁模式,再次按下或 30 秒后退出
【发布时间】:2012-01-19 13:45:22
【问题描述】:

所以我有一个 LED 和一个按钮。

按下按钮时,LED 应开始闪烁。 它要么在 30 秒后停止闪烁,要么在再次按下按钮时停止闪烁。

我已经实现了进入闪烁状态并在30s后离开,但我不知道如何通过按钮随时离开。 任何帮助表示赞赏!

while(1)
{

    if(button is pressed)
    {
         for(i=0, i<60, i++)
         {
           toggleLED();
           wait(500ms);
         }
    }
}

【问题讨论】:

    标签: c 8051


    【解决方案1】:

    你快到了:你需要在 LED 闪烁之间添加观察按钮:

    if(button is pressed)
    {
         for(i=0, i<60, i++)
         {
           toggleLED();
           wait(500ms);
           if (button is pressed)
           {
               turnLedOff();
               break;
           }
         }
    }
    

    【讨论】:

    • 想到了。但它不起作用。我想当我跳出循环时,它会再次回到循环中,因为按钮仍然被按下?!
    • 您可以通过等待 20 秒并再次按下按钮来区分它没有退出循环还是再次进入循环:如果 LED 在 10 秒内停止闪烁,则它没有跳出循环;如果它在 30 秒后停止闪烁,则再次进入循环。如果程序直接回到循环中,您可以在 break 之前添加一个短暂的等待(例如 20 毫秒)来修复它。
    • 谢谢!试过了,似乎休息不起作用。当我再次按下按钮时,它不会再闪烁 30 秒,而只会闪烁剩余的时间。奇怪...
    • 当心按钮本身的“开关弹跳”。它通常会出现在实际的现实生活中的按钮中,并且会使像这样的半幼稚代码中断,因为您认为单个开关转换实际上更像是开关-开关-开关-开关-开关-开关-on-off-on,“闪烁”发生得非常快,因为开关内的触点在最终停止之前反弹。
    • @tzippy 这意味着当您的程序在 wait(500) 调用中时,您按下并释放了按钮。如果您按住下一个切换按钮,您应该能够退出循环。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多