按键识别方法、装置、设备及存储介质
文献发布时间:2023-06-19 11:49:09
技术领域
本发明实施例涉及微型计算机(单片机)技术领域,尤其涉及按键识别方法、装置、设备及存储介质。
背景技术
随着微型计算机技术的发展,带有按键的智能设备得到了广泛的应用。按键作为人机交互的重要桥梁,按键识别对于智能设备尤为重要。
按键识别是按键按下动作的识别过程,按键按下到弹起视为一次按键有效按下,需要由用户程序进行响应。按键在按下的过程中可能由于受到电磁干扰等原因出现短暂中断的抖动现象,按键识别需要消除这些抖动,这一过程即为防抖。由于“按下”和“识别按下”的时刻不一致时,会导致按下的动作没有被成功识别到,出现遗漏现象,按键识别需要防止出现遗漏现象,这一过程即为防漏。按键识别的关键在于防抖和防漏,防抖是防止多了一些无效按键值,防漏是防止少了一些有效按键值。
目前,用户程序获得按键值的方式分为阻塞和非阻塞,阻塞和非阻塞指的是用户程序在等待返回按键结果(也即按键识别结果)时的状态。阻塞时,在等待按键结果返回前,当前程序会被挂起(暂停运行),并在得到按键结果之后返回(恢复运行);非阻塞时,用户程序定期查看按键结果,无需暂停等待,如果不能立刻得到按键结果,程序也不会暂停运行。阻塞方式会导致按键响应慢,影响设备运行效率,然而,现有技术中若采用非阻塞方式,则无法做到很好地防抖或防漏,因此,现有的按键识别方案并不完善,需要改进。
发明内容
本发明实施例提供了按键识别方法、装置、设备及存储介质,可以优化现有的按键识别方案。
第一方面,本发明实施例提供了一种按键识别方法,包括:
采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;
根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;
从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。
第二方面,本发明实施例提供了一种按键识别装置,包括:
按键状态采集模块,用于采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;
键值码写入模块,用于根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;
按键分析模块,用于从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。
第三方面,本发明实施例提供了一种智能设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如本发明实施例提供的按键识别方法。
第四方面,本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明实施例提供的按键识别方法。
本发明实施例中提供的按键识别方案,采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。通过采用上述技术方案,对按键的按键状态进行多次采样并计数,对满足计数值要求的键值码进行后续处理,可以有效实现按键防抖,将满足计数值要求的键值码存入队列中,等待后续的读取和分析,可以有效实现按键防漏,最终实现按键的准确识别,提升按键响应效率以及准确率,改善人机交互效果。
附图说明
图1为本发明实施例提供的一种按键识别方法的流程示意图;
图2为本发明实施例提供的又一种按键识别方法的流程示意图;
图3为本发明实施例提供的一种按键识别方法的功能模块组成示意图;
图4为本发明实施例提供的一种键值获取流程示意图;
图5为本发明实施例提供的一种预设键值码队列示意图;
图6为本发明实施例提供的一种键值存入流程示意图;
图7为本发明实施例提供的一种键值读取流程示意图;
图8为本发明实施例提供的一种键值分析流程示意图;
图9为本发明实施例提供的一种按键识别装置的结构框图;
图10为本发明实施例提供的一种智能设备的结构框图。
具体实施方式
下面结合附图并通过具体实施方式来进一步说明本发明的技术方案。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各步骤描述成顺序的处理,但是其中的许多步骤可以被并行地、并发地或者同时实施。此外,各步骤的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
图1为本发明实施例提供的一种按键识别方法的流程示意图,该方法可以由按键识别装置执行,其中该装置可由软件和/或硬件实现,一般可集成在智能设备中,具体可以是微型计算机设备,其中,智能设备例如可以是配置有按键的手机或平板电脑等设备,还可以是工业中的配置有按键的各种生产设备、控制设备、测量设备或检测设备等等,还可以是其他配置有按键的设备,具体不做限定。可选的,智能设备中可包含单片机,用于实现所述按键识别方法的程序可存储于单片机中。如图1所示,该方法包括:
步骤101、采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起。
示例性的,智能设备中一般可以配置多个按键,本发明实施例中,按键的具体数量以及所在位置等不做具体限定。以一种常见的工业设备为例,一般配置有按键面板,按键面板上可以包含多个按键,例如“上”、“下”、“左”、“右”、“确认”和“取消”。
示例性的,当用户的手指等部位向下按压按键开始到松开手指之前,按键持续处于被按压的状态,这种状态能够被智能设备采集到,一般可通过扫描按键的电平状态(如高电平)实现,此时采集到的按键状态称为按下状态,以下简称按下;在用户手指未按压按键,或当用户手指按压并离开按键后,按键处于未被按压的状态,这种状态能够被智能设备采集到,一般可通过扫描按键的电平状态(如低电平)实现,此时采集到的按键状态称为弹起状态,以下简称弹起。
示例性的,可以采用预设频率周期性地采集(也即每经过预设时间间隔采集一次)按键的按键状态,预设频率可以根据实际需求设置,具体数值不做限定,一般需要保证一次有效的按键操作持续时长内可以多次采集按键状态,例如,用户正常按下按键到抬起的时长为200毫秒,预设频率可以设置为30毫秒每次,正常情况下一般可以采集到按键的6至7次的按键状态为按下。
本发明实施例中,需要进行按键状态采集的按键可以包括智能设备中的全部按键或部分按键,具体不做限定。当需要进行按键状态采集的按键的数量为至少两个时,可以顺次针对单个按键进行采集,也可以并行地采集多个按键的按键状态,可根据实际情况进行设置。
步骤102、根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应。
示例性的,可以针对每个按键分别设置对应的状态计数器,用于对单个按键的按键状态进行一定程度的连续地统计。按键在按下的过程中可能由于受到电磁干扰等原因出现短暂中断的抖动现象,也即因受到干扰使得用户原本在按压按键未松开的情况下被误识别为弹起,当干扰消失后,又识别到按下,用户松开后,再次识别到弹起,现有技术中由于未进行防抖处理,会导致用户的一次按键操作被误识别为两次。而本申请中,可以根据周期性采集的按键状态来更新相应的按键的状态计数器的计数值,例如,针对按键A,对应的状态计数器的计数值为a,周期性采集按键A的按键状态,每次采集到按键状态后就对a进行更新,实现按键A的按键状态连续统计,根据a是否处于预设数值范围内,来确定按键A的按键状态是否足够稳定,若足够稳定,则可以用于后续的分析,例如,若a处于预设数值范围内,则将按键A对应的键值码写入预设键值码队列中,用于后续的分析。
其中,状态计数器的计数值的更新方式具体不做限定,按下和抬起可以分别进行计数,也可统一计数。以单独统计按下为例,当前采集的按键状态为按下,则计数值加1,当前采集的按键状态为抬起,则计数值不变或减1。以统一统计按下和抬起为例,在当前采集的按键状态为按下时,则将当前计数值加1;在当前采集的按键状态为弹起时,则将当前计数值减1。
示例性的,预设数值范围可以根据实际需求设置,一般可针对按下和抬起设置不同的预设数值范围,具体不做限定。
示例性的,键值码中包括键值和按键状态,键值与按键的名称相对应,也即对于不同的按键来说,对应的键值是不同的。键值码可以通过对按键名称和按键状态进行编码得到,具体编码方式不做限定。
示例性的,预设键值码队列可以由键值码缓存库实现,键值码的写入可称为入库,键值码的读取可称为出库。本发明实施例对预设键值码队列的存储空间大小不做限定,可以根据实际情况设置。键值码可以按照时间顺序依次被写入预设键值队列中,以便后续进行读取时准确地得知按键状态变化的时序。
步骤103、从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。
本发明实施例中,将键值码存储到预设键值码队列中,即使用户程序未能及时处理,按键状态也不会遗失,按键识别不会出现遗漏现象,这样,也就允许用户程序能够以非阻塞的方式进行按键识别,提高设备运行效率。
示例性的,可以从预设键值码队列中依次获取键值码,例如,按照键值码存储的时间先后顺序,每次从预设键值队列中读取一个或多个键值码,并对所获取的键值码进行分析,得到按键识别结果。具体的分析过程不做限定,一般可参考历史读取的键值码和当前获取的键值码进行逻辑运算和/或判定等分析,得到最终的按键识别结果。
本发明实施例中提供的按键识别方法,采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。通过采用上述技术方案,对按键的按键状态进行多次采样并计数,对满足计数值要求的键值码进行后续处理,可以有效实现按键防抖,将满足计数值要求的键值码存入队列中,等待后续的读取和分析,可以有效实现按键防漏,最终实现按键的准确识别,提升按键响应效率以及准确率,改善人机交互效果。
在一些实施例中,所述根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,包括:在当前采集的按键状态为按下时,若相应按键的状态计数器的当前计数值小于预设防抖周期数,则将当前计数值加1;在当前采集的按键状态为弹起时,若相应按键的状态计数器的当前计数值小于所述预设防抖周期数,则将当前计数值减1。这样设置的好处在于,可以合理准确地对按键状态中的按下和弹起进行统计,有效实现按键防抖。其中,预设防抖周期数可以根据实际情况设置,如上文举例,用户正常按下按键到抬起的时长为200毫秒,预设频率可以设置为30毫秒每次,预设防抖周期数可以设置为6。若在100毫秒处出现抖动,此时计数值不能达到6,不会放入预设键值码队列,也即不会被识别,实现防抖。
进一步的,在将当前计数值加1后,若所述计数值等于所述预设防抖周期数,将相应按键的按键状态为按下的键值码写入预设键值码队列;在将当前计数值减1后,若所述计数值等于0,将相应按键的按键状态为弹起的键值码写入所述预设键值码队列。这样设置的好处在于,可以及时准确地将键值码写入预设键值码队列,便于更高效地进行按键分析。如上述举例,当抖动消失后,计数值继续更新,在达到6后,再放入预设键值码队列,保证本次按键操作仅被识别一次。
在一些实施例中,若顺次针对单个按键进行按键状态的采集,可选的,在当前采集的按键状态为按下时,若相应按键的状态计数器的当前计数值大于或等于预设防抖周期数,则进行下一个按键的按键状态的采集;在当前采集的按键状态为弹起时,若相应按键的状态计数器的当前计数值大于或等于所述预设防抖周期数,则进行下一个按键的按键状态的采集。
可选的,在将当前计数值加1后,若所述计数值不等于所述预设防抖周期数,则进行下一个按键的按键状态的采集;在将当前计数值减1后,若所述计数值不等于0,则进行下一个按键的按键状态的采集。
在一些实施例中,所述将相应按键的键值码写入预设键值码队列,包括:判断预设键值码队列中是否存在剩余空间,若存在,则将相应按键的键值码写入预设键值码队列中的当前存储位置,并将当前存储位置加1,若当前存储位置溢出,则将当前存储位置置为0。相应的,所述从所述预设键值码队列中依次获取键值码,包括:判断所述预设键值码队列中是否存在未读取的键值码,若存在,则将当前读取位置对应的键值码取出,并将当前读取位置加1,若当前读取位置溢出,则将当前读取位置置为0。这样设置的好处在于,通过上述的溢出处理方式,可以节省预设键值码队列的存储空间,实现循环存储和读取。其中,当前存储位置可以理解为一个指针,指向的是当前可以存入键值码的位置;当前读取位置也可以理解为一个指针,指向的是当前可以读取键值码的位置。可选的,可以根据当前存储位置、当前读取位置以及预设键值码队列的存储空间大小来判断是否存在剩余空间,例如根据当前存储位置和当前读取位置的差值是否大于存储空间大小来判断,若大于则不存在,若小于或等于则存在。
在一些实施例中,所述键值码采用比特位进行编码,一个比特位用于表示按键状态,其余比特位用于表示键值,且所述其余比特位中的每个比特位对应一个按键。例如,将每个按键“按下”和“弹起”的状态使用数字表示,该数字的最高比特位1和0分别代表“按下”和“弹起”,其余每一个比特位代表一个按键。当按键数小于8时使用1字节数字表示,当按键数小于16时使用2字节数表示,当按键数小于32时使用4字节数表示,以此类推。1字节键值编码如:0x81代表1#按键按下、0x01代表1#按键弹起;0x82代表2#按键按下、0x02代表2#按键弹起;0x84代表3#按键按下、0x04代表3#按键弹起;0x88代表4#按键按下、0x08代表4#按键弹起;0x90代表5#按键按下、0x10代表5#按键弹起;以此类推。
在一些实施例中,所述对所获取的键值码进行分析,得到按键识别结果,包括:根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果确定按键识别结果,其中,所述当前获取的键值为当前获取的键值码中的键值,当前键值由所述上次键值和所述当前获取的键值进行位或运算得到,若所述当前获取的键值为首个获取到的键值,则所述上次键值与所述当前获取的键值相同或为0,若所述当前获取的键值不为首个获取到的键值,则所述上次键值与上一次获取键值后计算得到的新的当前键值相同。这样设置的好处在于,考虑按键状态变化的时序,对键值的变化进行动态分析,得出准确的有效按键分析结果。其中,在根据运算结果确定按键识别结果时,一般需要参考当前获取的键值码中的按键状态,也即根据运算结果和当前获取的键值码中的按键状态确定按键识别结果。
在一些实施例中,至少两个按键允许被同时按下;所述根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果确定按键识别结果,包括:在当前获取的键值码中的键值有效的情况下,判断当前键值是否大于上次键值,若是,则将当前键值记为上次键值,若否,则当前键值不变;判断当前获取的键值码中的按键状态是否为弹起,若为弹起,则将当前键值和当前获取的键值按位取反后的值进行位与运算,得到新的当前键值;若所述新的当前键值与上次键值不相等,且所述新的当前键值为0,则将上次键值确定为有效键值,所述有效键值供用户程序进行读取并在读取成功后进行相应的按键响应。这样设置的好处在于,考虑组合按键的情况,也即允许至少两个按键被同时按下和抬起,从而实现更丰富的按键操作,针对组合按键的情况,采用上述分析方式可以准确分析出有效键值,也即准确识别出用户的真实按键操作意图。
其中,当前获取的键值码中的键值有效可以理解为成功获取到键值码中的键值,若键值为0或空,则说明未成功获取到,则键值无效。
对于支持组合按键的情况,由于当前键值由上次键值和当前获取的键值进行位或运算得到,假设上次键值为001,当前获取的键值为010,经过或运算后可以得到011,则当前键值大于上次键值,也即可能出现了两个按键同时被用户按下的情况。此时,可以暂时将当前键值记为上次键值,用于后续判断当前键值是否被清零,进而确定上次键值是否为有效键值。
在一些实施例中,在所述判断当前获取的键值中的按键状态是否为弹起之后,还包括:若不为弹起,则将当前键值和当前获取的键值进行位或运算,得到新的当前键值。在按键状态不为弹起,也即按键状态为按下时,需要进行位或运算,再进行后续的判定。
在一些实施例中,在得到新的当前键值之后,还包括:若所述新的当前键值与上次键值相等,或所述新的当前键值不为0,则继续从所述预设键值码队列中获取下一个键值码。
图2为本发明实施例提供的又一种按键识别方法的流程示意图,该方法包括如下步骤:
步骤201、采用预设频率周期性依次采集各按键的按键状态。
其中,按键状态包括按下和弹起。
步骤202、在当前采集的按键状态为按下时,若相应按键的状态计数器的当前计数值小于预设防抖周期数,则将当前计数值加1;在当前采集的按键状态为弹起时,若相应按键的状态计数器的当前计数值小于预设防抖周期数,则将当前计数值减1。
步骤203、在将当前计数值加1后,若计数值等于所述预设防抖周期数,将相应按键的按键状态为按下的键值码写入预设键值码队列;在将当前计数值减1后,若计数值等于0,将相应按键的按键状态为弹起的键值码写入预设键值码队列。
其中,键值码中包括键值和按键状态,键值与按键的名称相对应。键值码采用比特位进行编码,一个比特位用于表示按键状态,其余比特位用于表示键值,且其余比特位中的每个比特位对应一个按键。
步骤204、从预设键值码队列中依次获取键值码,根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果和当前获取的键值码中的按键状态确定按键识别结果。
本发明实施例提供的按键识别方法,对各个按键分别进行周期性的按键状态的采样并计数,对满足计数值要求的键值码进行后续处理,可以有效实现按键防抖,将满足计数值要求的键值码存入队列中,从队列中依次读取键值码,可以有效实现按键防漏,根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果和当前获取的键值码中的按键状态确定按键识别结果,有效提升按键响应效率以及准确率,改善人机交互效果。
图3为本发明实施例提供的一种按键识别方法的功能模块组成示意图,如图3所示包括键值获取、键值存取和键值分析三个功能模块。键值获取功能模块中可以实现定期扫描按键电平状态并输出变化后的键值。键值存取功能模块中可以实现键值码缓存库,为键值存取提供入库出库接口。键值分析功能模块中可以实现根据一组或多组键值和按键状态进行统筹分析得出有效键值。键值获取功能模块与键值存取模块相连,键值获取功能模块将获得到的键值码通过键值存取模块提供的入库接口存放到键值码缓存库中。键值存取功能模块与键值分析功能模块相连,键值分析功能模块通过键值存取功能模块的出库接口取出键值码,通过键值和按键状态统筹分析获得有效键值。
下面将按键识别方法的整个流程划分为三个部分分别进行进一步详细介绍。
图4为本发明实施例提供的一种键值获取流程示意图,如图4所示,键值获取功能模块中,独立循环调度定期扫描多个按键电平状态,根据持续状态累计周期次数输出“按下”和“弹起”的键值码,具体实施流程如下:
步骤401、键值编码,设定按键数K和预设防抖周期数N。
其中,键值编码过程可参考上文相关内容,此处不再赘述。按键数K(K>0)可理解为预设最大按键数,也即需要进行按键识别的按键总数,一般为设备中同一个按键面板上的所有按键。预设防抖周期数N(N>1)也可称为最大防抖周期数。
步骤402、调度延时等待T毫秒。
按键状态的获取过程是一个独立的反复循环的过程,一个循环执行完,等待T(T>0)毫秒(ms)后再执行下一个循环,延时T可根据实际防抖时间要求自行设定,可理解为预设频率的倒数。
步骤403、按键代号k赋初值1。
从第1个按键开始,直到第K个按键结束,循环获取每个按键的按键状态,进而得到相应的键值码。也即,每隔T毫秒,从第1个按键开始依次进行按键状态的扫描。
步骤404、获取k号按键状态。
步骤405、判断k号按键状态是否为按下,若是,则执行步骤406;否则,执行步骤410。
步骤406、判断k号按键按下状态计数器c是否小于N,若是,则执行步骤407;否则,执行步骤414。
步骤407、c自增1,c=c+1。
步骤408、判断c是否等于N,若是,则执行步骤409;否则,执行步骤414。
步骤409、k号按键按下键值码入库。
通过执行本步骤,可以成功获得k号按键“按下”状态的键值码,并调用按键存取功能模块中入库接口将键值码存放到键值码缓存库中。
步骤410、判断c是否小于N,若是,则执行步骤411;否则,执行步骤414。
步骤411、c自减1,c=c-1。
步骤412、判断c是否等于0,若是,则执行步骤413;否则,执行步骤414。
步骤413、k号按键弹起键值码入库。
通过执行本步骤,可以成功获得k号按键“弹起”状态的键值码,并调用按键存取功能模块中入库接口将键值码存放到键值码缓存库中。
步骤414、按键代号k自增1,k=k+1。
步骤415、判断k是否大于K,若是,则执行步骤402;否则,执行步骤404。
通过采用上述流程,可以准确地实现有效的键值码的入库,为后面的准确分析有效键值做准备。
图5为本发明实施例提供的一种预设键值码队列示意图,图6为本发明实施例提供的一种键值存入流程示意图,图7为本发明实施例提供的一种键值读取流程示意图,参考图5、图6和图7,键值存取功能模块,包括键值码缓存库信息定义、键值码入库流程和键值码出库流程。
预设键值码队列,又称键值码缓存库,可记为缓存(BUFFER),键值码缓存库信息包括空间大小S、位置从0开始到S-1结束、存储位置H、读取位置T,每个空间暂存键值码数据。
参考图6,BUFFER中由入库接口实现,键值码入库实施流程如下:
步骤601、判断缓存是否存在空间,若是,则执行步骤602;否则,结束流程。
可以通过如下表达式判断是否存在空间:
((H>=T)&&((H-T)>=S))||((H
若满足上述表达式,则认为存在空间,若不满足,则认为不存在空间。
步骤602、H位置缓存填写键值码E。
键值码缓存库中存储位置H对应空间填写键值码E,可记为BUFFER[H]=E。
步骤603、H位置自增1。
可记为H=H+1。
步骤604、判断H位置是否溢出,若是,则执行步骤605;否则,结束流程。
例如,通过判断存储位置H是否大于缓存库空间大小S来判断存储位置H是否溢出,也即H>=S时执行步骤605。
步骤605、H位置置为0。
可记为H=0,即从缓存库开头空间处再进行键值码存储。
参考图7,从BUFFER中读取键值码由出库接口实现,键值出库实施流程如下:
步骤701、判断缓存是否存在新数据,若是,则执行步骤702;否则,结束流程。
例如,可以通过存储位置H是否等于读取位置T来判断键值码缓存库是否存在新的数据(可理解为未读取的键值码),也即判断是否H==T,若是,则进行步骤702,取出键值码,反之则结束出库流程,取出空键值。
步骤702、取出T位置缓存键值码E。
步骤703、T位置自增1。
步骤704、判断T位置是否溢出,若是,则执行步骤705;否则,结束流程。
示例性的,通过读取位置T是否大于缓存库空间大小S来判断读取位置T是否溢出,若溢出则进行步骤S205,反之则结束出库流程。
步骤705、T位置置为0。
示例性的,读取位置T置0,从缓存库开头空间处再进行读取键值。
图8为本发明实施例提供的一种键值分析流程示意图,参考图8,键值分析功能模块中,通过键值存取功能模块出库接口循环取出键值码进行统筹分析,结合键值“位或”、“位取反”以及“位与”等运算比较输出有效键值,在整个统筹分析过程中预设当前键值C和上次键值L,键值分析流程如下:
步骤801、初始化待返回的有效键值Q为空值。
也即,初始化Q=0,用于异常结束流程时返回空值0。
步骤802、键值码出库,取出键值R及状态M。
通过键值存取功能模块中出库接口获取到键值码,键值码中包括键值R和状态M等信息,从键值码中取出R和M。
步骤803、判断键值R是否有效,若是,则执行步骤804;否则,结束流程。
示例性的,可以通过键值R是否不等于0来判断键值是否有效,也即判断是否满足R!=0,若满足,则认为有效,继续执行步骤804,反之,则结束整个流程,返回空键值0,也即Q=0。
步骤804、判断C是否大于L,若是,则执行步骤805;否则,执行步骤806。
示例性的,判断当前键值C是否大于上次键值L,若大于,则进行步骤805,记录当前键值为上次键值,反之,则跳过步骤805,直接进行步骤806,判断键值状态。
步骤805、将C记录为L。
步骤806、判断M是否大于0,若是,则执行步骤807;否则,执行步骤808。
示例性的,若C不大于L,则C可保持不变。可以通过M是否大于0来判断键值状态M是否为“按下”状态,若是“按下”状态,则进行步骤807,反之是“弹起”状态,则进行步骤808。
步骤807、C按位“或”上R,得到新的C。
示例性的,将当前键值C按位“或”上键值R,并将结果赋值给当前键值C,C=C|R,也即相当于将当前键值和当前获取的键值R进行位或运算,将结果作为上文所述的新的当前键值。
步骤808、C按位“与”上R的取反值,得到新的C。
示例性的,先将键值R按位“取反”,再按位“与”上当前键值C,将结果赋值给当前键值C,C=C&(~R),也即相当于将当前键值和当前获取的键值R按位取反后的值进行位与运算,将结果作为上文所述的新的当前键值。
步骤809、判断C和L是否不相等,若是,则执行步骤810;否则,返回执行步骤802。
示例性的,判断当前键值C(也即新的当前键值)与上次键值L是否不相等,也即是否满足C!=L,若满足,则进行步骤810,反之则进行步骤802,重复上述流程。
步骤810、判断C是否为0,若是,则执行步骤811;否则,返回执行步骤802。
示例性的,判断当前键值C(也即新的当前键值)是否为0,也即判断是否满足C==0,若是,则进行步骤811,反之则进行步骤802,重复上述流程。
步骤811、获得有效键值Q为L。
示例性的,上次键值L即为有效键值Q,获得有效键值Q,结束流程输出有效键值Q,供用户程序读取。
为了便于理解上述键值分析流程,举个简单的例子,假设以4个比特位表示一个键值码,假设1号按键对应的键值为001,按下的键值码为1001,抬起的键值码为0001。用户正常按下1号按键后抬起,在键值获取阶段,可以先后获取到键值码1001和0001放入预设键值码队列中,并在键值码出库过程中依次被读取,具体细节不做赘述。
首先,初始化有效键值Q为0,取出键值码1001,此时键值R为001,状态M为1,键值R有效,由于是首次读取,上次键值L为0,当前键值C=L|R=001,C不大于L,则当前键值为C=001,M大于0,新的当前键值C=C|R=001,C与L不等,C不为0,因此,需要取出下一个键值码。其中,若假设首次读取时上次键值L与R相同,则C等于L,也需要取出下一个键值码。
下一个键值码为0001,此时键值R为001,状态M为0,键值R有效,由于不是首次读取,上次键值L为上一次获取键值码1010后计算得到的新的当前键值001,即L=001,本次的当前键值C=L|R=001,C不大于L,则当前键值为C=001,M不大于0,新的当前键值C=C&(~R)=000,C与L不等,C为0,因此,将上次键值L=001作为有效键值,也即Q=001,说明当前成功识别到了1号按键的按压操作,由用户程序进行读取并响应该按压操作。
图9为本发明实施例提供的一种按键识别装置的结构框图,该装置可由软件和/或硬件实现,一般可集成在智能设备中,可通过执行按键识别方法来进行按键识别。如图9所示,该装置包括:
按键状态采集模块901,用于采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;
键值码写入模块902,用于根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;
按键分析模块903,用于从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。
本发明实施例中提供的按键识别装置,采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。通过采用上述技术方案,对按键的按键状态进行多次采样并计数,对满足计数值要求的键值码进行后续处理,可以有效实现按键防抖,将满足计数值要求的键值码存入队列中,等待后续的读取和分析,可以有效实现按键防漏,最终实现按键的准确识别,提升按键响应效率以及准确率,改善人机交互效果。
可选的,所述键值码写入模块,具体用于:
在当前采集的按键状态为按下时,若相应按键的状态计数器的当前计数值小于预设防抖周期数,则将当前计数值加1;在当前采集的按键状态为弹起时,若相应按键的状态计数器的当前计数值小于所述预设防抖周期数,则将当前计数值减1;
在将当前计数值加1后,若所述计数值等于所述预设防抖周期数,将相应按键的按键状态为按下的键值码写入预设键值码队列;在将当前计数值减1后,若所述计数值等于0,将相应按键的按键状态为弹起的键值码写入所述预设键值码队列。
可选的,所述将相应按键的键值码写入预设键值码队列,包括:
判断预设键值码队列中是否存在剩余空间,若存在,则将相应按键的键值码写入预设键值码队列中的当前存储位置,并将当前存储位置加1,若当前存储位置溢出,则将当前存储位置置为0;
相应的,所述从所述预设键值码队列中依次获取键值码,包括:
判断所述预设键值码队列中是否存在未读取的键值码,若存在,则将当前读取位置对应的键值码取出,并将当前读取位置加1,若当前读取位置溢出,则将当前读取位置置为0。
可选的,所述键值码采用比特位进行编码,一个比特位用于表示按键状态,其余比特位用于表示键值,且所述其余比特位中的每个比特位对应一个按键;
所述对所获取的键值码进行分析,得到按键识别结果,包括:
根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果确定按键识别结果,其中,所述当前获取的键值为当前获取的键值码中的键值,当前键值由所述上次键值和所述当前获取的键值进行位或运算得到,若所述当前获取的键值为首个获取到的键值,则所述上次键值与所述当前获取的键值相同或为0,若所述当前获取的键值不为首个获取到的键值,则所述上次键值与上一次获取键值后计算得到的新的当前键值相同。
可选的,至少两个按键允许被同时按下;所述根据当前获取的键值、当前键值和上次键值进行逻辑运算,根据运算结果确定按键识别结果,包括:
在当前获取的键值码中的键值有效的情况下,判断当前键值是否大于上次键值,若是,则将当前键值记为上次键值,若否,则当前键值不变;
判断当前获取的键值码中的按键状态是否为弹起,若为弹起,则将当前键值和当前获取的键值按位取反后的值进行位与运算,得到新的当前键值;
若所述新的当前键值与上次键值不相等,且所述新的当前键值为0,则将上次键值确定为有效键值,所述有效键值供用户程序进行读取并在读取成功后进行相应的按键响应。
可选的,在所述判断当前获取的键值中的按键状态是否为弹起之后,还包括:
若不为弹起,则将当前键值和当前获取的键值进行位或运算,得到新的当前键值。
可选的,所述按键分析模块用于:在得到新的当前键值之后,若所述新的当前键值与上次键值相等,或所述新的当前键值不为0,则继续从所述预设键值码队列中获取下一个键值码。
本发明实施例提供了一种智能设备,该智能设备中可集成本发明实施例提供的按键识别装置。图10为本发明实施例提供的一种智能设备的结构框图。智能设备1000可以包括:存储器1001,处理器1002及存储在存储器1001上并可在处理器1002运行的计算机程序,所述处理器1002执行所述计算机程序时实现如本发明实施例所述的按键识别方法。
本发明实施例还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行本发明任意实施例提供的按键识别方法,例如,该方法可包括:
采用预设频率周期性采集按键的按键状态,其中,所述按键状态包括按下和弹起;
根据所采集的按键状态更新相应按键的状态计数器的计数值,并在所述计数值处于预设数值范围内时,将相应按键的键值码写入预设键值码队列,其中,所述键值码中包括键值和按键状态,所述键值与按键的名称相对应;
从所述预设键值码队列中依次获取键值码,并对所获取的键值码进行分析,得到按键识别结果。
存储介质——任何的各种类型的存储器设备或存储设备。术语“存储介质”旨在包括:安装介质,例如CD-ROM、软盘或磁带装置;计算机系统存储器或随机存取存储器,诸如DRAM、DDRRAM、SRAM、EDORAM,兰巴斯(Rambus)RAM等;非易失性存储器,诸如闪存、磁介质(例如硬盘或光存储);寄存器或其它相似类型的存储器元件等。存储介质可以还包括其它类型的存储器或其组合。另外,存储介质可以位于程序在其中被执行的第一计算机系统中,或者可以位于不同的第二计算机系统中,第二计算机系统通过网络(诸如因特网)连接到第一计算机系统。第二计算机系统可以提供程序指令给第一计算机用于执行。术语“存储介质”可以包括可以驻留在不同位置中(例如在通过网络连接的不同计算机系统中)的两个或更多存储介质。存储介质可以存储可由一个或多个处理器执行的程序指令(例如具体实现为计算机程序)。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的按键识别操作,还可以执行本发明任意实施例所提供的按键识别方法中的相关操作。
上述实施例中提供的按键识别装置、设备及存储介质可执行本发明任意实施例所提供的按键识别方法,具备执行该方法相应的功能模块和有益效果。未在上述实施例中详尽描述的技术细节,可参见本发明任意实施例所提供的按键识别方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
- 一种防潮按键识别方法、装置、电子设备以及可读存储介质
- 触摸按键的触摸识别方法、装置、设备和存储介质