掌桥专利:专业的专利平台
掌桥专利
首页

一种基于状态机原理获取长按键键值的方法

文献发布时间:2023-06-19 18:37:28


一种基于状态机原理获取长按键键值的方法

技术领域

本发明属于按键键值获取技术领域,具体涉及一种基于状态机原理获取长按键键值的方法。

背景技术

带按键的终端设备存在于各行各业,在日常生活中,带按键的终端设备也是随处可见,屡见不鲜,如手机,遥控器,洗衣机等设备上的按键有多种,按键种类包括单按键、组合键和触摸键等,单按键是最常见的一种按键,但很容易受到数量和成本的限制,一旦受限,原有功能可能无法实现。组合键似乎可以触决单按键的问题,但分析后发现,组合键操作过于复杂,常人也无法将所有组合键都一一记住,更重要的是人手无法实现两个按键同时按下,往往返回错误的键值。触摸键存在不灵敏,易受温度影响,稳定性不高等问题。而长按键可以轻松解决上述出现的问题,长按键是在单按键的基础上获得的,获取的键值是单按键的两倍,在相同功能下,可以减少按键数目,降低成本;同时具备稳定性高,操作简单,灵敏度高,不受外界环境影响等优点。

然而,目前长按键实现方式,具有实现过程复杂的问题。

发明内容

针对现有技术存在的缺陷,本发明提供一种基于状态机原理获取长按键键值的方法,可有效解决上述问题。

本发明采用的技术方案如下:

本发明提供一种基于状态机原理获取长按键键值的方法,包括以下步骤:

步骤S1,将键盘的每个按键连接到设备MCU的检测端,配置按键被按下时产生的低电平信号作为按键中断EXT_IT的中断触发信号;

设备MCU初始化,设定定时器Timer0的定时时间为T0,此时定时器Timer0为关闭状态;设定按键的时间计数变量Count的初始值为0;

步骤S2,设备MCU检测是否产生按键中断EXT_IT的中断触发信号,如果有,则执行步骤S3;否则继续等待;

步骤S3,设备MCU调用并执行外部中断处理函数IRQ_EXT,执行按键中断处理流程,包括:将状态机状态值Status置为第一状态值status0;

步骤S4,开启定时器Timer0,开始计时;

步骤S5,判断定时器Timer0是否产生计数溢出中断Timer0_IT,如果有,则执行步骤S6;否则继续等待;

步骤S6,设备MCU调用并执行定时器中断处理函数IRQ_Timer0,具体过程为:

步骤S6.1,清除本次定时器Timer0计数溢出中断产生的中断标志位;设备MCU读取当前按键的键值Key_now;

读取状态机当前状态值Status,如果为第一状态值status0,则执行步骤S6.2;如果为第二状态值status1,则执行步骤S6.3;如果为第三状态值status2,则执行步骤S6.4;

步骤S6.2,状态机第一状态执行过程:

设备MCU获取当前按键的键值Key_now,其中,如果键值Key_now为0,代表按键被释放;如果键值Key_now不为0,代表按键未被释放;

设备MCU判断键值Key_now是否满足以下条件:键值Key_now不为0且为合法值,如果是,则将状态机状态值Status置为第二状态值status1,然后执行步骤S7;如果否,则将状态机状态值Status置为第三状态值status2,然后执行步骤S7;

步骤S6.3,状态机第二状态执行过程:

步骤S6.3.1,设备MCU获取当前按键的键值Key_now;

步骤S6.3.2,设备MCU判断键值Key_now是否满足以下条件:键值Key_now不为0且为合法值,如果是,执行步骤S6.3.3;如果否,则将状态机状态值Status置为第三状态值status2,然后执行步骤S7;

步骤S6.3.3,将状态机状态值Status置为第二状态值status1,并令按键的时间计数变量Count=Count+1;

判断按键的时间计数变量Count是否大于设定的长按键时间阀值Count_long,如果否,则执行步骤S7;如果是,则将状态机状态值Status置为第三状态值status2,然后执行步骤S7;

步骤S6.4,状态机第三状态执行过程:

步骤S6.4.1,设备MCU检测是否满足以下条件之一:条件1,当前按键的键值Key_now为0;条件2,按键的时间计数变量Count大于设定的长按键时间阀值Count_long;如果满足,则执行步骤S6.4.2;如果不满足,则令状态机状态值Status置为第一状态值status0,令按键的时间计数变量Count为0,令当前按键的键值Key_now为0,然后执行步骤S7;

步骤S6.4.2,判断按键的时间计数变量Count是否大于设定的长按键时间阀值Count_long,如果是,则按键的键值为长按键键值,否则,按键的键值为短按键键值;然后执行步骤S7;

