uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin) //改过需重新写, OFF-->ON
{
if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF)
{
delay(500000);//消抖
if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF)
//松手检测
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF);//松手时会变成KEY_ON,跳出这个while循环
return KEY_OFF;//当为KEY_ON跳出循环时,返还成KEY_OFF进入主函数的while循环
}
}
}
int main(void)
{
KEY_GPIO_Config();
LED_GPIO_Config();
while(1)
{
if(KEY_SCAN(GPIOE,KEY1) == KEY_OFF) 0
LED_G_TOGGLE;
}
}
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);
}
//按键扫描
uint8_t key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
{
//松手检测
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
if(key_scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)
{
LED_TOGGLE;
}
if(key_scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
{
LED_TOGGLE;
}
}
}
其中LED_TOGGLE是利用宏定义的方式实现。
这里需要注意的是不要掉;
并且是控制LED的GPIO端口。
#define LED_TOGGLE {LED_GPIO_PORT->ODR^=LED_GPIO_PIN;}
根据提供的代码,请注意以下几点:
函数没有返回值:KEY_SCAN
函数声明为返回uint8_t
类型,但在代码中没有使用return
语句返回任何值。你需要添加返回语句并确保返回正确的值。
KEY_SCAN
函数内部缺少else
块:当前的逻辑是,如果按键被按下,进入了第一个if
语句块,延时后再次检测按键状态。这时候如果按键仍然按下,会进入第二个if
语句块并返回KEY_OFF
。但如果按键已经松开,会继续执行下面的代码,没有返回值。你应该根据需要添加一个else
块,并在其中返回相应的值。
修改后的代码示例:
uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF)
{
delay(500000); // 消抖
if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF)
{
while (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF); // 松手时会变成KEY_ON,跳出这个while循环
return KEY_OFF; // 当为KEY_ON跳出循环时,返回KEY_OFF
}
else
{
return KEY_ON; // 其他情况,返回KEY_ON(按键未按下)
}
}
else
{
return KEY_ON; // 按键未按下
}
}
int main(void)
{
KEY_GPIO_Config();
LED_GPIO_Config();
while(1)
{
if (KEY_SCAN(GPIOE, KEY1) == KEY_OFF)
{
LED_G_TOGGLE;
}
}
}