今天在使用中断设置按键单双击用法时,第一次编程如下
void KEY2_IRQHandler(void)
{
int a=0;
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
key_2++;
//检测key1按键 是否松开
while(GPIO_ReadInputDataBit(KEY2_INT_GPIO_PORT,KEY1_INT_GPIO_PIN) == 1);
while(a<40)
{
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
key_2++;
}
//检测key1按键 是否松开
while(GPIO_ReadInputDataBit(KEY2_INT_GPIO_PORT,KEY1_INT_GPIO_PIN) == 1);
}
//清除中断标志位
EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
}
}
发现无论如何key_2都为2
在检查过程中,发现必须在检测完第一次中断产生后,必须先中断标志位清零才能完成单双击的功能,代码如下
void KEY1_IRQHandler(void)
{
int a=0;
//确保是否产生了EXTI Line中断
//检测的是下降沿的动作
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
Delay_Init(72);
key_1++;
//检测key1按键 是否松开
while(GPIO_ReadInputDataBit(KEY1_INT_GPIO_PORT,KEY1_INT_GPIO_PIN) == 1);
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
while(a<40)
{
a++;
Delay_ms(5);
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
key_1++;
//检测key1按键 是否松开
while(GPIO_ReadInputDataBit(KEY1_INT_GPIO_PORT,KEY1_INT_GPIO_PIN) == 1);
break;
}
}
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
假如第一次不清零的话,中断标志位置1,默认EXTI Line中断仍旧产生,会自动进入双击判断区域,使得按键一直处于双击状态。