在我的ST32L c
应用程序中,我想加快闪烁的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;
}
}
}
答案 0 :(得分: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
}
这样你也可以免费获得按钮的信号去抖动。去弹跳是你必须经常拥有的东西,你现在的代码似乎缺乏它。
答案 1 :(得分:1)
如果没有ISR,你的循环中应该有一些东西,至少可以保证已经过了一段时间(睡眠/等待/延迟几毫秒)和计数器。