OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 独立键盘扫描程序,带松手检测,可区别长击与短击

共30条 1/3 1 2 3 跳转至

独立键盘扫描程序,带松手检测,可区别长击与短击

助工
2012-06-10 19:10:01    评分
 花了一个星期写出来的,四个按键的独立键盘扫描程序。可以区别长击和短击,同时采用计数方式来消抖。按下键一定时间内,松手后返回对应值;按下键超过一定时间,返回对应值。短击的返回值是在松手后才产生,长击则是超过时间就产生,长击松手后不会返回短击的值。

u8 Key_Scan(void)
{
u8 key_ret = 0;
static u8 key_num = 0,del_count,tim_count;
static bit key_flag = 0;
if((!SET)||(!KUP)||(!KDN)||(!KOK)){/*判断是否有键按下*/
if(++del_count==5){/*计数消抖*/
del_count = 0;
if(++tim_count>4){/*长按识别*/
key_flag = 0;/*短按无效*/
tim_count = 4;/*锁定长按*/
switch(key_num){
case 1:key_ret = 5;break;
case 2:key_ret = 6;break;
case 3:key_ret = 7;break;
case 4:key_ret = 8;break;
}
}
else{/*短按有效*/
key_flag = 1;/*短按标志位*/
if(!SET)key_num = 1;/*一下用于识别按键*/
if(!KUP)key_num = 2;
if(!KDN)key_num = 3;
if(!KOK)key_num = 4;
}
}
}else{/*松手之后*/
tim_count = 0;
if(key_flag){/*松手*/
key_flag = 0;
switch(key_num){
case 1:key_ret = 1;break;
case 2:key_ret = 2;break;
case 3:key_ret = 3;break;
case 4:key_ret = 4;break;
}
}
}
return key_ret;
}

不过感觉程序还有地方可以改进。贴出来跟大家一起讨论。共享一份文档
——回复可见内容——



关键词: 独立     键盘     扫描     程序     松手     检测     区别     长击         

专家
2012-06-11 08:58:06    评分
2楼
谢谢楼主分享!

工程师
2012-06-11 10:04:50    评分
3楼
短按判断时间和松手动作,长按判断时间,很明确不会错。如果把长按做成循环响应的话,那就跟常用的按键差不多了,一直按着一个键可以连续响应

专家
2012-06-11 10:38:54    评分
4楼
有需要的话可以借鉴一下哦

助工
2012-06-11 15:20:41    评分
5楼

我也想有连发的功能,不过跟短击松手有冲突。等待高手出现解决


工程师
2012-06-11 16:50:27    评分
6楼
一个计数器,一个计时flag就行。比如1秒以下的操作算短按,1秒以上的操作算长按。 按键按下后开始计时,计时超过一秒计时器归零,计数器加一,返回长按键值,如此反复。监测松手动作,松手时判断计数器的值,计数器的值为零就是短按,返回短按键值。计数器不为零就是长按,返回长按键值。松手计数器归零,计时器归零。

工程师
2012-06-13 09:58:47    评分
7楼
很好,不错!

高工
2012-06-13 23:07:12    评分
8楼
顶,不错,收藏了

菜鸟
2012-06-14 19:02:41    评分
9楼
楼主技术很高超,佩服

高工
2012-06-15 00:07:25    评分
10楼
感谢分享!

共30条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]