这个是按键初始化的函数:
#include "KEY.h"
/*按键初始化*/
void KEY_Init(void)
{
GPIO_Init(KEY1_PORT, KEY1|KEY2|KEY3|KEY4|KEY5, GPIO_Mode_In_PU_IT); //中断方式
GPIO_Init(KEY5_PORT, KEY5, GPIO_Mode_In_PU_IT); //中断方式
EXTI_SetPinSensitivity(EXTI_Pin_2|EXTI_Pin_3|EXTI_Pin_4|EXTI_Pin_5, EXTI_Trigger_Falling_Low ); //配置外部中断触发方式
}
bool KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef GPIO_Pin)
{
/*检测是否有按键按下 */
if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
{
delay_ms(5); // 延时消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0); //等待按键释放
return true; //如果有键盘按下,就返回真值,否则返回假值
}
}
return false;
}
下面是中断2线的处理函数:
INTERRUPT_HANDLER(EXTI2_IRQHandler,10)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
if(KEY_Down(GPIOA,KEY1) == 0 )
{
GPIO_ToggleBits(GPIOC, GPIO_Pin_5);//LED1
printf ("01.\r\n");
EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
}
if(KEY_Down(GPIOD,KEY5) == 0 )
{
GPIO_ToggleBits(GPIOD, GPIO_Pin_4);//LED5
printf ("05.\r\n");
EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
}
}
现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转。 |