2019-07-23 16:37发布
zhangmangui 发表于 2013-8-28 10:01 个人觉得按键会有抖动 所以单击和连击这两个就不好处理 不知道你的按键之后有没有硬件整形电路没 没的 ...
595332542 发表于 2013-8-28 14:59 我用定时器每10ms进行检测的方法去抖动的,抖动可以消除,就是现在连发不知怎么实现。 ...
最多设置5个标签!
额。。。没人看么
现在通过这样的状态转换可以实现上述功能,无按键——有按键——有短按——有长按——有连发
代码如下:
但问题也出现,这种状态连发是在长按的基础上进行判断的,连发功能实现必然先触发长按功能。。。还是不合适。。。
大家看了交流下哈,本人刚学习,还希望大家多指点。
- Uint16 readC_key()
- {
- static Uint16 key_state = 0,key_time=0; //key1_state 要定义为全局变量
- Uint16 key_press,key_return=N_key;
-
- key_press = GpioDataRegs.GPBDAT.bit.GPIO54; // 读按键 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_time = 0;
- // key_return = 1; // 按键仍按下,按键确认输出为“1”
- key_state = key_state_2; // 状态转换到键释放态
- }
- else
- key_state = key_state_0; // 按键已抬起,转换到按键初始态
- break;
- case key_state_2:
- if (key_press)
- {
- key_return = S_key; // 此时按键释放,说明是产生一次短操作,回送S_key
- key_state = key_state_0; // 转换到按键初始态
- }
- else if (++key_time >= 100) // 继续按下,计时加10ms(10ms为本函数循环执行间隔)
- {
- key_return = L_key; // 按下时间>1000ms,此按键为长按操作,返回长键事件
- key_state = key_state_3; // 转换到等待按键释放状态
- }
- break;
- //key_state = key_state_0; //按键已释放,转换到按键初始态
- //break;
- case key_state_3: // 等待按键释放状态,此状态只返回无按键事件
- if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
- else if (++key_time >= 50) // 按键时间计数
- {
- key_state = key_state_4; // 按下时间>1s,状态转换到计时 2
- key_time = 0; // 清按键计数器
- key_return = C_key; // 输出“2”
- }
- break;
-
- case key_state_4:
- if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
- else
- {
- if (++key_time >= 50) // 按键时间计数
- {
- key_time = 0; // 按下时间>0.5s,清按键计数器
- key_return = C_key; // 输出“2”
- }
- }
- break;
-
- }
- return (key_return);
- }
复制代码我用定时器每10ms进行检测的方法去抖动的,抖动可以消除,就是现在连发不知怎么实现。
能否用中断处理
一周热门 更多>