按键扫描程序,按KEY_UP时会有问题,但将KEY_UP换成其他按键时就可以实现功能,为什么呢??求大神们给小弟我解答一下,谢谢了!

2019-07-20 21:02发布

本帖最后由 wrnb11 于 2016-7-30 22:10 编辑

    我用的是正点原子的探索者开发板,实验功能是这样的:
    什么按键都不按,只有绿灯亮,按了(按一下)KEY_UP后红灯亮,绿灯灭,蜂鸣器响并保持这个状态,直到按了KEY0后恢复初始状态(只有绿灯亮)。
    但现在按了KEY_UP后,经常会出现红灯灭、绿灯亮、蜂鸣器响的问题(按着KEY_UP不放能正常运行),如果再按一下KEY_UP又可以正常运行(有时候也需要按几下)。
    我把KEY_UP换成KEY1后解决了这个问题,但我想知道为什么用KEY_UP就会出现上述的问题,请各位大神帮帮小弟,谢谢了!
    程序如下:
    main.c:                                                   
    #include"stm32f4xx.h"                                 
    #include"led.h"
    #include"beep.h"
    #include"delay.h"
    #include"key.h"
    int main(void)
    {
     beep_init();
     led_Init();
     delay_init(168);
     key_init();
     while(1)
     {
        GPIO_SetBits(GPIOF,GPIO_Pin_9);
        GPIO_ResetBits(GPIOF,GPIO_Pin_10);
        key_scan1();
        key_scan();
        if(key_scan1())
           while(!key_scan());
      }
    }
    key.c:
    u8 key_scan(void)     //1
   {
      hjc=0;
      if(key0==0)
      {
        delay_ms(1);
        if(key0==0)
        {
          GPIO_ResetBits(GPIOF,GPIO_Pin_10);
          GPIO_SetBits(GPIOF,GPIO_Pin_9);
          GPIO_ResetBits(GPIOF,GPIO_Pin_8);
          hjc=1;
        }
      while(!key0);
      delay_ms(10);
      while(!key0);
      }
      return hjc;
  }

u8 key_scan1(void)             //2
{
  hfz=0;
  if(key_up==1)
  {
    delay_ms(1);
    if(key_up==1)
    {
      GPIO_ResetBits(GPIOF,GPIO_Pin_9);
      GPIO_SetBits(GPIOF,GPIO_Pin_10);
      GPIO_SetBits(GPIOF,GPIO_Pin_8);
      hfz=1;
    }
    while(key_up);
    delay_ms(10);
    while(key_up);
  }
return hfz;  
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
瓶邪
1楼-- · 2019-07-21 02:08
 精彩回答 2  元偷偷看……
瓶邪
2楼-- · 2019-07-21 06:48
你看下硬件原理图,是不是你输出高低电平的问题,我记得key_up和其他的按键是不同的。
2016蓝色幽默
3楼-- · 2019-07-21 07:54
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 11:16
下载寄存器版本例程试试
wrnb11
5楼-- · 2019-07-21 15:41
瓶邪 发表于 2016-7-29 09:39
可能是按键消抖问题,你可以把时间延迟到10ms。

改了延时还是不行,不过还是要谢谢你的回答。
wrnb11
6楼-- · 2019-07-21 18:11
正点原子 发表于 2016-7-29 20:31
下载寄存器版本例程试试

例程里的功能可以实现,但我的程序中key_up还是不行

一周热门 更多>