按键扫描程序,按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条回答
wrnb11
1楼-- · 2019-07-21 18:44
 精彩回答 2  元偷偷看……
wrnb11
2楼-- · 2019-07-22 00:25
 精彩回答 2  元偷偷看……
2016蓝色幽默
3楼-- · 2019-07-22 05:32
你在while死循环里的语句 if 和 while 之前运行扫描函数是没有必要的(我不死心,拿你的代码在我的探索者上试了一遍)。那就是空运行扫描函数无意义(这是代码的优化)
还有一种可能是你 key初始化时PA0(KEY_UP)没改————PA0要下拉。

一周热门 更多>