1

在我的 ST32Lc应用程序中,我想加快闪烁 LED 的速度。使用下面的代码,我可以按下按钮,LED 会更快地闪烁。当我松开时,LED 会正常闪烁。

如何检查按钮是否被按下至少 2 秒,然后加快 LED 的速度?

int i = 0;
    while (1) {
        bool wasSwitchClosedThisPeriod = false;
        while (i++ < speed) {
            // Poll the switch to see if it is closed.
            // The Button is pressed here
            if ((*(int*)(0x40020010) & 0x0001) != 0) {
                wasSwitchClosedThisPeriod = true;
            }
        }
        // Blinking led
        *(int*) (0x40020414) ^= 0xC0; 

        i = 0;

        if (wasSwitchClosedThisPeriod) {

            speed = speed * 2;

            if (speed > 400000) {

                speed = 100000;
            }  
        }   
    }
4

2 回答 2

1

您需要在微控制器中使用片上硬件定时器。最简单的方法是有一个重复计时器,它每 x 个时间单位增加一个计数器。让定时器 ISR 轮询按钮端口。如果发现按钮无效,则重置计数器,否则增加它。例子:

static volatile uint16_t button_count = 0;

void timer_isr (void)  // called once per 1ms or so
{
  // clear interrupt source here

  if((button_port & mask) == 0)
  {
    button_count = 0;
  }
  else
  {
    if(button_count < MAX)
    {
      button_count++;
    }
  }
}

...

if(button_count > 2000)
{
  change speed
}

这样,您还可以免费获得按钮的信号去抖动。去弹跳是您必须始终拥有的东西,而您当前的代码似乎缺少它。

于 2016-11-03T15:59:17.387 回答
1

如果没有 ISR,您的循环中应该有一些东西,至少可以保证已经过去了一段时间(睡眠/等待/延迟几毫秒)和计数器。

于 2016-11-03T18:35:00.317 回答