downtoearth 发表于 2011-1-24 18:37:16

怎样实现单个按键的双击

怎样实现单个按键的双击,希望大家能帮帮偶呀
是C哦,不是汇编哦

jrcsh 发表于 2011-1-24 18:44:00

2次阿不就是按 2次   你想想就行了

downtoearth 发表于 2011-1-24 18:53:04

回复【1楼】jrcsh 邪恶的小会会
-----------------------------------------------------------------------

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

yklstudent 发表于 2011-1-24 21:24:55

判断延时再判断
这么这么样?》
相当于去抖动的原理
只不过时间长点

downtoearth 发表于 2011-1-24 22:23:21

回复【3楼】yklstudent 无敌电子枪
-----------------------------------------------------------------------

就是不想用延时呀

yuanbangyin 发表于 2011-1-24 22:27:06

一个按键按下后,触发一个标志,开始计时,再一个按键按下后,判断两个按键相同并且计时数值小于一定值,则为双击.

proteldxp 发表于 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语言程序设计的书籍)。

ERDTxiduoduo 发表于 2011-1-25 01:27:34

e

gxy508 发表于 2011-1-25 16:20:53

mark

biguozi 发表于 2011-1-25 16:30:43

5楼正解

downtoearth 发表于 2011-1-25 20:45:33

解决了,谢谢大家,特别是5楼和6楼

xiaxuetianr 发表于 2012-7-21 21:43:19

proteldxp 发表于 2011-1-24 22:39 static/image/common/back.gif
马潮老师的《基于AVR的嵌入式系统与实践》第九章里有的啊。
#define key_input                PIND.7                        // 按键输入口
#d ...

顶7楼,学习了

单纯太难 发表于 2012-7-22 08:42:07

不知道定义一个I=0,可不可以,按一次自加一,判断等于二的时候执行语句,在把I置零

lryxr2507 发表于 2012-7-22 19:41:47

计算键值.

shi562142022 发表于 2012-7-22 21:27:36

同意6楼的解法
页: [1]
查看完整版本: 怎样实现单个按键的双击