开源键扫例程--- 无须延时消抖等待,能稳定可靠地一体满足普通、短按(单击/双击)、长按、组合等应用需求的键盘扫描程序

2019-07-20 22:07发布

本帖最后由 warship 于 2018-9-18 14:09 编辑

//////////////////////////////////////////////////////////////////////////////////         
本键盘扫描模块的特点:
一、使用灵活:一体实现按键的普通、单击、双击、长按、保持以及组合等功能,无须事前为每个按键每种键值逐一进行宏定义,也无须逐一编写各事件的条件判断,                     
                     只须为需要的按键事件编写相应的响应代码即可,同时留有特殊键组合等的扩展接口;
                     可以选择每一按键事件的处理实时性,从而能够使强实时性的紧急按键优先得到处理,可自由选择中断处理及查询处理或二者混合的处理方式,
                     灵活适配使应用项目能够兼备按键的强实时性要求以及超长(主循环执行一遍的时间长达1秒以上的)程序的适应性。

二、注重通用:模块设计时注重通用性,按键事件(键值)依简单易懂的标准事件格式编写;除能满足几乎所有按键应用需求外,在按键数量上,
                     从少到2-4个按键直到最大32个按键(包括端口直联、行列式矩阵、矩阵加直联混合)都可适用。(注:新写了一个4*4矩阵加4键直联混合共20个键的例子参见153楼)


三、稳定可靠:后台智能抖动消除、按键干扰杂波滤除措施有力,获取按键稳定可靠,不会产生重复按键,即使在CPU非常繁忙时也不会漏失按键。

         
四、移植简便:所有可调整参数(数量不多)均以宏定义列出,除与硬件相关(按键个数及连接端口)的部分须根据具体系统修改外,其它均无须变化,很容易移植。
                     程序可读性强,注释详尽丰富,其中包括函数调用关系及详细运用修改说明,如有未尽事宜,可提出探讨,本人尽量解答修改。


五、高效节能:消抖无须延时等待,同时采取自适应变频扫键、键盘闲置检测、消抖读键双进程周期差异等多项智能措施尽量减少占用CPU的计算资源。


//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//测试平台:ALIENTEK战舰STM32开发板
//按键驱动代码           
//正点原子@ALIENTEK
//引用请注明出处:http://www.openedv.com/forum.php?mod=viewthread&tid=277263,有问题可在本帖中提出讨论,谢谢。
//在网友@学习stm32f4 的建议下,部分源码上传到了https://github.com/ShuifaHe/STM32.git,新司机上路,请多关照。如果觉得对您有用的话,请按 “星” 号点一下赞
//修改日期:2018/9/1
//版本:V2.2,本帖研讨过程详见2楼,鸣谢相关坛友,感谢@正点原子 的支持肯定。
//Made by warship
//////////////////////////////////////////////////////////////////////////////////
下面给出经由原子试验3改造测试通过的程序范例:
回复后可获取解压密码,谢谢支持。游客,如果您要查看本帖隐藏内容请回复





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
53条回答
warship
1楼-- · 2019-07-22 15:58
xiatianyun 发表于 2018-8-15 23:21
几天前也看到了这个三行按键检测程序代码,的确很精炼。不过和原子的按键教程其实是一个思路,不同的是三行 ...

思路可以借鉴,有空分享一下代码。
warship
2楼-- · 2019-07-22 17:18
本帖最后由 warship 于 2018-8-16 07:02 编辑
xiatianyun 发表于 2018-8-15 23:46
楼主贴出了代码,组合按键看不明白。

首先我定义了如下宏:
//宏定义(以下以战舰版的四个键为例定义):按键触发条件
#define KEY0_PRESSED                                 (Trg==0x0001)
#define KEY1_PRESSED                                 (Trg==0x0002)
#define KEY2_PRESSED                                 (Trg==0x0004)
#define WKUP_PRESSED                               (Trg==0x0008)
//宏定义:按键未释放值
#define KEY0_ON                                                 0x0001
#define KEY1_ON                                                 0x0002
#define KEY2_ON                                                 0x0004
#define WKUP_ON                                                 0x0008

组合按键KEY0+WKUP组合按键(先按下WKUP再按下KEY0)的判断原则是:
WKUP和KEY0处于按下状态,且检测到KEY0触发。
对应语句为 if((Cont==(KEY0_ON+WKUP_ON)) && KEY0_PRESSED)
假如想要先按下KEY0再按下WKUP也起作用,则判断语句为:
if((Cont==(KEY0_ON+WKUP_ON)) && WKUP_PRESSED)
323232
3楼-- · 2019-07-22 23:05
.......状态机?
warship
4楼-- · 2019-07-22 23:29
323232 发表于 2018-8-16 08:48
.......状态机?

不是状态机,是普通程序,只不过设计比较巧妙而已,其实听懂了很简单
ssssssssssss
5楼-- · 2019-07-23 03:47
 精彩回答 2  元偷偷看……
Snail_Feng
6楼-- · 2019-07-23 07:38
参考armfly 他们的做的很不错

一周热门 更多>