OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18228|回复: 9
打印 上一主题 下一主题

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

[复制链接]

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
跳转到指定楼层
楼主
发表于 2012-6-10 18:54:11 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
      花了一个星期写出来的,四个按键的独立键盘扫描程序。可以区别长击和短击,同时采用计数方式来消抖。按下键一定时间内,松手后返回对应值;按下键超过一定时间,返回对应值。短击的返回值是在松手后才产生,长击则是超过时间就产生,长击松手后不会返回短击的值。

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;
}

不过感觉程序还有地方可以改进。贴出来跟大家一起讨论。
回复

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
2#
 楼主| 发表于 2012-6-10 20:18:27 | 显示全部楼层
原子哥,指点一下啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-4-19 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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