这段代码如何防止无限循环并且保存按键释放后的状态?
时间: 2024-09-28 10:09:20 浏览: 26
为了防止无限循环并保存按键释放后的状态,可以在代码中加入以下几个改进:
1. **检测按键释放**:在`while`循环内部,除了读取按键状态外,还需要检查按键是否已经被释放。例如,在每次循环开始前检查一次按键状态,若为低电平(表示按下),进入状态切换流程;若为高电平(释放),则跳出循环或等待一段时间后再尝试读取。
```c
if (!HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)) { // 按键按下
state++;
... // 正常状态切换流程
} else { // 按键释放
if (state > 5) state = 0; // 重置状态
if (lastKeyState == HIGH && state > 0) { // 如果按键刚刚释放且之前为按下状态
// 执行特定动作,例如清除LED或进入下一组状态序列
}
lastKeyState = HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin); // 更新上次按键状态
while (HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)); // 等待按键恢复高电平
}
```
2. **定时轮询**:为减少按键读取频率,可以在一定时间间隔(如每次延时后)再检查按键状态,而不是每次循环都做检查。
3. **设置标志位**:引入一个布尔型标志(如`isPressed`)来标记按键是否正在被按下。当按键释放时,标志变为false,然后在下次循环前判断这个标志,只有在按键未被按下的情况下才继续执行循环。
通过上述修改,代码不仅能避免无限循环,还能正确处理按键释放后的状态更新。同时,通过合理调整延时和读取频率,可以提高程序的响应性和资源利用率。
阅读全文