怎样实现单个按键的双击
怎样实现单个按键的双击,希望大家能帮帮偶呀是C哦,不是汇编哦 2次阿不就是按 2次 你想想就行了 回复【1楼】jrcsh 邪恶的小会会
-----------------------------------------------------------------------
想过了,就是怎样能分辨单击和双击,又用定时器计算2次之间的时间差吗 判断延时再判断
这么这么样?》
相当于去抖动的原理
只不过时间长点 回复【3楼】yklstudent 无敌电子枪
-----------------------------------------------------------------------
就是不想用延时呀 一个按键按下后,触发一个标志,开始计时,再一个按键按下后,判断两个按键相同并且计时数值小于一定值,则为双击. 马潮老师的《基于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语言程序设计的书籍)。 e mark 5楼正解 解决了,谢谢大家,特别是5楼和6楼 proteldxp 发表于 2011-1-24 22:39 static/image/common/back.gif
马潮老师的《基于AVR的嵌入式系统与实践》第九章里有的啊。
#define key_input PIND.7 // 按键输入口
#d ...
顶7楼,学习了 不知道定义一个I=0,可不可以,按一次自加一,判断等于二的时候执行语句,在把I置零 计算键值. 同意6楼的解法
页:
[1]