【问题标题】:C code: Slowing down While loop after each iteration?C代码:每次迭代后减慢While循环?
【发布时间】:2018-03-15 07:07:06
【问题描述】:

我目前正在使用用 C 编码的MSP430G2553
出于某种原因,我似乎不擅长编写基本的ForWhile 循环,而且我不知道如何使While 循环在每次迭代后花费更长的时间来完成。

基本上,我有一个 LED 在启动时闪烁 100 毫秒。

当我按住一个按钮时,我想让 LED 闪烁的速度越慢,我按住按钮的时间越长。

当我放手时,LED 应保持其减慢的闪烁速度。

然后,第二个按钮会将 LED 闪烁率重置为 100 毫秒。

现在,当我按住按钮时,我可以减慢 LED 的闪烁速度,但它不会一直变慢。老实说,我不知道该怎么做,所以我在这里注册了一个帐户并发布了。

for(;;) //loop forever
{
    if((P1IN & BIT3)==BIT3) //if button is not pressed
    {
        i = 0;
        a = 4000; //At 10000, 4 cycles per second, or 250ms delay. 4000 cycles = 100ms or 10Hz delay.
        P1OUT ^= BIT0 + BIT6; //two LEDs
        while(i < a) //delays LED blinking until while-loop is complete.
        {
            i = i + 1;
        }
    }
    else if((P1IN & BIT3)!=BIT3) //if button is pressed
    {
        i = 0;
        a = 10000;
        P1OUT ^= BIT0 + BIT6;
        while(i < a) //delays LED blinking until while-loop is complete.
        {
            a = a + 2;
            i = i + 1;
        }
    }
}

【问题讨论】:

  • 谢谢大家,我知道由于丑陋的 for 循环,CPU 负载将几乎达到 100%,但现在我显然不擅长将这些 for 循环转移到中断块中.即使在一段时间内使 MSP430 的时钟值发生变化,我也遇到了一些麻烦。所以现在我只是想在转移到正确的 CPU 编码之前找出实现这一点所需的逻辑。

标签: c for-loop while-loop iteration msp430


【解决方案1】:

您需要保留一个“全局”(在for 范围之外)延迟计数器来跟踪最后一次按下按钮或延迟

int button1Pressed = 0; // "global" flag
for(;;) 
{
    if((P1IN & BIT3) != BIT3) // if button pressed
    {
        button1Pressed = 1;
    }
    if((P1IN & BIT4) != BIT4) // hypothetical button 2 press
    {
        button1Pressed = 0;
    }
    int delay = 4000;
    if(button1Pressed) 
    {
        delay = 10000;
    }
    while(delay>0) {
        delay = delay - 1;
    }
}

【讨论】: