void Calculate_Key(KeyDef *p, uint16_t *key_reg, uint8_t bit, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) { if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == 0) p->LastStatus = HEZHAZHONG; else p->LastStatus = FENZHAZHONG; if(p->ThisStatus != p->LastStatus) p->count++; else p->count = 0; if(p->count >= Key_WipeShakeCount) { p->count = 0; p->ThisStatus = p->LastStatus; p->StatusFlg = SET; if(p->ThisStatus == HEZHAZHONG) { BSET(*key_reg, bit); } else { BCLR(*key_reg, bit); } } else { p->StatusFlg = RESET; BCLR(*key_reg, bit); } } 分析这段代码
时间: 2024-04-07 15:33:13 浏览: 233
这段代码是一个函数,名为`Calculate_Key`,接受一些参数来计算按键状态。让我们逐行分析代码。
```c
void Calculate_Key(KeyDef *p, uint16_t *key_reg, uint8_t bit, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == 0)
p->LastStatus = HEZHAZHONG;
else
p->LastStatus = FENZHAZHONG;
}
```
首先,函数通过读取指定GPIO引脚的状态来确定按键的当前状态。如果读取到的状态为低电平(0),则将`p->LastStatus`设置为`HEZHAZHONG`;否则,将其设置为`FENZHAZHONG`。
```c
if(p->ThisStatus != p->LastStatus)
p->count++;
else
p->count = 0;
```
接下来,函数检查当前状态和上一个状态是否不同。如果不同,则将计数器`p->count`加1,否则将其重置为0。
```c
if(p->count >= Key_WipeShakeCount)
{
p->count = 0;
p->ThisStatus = p->LastStatus;
p->StatusFlg = SET;
if(p->ThisStatus == HEZHAZHONG)
{
BSET(*key_reg, bit);
}
else
{
BCLR(*key_reg, bit);
}
}
else
{
p->StatusFlg = RESET;
BCLR(*key_reg, bit);
}
```
然后,函数检查计数器`p->count`是否大于等于预设的消抖计数`Key_WipeShakeCount`。如果是,则说明按键状态已稳定,重置计数器并更新当前状态`p->ThisStatus`为最新状态`p->LastStatus`,同时将状态标志`p->StatusFlg`设置为SET。
接下来,根据当前状态设置指定寄存器`*key_reg`的指定位`bit`。如果当前状态为`HEZHAZHONG`,则将该位设置为1(BSET);否则,将该位清零(BCLR)。
如果计数器未达到消抖计数,则将状态标志`p->StatusFlg`重置为RESET,并将指定寄存器`*key_reg`的指定位`bit`清零(BCLR)。
以上就是这段代码的分析。它通过检测按键的状态,并使用一定的消抖机制来更新按键的最终状态和相关寄存器的值。
阅读全文