OpenEdv-开源电子网

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

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

[复制链接]

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
发表于 2016-7-28 19:37:48 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 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;  
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2015-11-22
在线时间
52 小时
发表于 2016-7-29 09:39:06 | 显示全部楼层
回复

使用道具 举报

5

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2015-11-22
在线时间
52 小时
发表于 2016-7-29 09:51:45 | 显示全部楼层
你看下硬件原理图,是不是你输出高低电平的问题,我记得key_up和其他的按键是不同的。
回复

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-7-21
在线时间
18 小时
发表于 2016-7-29 11:11:51 | 显示全部楼层
key_up 按下时输入高电平,检测按下和松手都不同(你看原理图)
还有主函数里不要空运行key_scan函数  if和while会执行对应扫描函数。而加了的话在while死循环里在执行if这一语句的时间占比减少,需要多次按下触发概率。

这是我个人看法,如有不对请多多指教
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2016-7-29 20:31:46 | 显示全部楼层
下载寄存器版本例程试试
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
 楼主| 发表于 2016-7-30 21:10:06 | 显示全部楼层
瓶邪 发表于 2016-7-29 09:39
可能是按键消抖问题,你可以把时间延迟到10ms。

改了延时还是不行,不过还是要谢谢你的回答。
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
 楼主| 发表于 2016-7-30 21:14:23 | 显示全部楼层
正点原子 发表于 2016-7-29 20:31
下载寄存器版本例程试试

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

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
 楼主| 发表于 2016-7-30 21:16:00 | 显示全部楼层
瓶邪 发表于 2016-7-29 09:51
你看下硬件原理图,是不是你输出高低电平的问题,我记得key_up和其他的按键是不同的。

key_up按下输入高电平,松开输入低电平,跟其他按键相反,我的程序在这点上应该没有问题
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
 楼主| 发表于 2016-7-30 21:21:49 | 显示全部楼层
2016蓝色幽默 发表于 2016-7-29 11:11
key_up 按下时输入高电平,检测按下和松手都不同(你看原理图)
还有主函数里不要空运行key_scan函数  if ...

key_up的案件检测和松手检测跟其他按键相反就可以了吧,我的程序就是这么写的。
主函数里空运行key_scan函数是什么意思呀,请大神说明,谢谢
回复

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-7-21
在线时间
18 小时
发表于 2016-7-31 10:46:38 | 显示全部楼层
你在while死循环里的语句 if 和 while 之前运行扫描函数是没有必要的(我不死心,拿你的代码在我的探索者上试了一遍)。那就是空运行扫描函数无意义(这是代码的优化)
还有一种可能是你 key初始化时PA0(KEY_UP)没改————PA0要下拉。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-20 02:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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