程序是这样的,每次进入中断后处理中断中的事情(其实就是点亮红色的LED灯),然后关闭中断,同时主函数里面也进行按键的扫描,如果有按键按下得到相应的值,处理相应的if中的事情(其实就是点亮绿色的LED灯),然后开启中断,但是怎么总是绿色的LED灯 先点亮,然后松开按键这时红色的LED灯 才点亮如果不松开红色的LED灯就不亮,不知道是什么原因,中断不是先处理的吗,如果有按键按下就会进入中断,然后点亮红色的LED灯,处理完了之后关闭中断才会进入主函数的查询里面在才会点亮绿色的LED吗,这好像才是对的吧。怎么情况好像不对呀,求高手指教!!!谢谢 代码如下:
int main(void)
{
u8 vable_key=0;
Stm32_Clock_Init(9);
delay_init();
NVIC_Configuration();
KEY_Init();
LED_Init();
while(1)
{
vable_key=KEY_Scan(0);
if(vable_key==4) //上
{
LED1=0; //绿色灯 低电平点亮
enable_key_irq();
}
else if(vable_key==3) //左 key2 GPIO_Pin_2
{
LED0=1;
enable_key_irq();
}
else if(vable_key==2) //下 key1 GPIO_Pin_3
{
LED0=0;
enable_key_irq();
}
else if(vable_key==1) //右 key0 GPIO_Pin_4
{
LED1=1;
enable_key_irq();
}
}
}
void KEY_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void disable_key_irq(void)
{
NVIC_DisableIRQ(EXTI0_IRQn);
}
void enable_key_irq(void)
{
NVIC_EnableIRQ(EXTI0_IRQn);
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode)key_up=1;
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return KEY_RIGHT;
else if(KEY1==0)return KEY_DOWN;
else if(KEY2==0)return KEY_LEFT;
else if(KEY3==1)return KEY_UP;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)
key_up=1;
return 0;
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
enable_key_flag=1;
LED0=0; //红色灯 低电平点亮
disable_key_irq();
}
}
|