步骤S7,判断按键是否被释放,即:按键的键值Key_now是否为0,如果被释放,则返回步骤S2,等待下一次产生按键中断EXT_IT的中断触发信号;如果未被释放,则返回步骤S4,再次开启定时器Timer0开始计时。

优选的,步骤S1中,配置按键被按下时产生的低电平信号作为按键中断EXT_IT的中断触发信号,具体为:

键盘包括n行m列个按键;

设备MCU包括n个行引脚m个列引脚;每个列引脚与对应的同一列的各个按键相连;每个行引脚与对应的同一行的各个按键相连;

当某个按键被按下时,设备MCU逐行扫描各行按键,直到扫描到某行产生低电平信号;再对该行的各个按键进行逐个扫描,定位到产生低电平信号的具体按键,并获取按键的键值Key_now。

优选的,步骤S3,设备MCU调用并执行外部中断处理函数IRQ_EXT,执行按键中断处理流程,具体为:

步骤S3.1,清除本次按键中断产生的中断标志位;

步骤S3.2,暂时关闭外部中断使能,防止产生干扰,影响本次键值的读取;

步骤S3.3,将状态机状态值Status置为第一状态值status0。

本发明提供的一种基于状态机原理获取长按键键值的方法具有以下优点:

本发明可以获取较单按键两倍的键值,在相同功能下,可以减少按键数目,降低了成本。同时具备稳定性高,操作简单,灵敏度高,不受外界环境影响以及实现过程简单等优点。

附图说明

图1为本发明提供的根据按键原理获取被按下键的键值的示意图;

图2为本发明提供的基于状态机原理获取长按键键值的方法的流程总图;

图3为本发明提供的外部中断处理函数的处理流程图;

图4为本发明提供的定时器中断处理函数的处理流程图;

图5为本发明提供的状态机轮转流程示意图。

具体实施方式

为了使本发明所解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

本发明提供一种利用状态机原理通过时间计数获得长按键键值的方法,结合按键产生的中断信号以及定时器的定时功能,将按键按下到时间计数,到释放按键的整个过程,分为三个状态,通过状态机进行轮转,从而获取键值。本发明可以获取较单按键两倍的键值,在相同功能下,可以减少按键数目,降低了成本。同时具备稳定性高,操作简单,灵敏度高,不受外界环境影响以及实现过程简单等优点。

本发明提供一种基于状态机原理获取长按键键值的方法,图2为整体流程图,包括以下步骤:

字符代表的含义如下:

Timer0:定时器0。

T0:定时器Timer0定时时间。

EXT_IT:按键中断。

Timer0_IT:定时器Timer0计数溢出中断。

IRQ_EXT:外部中断处理函数

IRQ_Timer0:定时器Timer0中断处理函数

步骤S1,将键盘的每个按键连接到设备MCU的检测端,配置按键被按下时产生的低电平信号作为按键中断EXT_IT的中断触发信号;

设备MCU初始化,设定定时器Timer0的定时时间为T0,T0可以为100ms,此时定时器Timer0为关闭状态,不使能定时器;设定按键的时间计数变量Count的初始值为0;

本步骤中,配置按键被按下时产生的低电平信号作为按键中断EXT_IT的中断触发信号,具体为:

键盘包括n行m列个按键;

设备MCU包括n个行引脚m个列引脚;每个列引脚与对应的同一列的各个按键相连;每个行引脚与对应的同一行的各个按键相连;

当某个按键被按下时,设备MCU逐行扫描各行按键,直到扫描到某行产生低电平信号;再对该行的各个按键进行逐个扫描,定位到产生低电平信号的具体按键,并获取按键的键值Key_now。

例如,如图1所示,为根据按键原理图,获取被按下键的键值的示意图。图1概要阐明了本发明的硬件原理和实现。图1为4X4的按键模型,原理为:将4列的低电平信号作为MCU的外部中断输入信号,将其中一行的输入信号置为低电平信号,其他行均为拉高输入信号,如果在该行有按键按下时,对应的列就会是一个低电平信号,进而触发中断,这样将4行做4次循环,可以完成对整个键盘的打扫,进而获取相应的键值。其中,键值Key_now为0表示按键被释放。键值Key_now不为0时,代表按键未被释放,为按压状态,此处的键值可以为按键的标识,例如,如果第1行第1列的按键被按下,则其键值Key_now为第1行第1列的键,并不是指按键的长按键键值或短按键键值。

步骤S2,设备MCU检测是否产生按键中断EXT_IT的中断触发信号,即是否有按键被按下,如果有,则执行步骤S3;否则继续等待;

步骤S3,设备MCU调用并执行外部中断处理函数IRQ_EXT,执行按键中断处理流程,包括:将状态机状态值Status置为第一状态值status0;

