OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3849|回复: 4

中断和查询 按键 的方式同时 使用时,每次怎么是查询的事件先做????

[复制链接]

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
发表于 2015-5-20 22:55:34 | 显示全部楼层 |阅读模式
5金钱
程序是这样的,每次进入中断后处理中断中的事情(其实就是点亮红色的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();
     } 
}

最佳答案

查看完整内容[请看2#楼]

回复【4楼】STM32新学习者: --------------------------------- 知道了  就是因为 我的中断设置的是下降沿中断,而引脚设置是下拉输入 所以按下按键的时候 是上升沿 松开的时候 才是下降沿,所以出现这样的结果!!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
 楼主| 发表于 2015-5-20 22:55:35 | 显示全部楼层
回复【4楼】STM32新学习者:
---------------------------------
知道了  就是因为 我的中断设置的是下降沿中断,而引脚设置是下拉输入 所以按下按键的时候 是上升沿 松开的时候 才是下降沿,所以出现这样的结果!!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-20 23:33:10 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-5-21 12:43:08 | 显示全部楼层
中断都被你禁止掉了,搞毛啊。
业余程序玩家。
回复

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
 楼主| 发表于 2015-5-21 22:51:03 | 显示全部楼层
回复【3楼】ofourme:
---------------------------------
就算我的中断是禁止掉的  但是那也是点亮后才  禁止掉的  怎么可能是查询里面的  绿灯先亮呢   ,然后松开按键后红灯才亮呢, 你不觉得有问题吗???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表