野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19111|回复: 7

有5个按键,每个按键接独立的I/O口上,程序怎么处理才能检测到短按、长按呢?

[复制链接]
发表于 2013-6-9 14:49:15 | 显示全部楼层 |阅读模式
这几天在做按键的检测,使用的是扫描法,按键直接接在I/O上,未按下时是高电平,按下时为低电平,
现在的问题是怎么才能检测到按键的短按和长按呢?
求大神指教啊
回复

使用道具 举报

发表于 2013-6-9 16:21:12 | 显示全部楼层
定时扫描……

可以参考我们 k60 提供的例程,里面 6个按键,支持长按、短按、弹起 等动作的识别

野火 K60 光盘资料下载 - 智能车初学入门扫盲资料 - 野火初学123社区 - 野火初学123论坛 http://www.firebbs.cn/forum.php? ... &extra=page%3D1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-9 20:26:16 | 显示全部楼层
fire 发表于 2013-6-9 16:21
定时扫描……

可以参考我们 k60 提供的例程,里面 6个按键,支持长按、短按、弹起 等动作的识别

好的 我先看看 有问题再请教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-9 21:33:16 | 显示全部楼层
fire 发表于 2013-6-9 16:21
定时扫描……

可以参考我们 k60 提供的例程,里面 6个按键,支持长按、短按、弹起 等动作的识别

我看到的是《k60分离综合代码V3.3》里边的3KEY和4EXIT,没有找到你说的那个。
具体的是哪个例程呢?
回复 支持 反对

使用道具 举报

发表于 2013-6-10 12:48:59 | 显示全部楼层
苹果鱼吉 发表于 2013-6-9 21:33
我看到的是《k60分离综合代码V3.3》里边的3KEY和4EXIT,没有找到你说的那个。
具体的是哪个例程呢?

19.CAMERA  ,里面 key 函数,其中最重要的那部分代码如下:
  1. /*************************************************************************
  2. *                             野火嵌入式开发工作室
  3. *
  4. *  函数名称:key_IRQHandler
  5. *  功能说明:定时检测key状态
  6. *  参数说明:按键类型
  7. *  函数返回:按键状态
  8. *  修改时间:2012-10-7   已测试
  9. *  备    注:
  10. *************************************************************************/
  11. void key_IRQHandler(void)
  12. {
  13.    
  14.     u8      keyport;
  15.     u8      keyn;
  16.     KEY_e   keynum;
  17.     static u8 keytime[KEY_MAX];
  18.     KEY_MSG_t keymsg;
  19.     for(keynum = (KEY_e)0 ;keynum < KEY_MAX;keynum ++)
  20.     {
  21.         keyport = (u8)(KEY_PTxn[keynum]>>5);
  22.         keyn    = (u8)(KEY_PTxn[keynum] & 0x1f);
  23.         if(GPIO_Get(keyport,keyn) == KEY_DOWN)
  24.         {
  25.             keytime[keynum]++;
  26.             
  27.             if(keytime[keynum] <= KEY_DOWN_TIME)
  28.             {
  29.                 continue;
  30.             }
  31.             else if(keytime[keynum] == KEY_DOWN_TIME +1 )
  32.             {
  33.                 keymsg.key = keynum;
  34.                 keymsg.status=KEY_DOWN;                                        //按下
  35.                 send_key_msg(keymsg);
  36.             }
  37.             else if(keytime[keynum] <= KEY_HOLD_TIME)
  38.             {
  39.                 continue;
  40.             }
  41.             else if(keytime[keynum]  == KEY_HOLD_TIME +1)
  42.             {
  43.                 keymsg.key = keynum;
  44.                 keymsg.status=KEY_HOLD;                                        //长按
  45.                 send_key_msg(keymsg);
  46.                 //keytime[keynum] = KEY_DOWN_TIME +1;
  47.             }
  48.             else
  49.             {
  50.                 keytime[keynum] = KEY_DOWN_TIME +1;
  51.             }
  52.         }
  53.         else
  54.         {
  55.             if(keytime[keynum] > KEY_DOWN_TIME)
  56.             {
  57.                 keymsg.key = keynum;
  58.                 keymsg.status=KEY_UP;
  59.                 send_key_msg(keymsg);           //按键弹起
  60.             }
  61.             keytime[keynum] = 0;
  62.         }
  63.     }
  64. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-10 19:42:13 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-10 12:48
19.CAMERA  ,里面 key 函数,其中最重要的那部分代码如下:

好的,谢谢!
我再研究一下,有问题再咨询哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-11 22:07:52 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-10 12:48
19.CAMERA  ,里面 key 函数,其中最重要的那部分代码如下:

我看了一下这一段代码,有一个问题需要请教一下:
程序如何执行KEY_DOWN和KEY_HOLD所对应的事件,因为是按照计时来做的,肯定会先检测到KEY_DOWN这个状态的,不知道是不是需要使用KEY_UP这个状态来判断?
求解答啊~~~
回复 支持 反对

使用道具 举报

发表于 2013-6-12 08:05:01 | 显示全部楼层
苹果鱼吉 发表于 2013-6-11 22:07
我看了一下这一段代码,有一个问题需要请教一下:
程序如何执行KEY_DOWN和KEY_HOLD所对应的事件,因为是 ...

是通过消息FIFO发送按键消息,主函数 查询是否接到消息,接到消息就进行处理。

如何处理这些 消息,这个是你考虑的问题,例如 等 up后才判断是down 还是 hold ,也可以 down 也处理,hold 也处理。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 06:28 , Processed in 0.031202 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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