如图3所示,为外部中断处理函数的处理流程图,字符代表的含义如下:

Timer0:表示定时器0;

Status:状态机当前的状态值;

status0:状态机状态中第一状态值,键值检测初期。

本步骤具体为:

步骤S3.1,清除本次按键中断产生的中断标志位;

步骤S3.2,暂时关闭外部中断使能,防止产生干扰,影响本次键值的读取;

步骤S3.3,将状态机状态值Status置为第一状态值status0。

步骤S4,开启定时器Timer0,开始计时;

步骤S5,判断定时器Timer0是否产生计数溢出中断Timer0_IT,如果有,则执行步骤S6;否则继续等待;

步骤S6,设备MCU调用并执行定时器中断处理函数IRQ_Timer0,具体过程为:

如图4所示,为定时器中断处理函数的处理流程图,字符代表的含义如下:

Timer0:表示定时器0;

步骤S6.1,清除本次定时器Timer0计数溢出中断产生的中断标志位;设备MCU读取当前按键的键值Key_now;

根据读取键值Key_now,进行状态机的轮转。

如图5所示,为状态机轮转流程示意图。

字符代表的含义如下:

Status:状态机当前的状态值;

status0:状态机状态中第一个状态值,用于对有效键值的过滤,并且经过一个T0时间延时,也起到消抖作用;

status1:状态机状态中第二个状态值,利用时间计数来区分长按键值和短按键值;

status2:状态机状态中第三个状态值,释放按键,获取最终键值,以及资源的释放;

Key_now:当前获取到的键值;

Key_now_long:当前获取键值所对应的长按键值;

Count:对按键的时间计数,用于区分长按和短按,单位为T0;

Count_long:长按键的时间阀值,大于此值计为长按键;

Key:最终获取的键值;

具体流程为:

读取状态机当前状态值Status,如果为第一状态值status0,则执行步骤S6.2;如果为第二状态值status1,则执行步骤S6.3;如果为第三状态值status2,则执行步骤S6.4;

步骤S6.2,状态机第一状态执行过程:

设备MCU获取当前按键的键值Key_now,其中,如果键值Key_now为0,代表按键被释放;如果键值Key_now不为0,代表按键未被释放;

设备MCU判断键值Key_now是否满足以下条件:键值Key_now不为0且为合法值,如果是,则将状态机状态值Status置为第二状态值status1,然后执行步骤S7;如果否,则将状态机状态值Status置为第三状态值status2,然后执行步骤S7;

步骤S6.3,状态机第二状态执行过程:

步骤S6.3.1,设备MCU获取当前按键的键值Key_now;

步骤S6.3.2,设备MCU判断键值Key_now是否满足以下条件:键值Key_now不为0且为合法值,如果是,执行步骤S6.3.3;如果否,则将状态机状态值Status置为第三状态值status2,然后执行步骤S7;

步骤S6.3.3,将状态机状态值Status置为第二状态值status1,并令按键的时间计数变量Count=Count+1;

判断按键的时间计数变量Count是否大于设定的长按键时间阀值Count_long,如果否,则执行步骤S7;如果是,则将状态机状态值Status置为第三状态值status2,此步操作为达到长按键条件后进行下一步操作,不用等操作者释放按键,并通过声光提示使操作者释放按键,完善操作体验,然后执行步骤S7;

步骤S6.4,状态机第三状态执行过程:

步骤S6.4.1,设备MCU检测是否满足以下条件之一:条件1,当前按键的键值Key_now为0;条件2,按键的时间计数变量Count大于设定的长按键时间阀值Count_long;如果满足,则执行步骤S6.4.2;如果不满足,则按键不合法,释放资源,包括:令状态机状态值Status置为第一状态值status0,令按键的时间计数变量Count为0,令当前按键的键值Key_now为0,然后执行步骤S7;

步骤S6.4.2,判断按键的时间计数变量Count是否大于设定的长按键时间阀值Count_long,如果是,则按键的键值为长按键键值,否则,按键的键值为短按键键值;然后执行步骤S7;

步骤S7,判断按键是否被释放,即:按键的键值Key_now是否为0,如果被释放,则返回步骤S2,等待下一次产生按键中断EXT_IT的中断触发信号;如果未被释放,则返回步骤S4,再次开启定时器Timer0开始计时。

本发明提供一种利用状态机原理通过时间计数获得长按键键值的方法,结合按键产生的中断信号以及定时器的定时功能,将按键按下到时间计数,到释放按键的整个过程,分为三个状态,通过状态机进行轮转,从而获取键值。本发明可以获取较单按键两倍的键值,在相同功能下,可以减少按键数目,降低了成本。同时具备稳定性高,操作简单,灵敏度高,不受外界环境影响以及实现过程简单等优点。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。

技术分类

06120115630928