搜索
bottom↓
回复: 14

怎样实现单个按键的双击

[复制链接]

出0入0汤圆

发表于 2011-1-24 18:37:16 | 显示全部楼层 |阅读模式
怎样实现单个按键的双击,希望大家能帮帮偶呀
是C哦,不是汇编哦

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-1-24 18:44:00 | 显示全部楼层
2次阿  不就是按 2次   你想想就行了

出0入0汤圆

 楼主| 发表于 2011-1-24 18:53:04 | 显示全部楼层
回复【1楼】jrcsh 邪恶的小会会
-----------------------------------------------------------------------

想过了,就是怎样能分辨单击和双击,又用定时器计算2次之间的时间差吗

出0入0汤圆

发表于 2011-1-24 21:24:55 | 显示全部楼层
判断  延时  再判断
这么这么样?》
相当于去抖动的原理
只不过时间长点

出0入0汤圆

 楼主| 发表于 2011-1-24 22:23:21 | 显示全部楼层
回复【3楼】yklstudent 无敌电子枪
-----------------------------------------------------------------------

就是不想用延时呀

出0入0汤圆

发表于 2011-1-24 22:27:06 | 显示全部楼层
一个按键按下后,触发一个标志,开始计时,再一个按键按下后,判断两个按键相同并且计时数值小于一定值,则为双击.

出0入0汤圆

发表于 2011-1-24 22:39:45 | 显示全部楼层
马潮老师的《基于AVR的嵌入式系统与实践》第九章里有的啊。
#define key_input                PIND.7                        // 按键输入口
#define key_state_0        0
#define key_state_1        1
#define key_state_2        2

char read_key(void)
{
                static char key_state = 0;
                char key_press, key_return = 0;

                key_press = key_input;                                // 读按键I/O电平
                switch (key_state)
                {
                        case key_state_0:                                // 按键初始态
                                if (!key_press) key_state = key_state_1;        // 键被按下,状态转换到键确认态
                                break;
                        case key_state_1:                                // 按键确认态
                                if (!key_press)
                                {
                                        key_return = 1;                        // 按键仍按下,按键确认输出为“1”
                                        key_state = key_state_2;        // 状态转换到键释放态
                                }
                                else
                                        key_state = key_state_0;        // 按键已抬起,转换到按键初始态
                                break;
                        case key_state_2:
                                if (key_press) key_state = key_state_0;        //按键已释放,转换到按键初始态
                                break;
                }       
            return key_return;
}
该简单按键接口函数read_key()在整个系统程序中应每隔10ms调用执行一次,每次执行时将先读取与按键连接的I/O的电平到变量key_press中,然后进入用switch结构构成的状态机。switch结构中的case语句分别实现了3个不同状态的处理判别过程,在每个状态中将根据状态的不同,以及key_press的值(状态机的输入)确定输出值(key_return),和确定下一次按键的状态值(key_state)。
函数read_key()的返回参数提供上层程序使用。返回值为0时,表示按键无动作;而返回1表示有一次按键闭合动作,需要进入按键处理程序做相应的键处理。
在函数read_key()中定义了3个局部变量,其中key_press和key_return为一般普通的局部变量,每次函数执行时,key_press中保存着刚检测的按键值。key_return为函数的返回值,总是先初始化为0,只有在状态1中重新置1,作为表示按键确认的标志返回。变量key_state非常重要,它保存着按键的状态值,该变量的值在函数调用结束后不能消失,必须保留原值,因此在程序中定义为“局部静态变量”,用static声明。如果使用的语言环境不支持static类型的局部变量,则应将key_state定义为全局变量(关于局部静态变量的特点请参考相关介绍C语言程序设计的书籍)。

出0入0汤圆

发表于 2011-1-25 01:27:34 | 显示全部楼层
e

出0入0汤圆

发表于 2011-1-25 16:20:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-25 16:30:43 | 显示全部楼层
5楼正解

出0入0汤圆

 楼主| 发表于 2011-1-25 20:45:33 | 显示全部楼层
解决了,谢谢大家,特别是5楼和6楼

出0入0汤圆

发表于 2012-7-21 21:43:19 | 显示全部楼层
proteldxp 发表于 2011-1-24 22:39
马潮老师的《基于AVR的嵌入式系统与实践》第九章里有的啊。
#define key_input                PIND.7                        // 按键输入口
#d ...

顶7楼,学习了

出0入0汤圆

发表于 2012-7-22 08:42:07 | 显示全部楼层
不知道定义一个I=0,可不可以,按一次自加一,判断等于二的时候执行语句,在把I置零

出0入0汤圆

发表于 2012-7-22 19:41:47 | 显示全部楼层
计算键值.

出0入0汤圆

发表于 2012-7-22 21:27:36 | 显示全部楼层
同意6楼的解法
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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