C Raspberry Pi,循环延迟函数

C Raspberry Pi,循环延迟函数,c,function,raspberry-pi,delay,C,Function,Raspberry Pi,Delay,这是我的代码: #include <wiringPi.h> #include <stdio.h> #define LED 18 #define IN 24 int main(void) { wiringPiSetupGpio (); pinMode (LED, OUTPUT); pinMode (IN, INPUT); for (;;) { digitalWrite (LED, 1); delay

这是我的代码:

#include <wiringPi.h>
#include <stdio.h>

#define LED 18
#define IN 24

int main(void)
{
    wiringPiSetupGpio ();
    pinMode (LED, OUTPUT);
    pinMode (IN, INPUT);
    for (;;)
    {
        digitalWrite (LED, 1);
        delay (2000);
        digitalWrite (LED, 0);
        delay (2000);

        if (digitalRead (IN) == 1)
        {
            for (;;)
            {
                digitalWrite (LED, 1);
                delay(500);
                digitalWrite (LED, 0);
                delay(500);

            }
        }    
    }    
    return 0;
}
#包括
#包括
#定义LED 18
#定义在24
内部主(空)
{
wiringPiSetupGpio();
引脚模式(LED,输出);
pinMode(输入,输入);
对于(;;)
{
数码写入(LED,1);
延迟(2000年);
数字写入(LED,0);
延迟(2000年);
如果(数字读取(IN)==1)
{
对于(;;)
{
数码写入(LED,1);
延迟(500);
数字写入(LED,0);
延迟(500);
}
}    
}    
返回0;
}

我使用开关从2000延迟切换到500延迟。问题是,当我按下开关时,它会等待循环结束,直到它变得更快。反之亦然。我需要在代码中的某个地方编写一个函数或循环,允许我按下开关,立即无需等待即可转到较慢/较快的速度。我用C语言编写,在raspberry pi上使用布线pi库和gpio引脚编号

首先,正如您所展示的代码,它永远不会偏离
2000
的延迟,因为没有办法退出(;)循环的初始
。这可能是您需要检查和修复的第一件事


就能够提前结束延迟而言,你可以做一些改变:

delay (2000);
进入:

基本上,你有一个单循环,但是每十个时间单位循环一次,而不是每500或2000。您维护一个单独的计数器,该计数器决定LED何时翻转,该计数器的起始值取决于当前循环时间

当开关翻转时,计数器归零,以便它(几乎)立即切换到下一个循环

for (i = 0; i < 2000; i += 10) {
    delay (10);
    if (digitalRead (IN) == 1)
        break;
}
#include <wiringPi.h>
#include <stdio.h>

#define LED 18
#define IN 24
#define RES 10

int main (void) {
    int cycleTime, ledState, lastSwitch, currSwitch, timeLeft;

    wiringPiSetupGpio ();
    pinMode (LED, OUTPUT);
    pinMode (IN, INPUT);

    cycleTime = 2000;  // Initial cycle time
    ledState = 0;      //   and LED state.
    lastSwitch = 0;    // Previous switch state,

    // Start infinite loop with first cycle time.

    timeLeft = cycleTime;
    for (;;) {
        // Delay for minimal time and adjust time left.

        delay (RES);
        timeLeft = timeLeft - RES;

        // Detect switch change.

        currSwith = digitalRead (IN);
        if (currSwitch != lastSwitch) {
            // If so, store new state, change cycle time
            //   and force IMMEDIATE end of current cycle.

            lastSwitch = currSwitch;
            cycleTime = 2500 - cycleTime;  // switch 500 <-> 2000
            timeLeft = 0;
        }

        // Detect end of cycle.

        if (timeLeft <= 0) {
            // Toggle LED and start new cycle.

            ledState = 1 - ledState;
            digitalWrite (LED, ledState);
            timeLeft = cycleTime;
        }
    }
}