一种可检测多个任意组合按键的扫描检测电路及方法与流程

文档序号:14072617阅读:7596来源:国知局

本发明涉及组合按键检测,尤其是一种可检测多个任意组合按键的扫描检测电路及方法。



背景技术:

键盘是很多电子产品的必须的输入设备。通常,大规模键盘有三种设计方法,第一种是采用专用键盘编码芯片,按键按照行和列输入,编码后的数据以usb接口输出。此方法需要专用键盘编码芯片并设计usb接口,增加了设计复杂性。第二种是将按键分别接入cpld的io脚,利用cpld的io引脚多的优势分别对每一个按键状态进行判断并将结果输出到处理单元,此方法需要增加cpld芯片,增加了硬件成本。第三种是采用mcu设计的通用矩阵键盘,让按键接入到矩阵相应的行和列,此方法具有成本低廉、占用硬件资源少等优点。采用mcu设计的矩阵键盘能实现单个按键和简单组合按键的功能,但难以实现一些复杂组合按键的功能,因此极大地限制了采用mcu设计的矩阵键盘在需要组合逻辑按键场合的应用。针对现有技术中在矩阵键盘中难以实现复杂组合按键的功能,目前尚未提出有效的解决方案。



技术实现要素:

本发明所要解决的技术问题是提供一种可检测多个任意组合按键的扫描检测电路及方法,电路结构简单,可实现规模较大的矩阵按键的稳定可靠检测,可实现任意数量、任意按键的组合功能,解决键位冲突问题。

为解决上述技术问题,本发明的技术方案是:一种可检测多个任意组合按键的扫描检测电路,包括:

mcu,所述mcu一共设有m+n+1个io引脚,其中一个io引脚带外部中断功能;

矩阵按键电路,所述矩阵按键电路包括m条横向支路和n条纵向支路。横向支路与纵向支路交叉处形成一个键位,m条横向支路与n条纵向支路相交形成m×n个矩阵分布的键位;每个键位对应一个二极管、一个电容和一个接触开关,二极管的阳极与横向支路连接,二极管的阴极通过陶瓷电容与纵向支路连接,接触开关与电容并联;每个按键代表唯一一个键码;在横向支路的第一端形成m个横向io端口,在纵向支路的第一端形成n个纵向io端口,所述横向io端口和纵向io端口均与mcu的io引脚连接;纵向支路的第二端通过上拉电阻后与电源vcc连接,当没有任何按键按下时,所有横向io端口被电源vcc上拉到高电平;横向支路的第二端通过第一电阻后与电源vcc连接,第一电阻起到电平传递以及按键按下时防止对应的横向io端口和纵向io端口短路;

或逻辑电路,包括m个二极管、电源vcc和电阻r113,每个二极管对应一个横向io端口,该二极管、电源vcc和电阻r113组成所有的横向io端口,电源vcc通过电阻r113与二极管阳极连接,电源vcc通过电阻r113输出至端口int,端口int与mcu外部中断功能的io引脚连接。

作为改进,所述上拉电阻的阻值为10kω。

作为改进,所述第一电阻的阻值为100ω。

本发明可检测多个任意组合按键的扫描检测方法,包括以下步骤:

(1)mcu上电后,马上初始化所有的io口状态;

(2)如果mcu响应外部中断,则进入按键的扫描检测过程;所述扫

描检测过程包括两个环节:

(2.1)扫描检测环节:对所有矩阵按键的检测,需要经过一轮又一轮的重复扫描过程;

(2.2)数据分析处理环节,数据分析处理环节需要以下几个步骤:

①在当前扫描结束后,所有的按键状态数据存放到buf内存缓冲区中;将所有按下的按键全部找出来,将这类按键键值,逐个地与空键集合进行匹配,如果匹配发现有按下的按键为空键,则退出当前一轮扫描,等待下一轮,同时,mcu向上一层应用函数返回报错数值;

②将当前一轮与前一轮、前二轮的按键扫描结果进行对比;如果连续3轮的扫描结果一致,则将当前一轮的buf中的数据与前一个保存前一次同样也是满足连续3轮检测结果一致的bufprev缓冲区数据进行对比,如果不一致,则结束当前一轮扫描,等待下一轮;

③如果buf与bufprev对比的结果是一致的,说明没有任何按键按下或者弹起,直接进入到以下第⑤个步骤;反之,如果不一致,则对比并且找到buf与bufprev中每一个不同比特的数据;通过该不同比特的数据所处的位置,可定位唯一1个有发生变化的按键及其键码;而通过比特的变化,得知该按键是弹起还是按下;

④在③的基础上,逐个初步判断某个已经按下的按键是否为刚按下,如果初步确认按键为弹起,则将对应按键的释放时间设置为0;反之,如果初步确认按键为按下,将初步确认为按下的按键对应的数据添加到buf2中;

⑤利用内部定时器定时中断的功能,逐个更新buf2中的所有按键的按下时间和释放时间;

⑥逐个判断单个按键是否最终确认为弹起,即判断以下3个条件:

a)buf2中存在这个按键数据;

b)releasetime>=t释放阈值;

c)keystatus为弹起;

如果满足以上3个条件,则在buf2中清除该释放按键的数据,并且向上层函数发送单按键释放的消息;否则,跳到步骤⑦;

⑦逐个判断单个按键是否最终确认为按下,即判断以下3个条件:

a)buf2中存在这个按键数据;

b)releasetime>=t按下阈值;

c)keystatus为按下;

如果满足以上3个条件,则并且向上层函数发送单按键按下的消息;否则,跳到步骤⑧;

⑧逐个判断组合按键是否最终确认为按下,判断所有组成的按键同时满足以下3个条件:

a)buf2同时存在所有所需按键数据;

b)releasetime>=t按下阈值;

c)keystatus为按下;

如果满足以上3个条件,则将该组合键的相关数据放到buf3中;将buf3中该组合键的标志位flag标志为1,证明该组合按键成立;并且向上层函数发送组合键按下消息;否则,跳到步骤⑨;

⑨逐个判断组合按键是否最终确认为释放,即判断所有组成按键满足以下3个条件:

a)buf3存在该组合键的数据;

b)buf3该组合键数据中的flag位置为成立;

c)在第⑧步骤提到的3个条件不再同时满足(即任意一个条件不成立即可);

如果满足以上3个条件,则向上层函数发送组合键释放消息,并且将buf3中该组合键的数据删除掉;否则,跳到步骤⑩;

⑩将buf数据替换bufprev的数据;

利用内部定时器定时中断的功能,更新timerbuf2定时器;

判断buf2中的按键数据是否为空且timerbuf2超时,如果是,退出按键扫描任务,直到响应下一次外部中断;否则,直接退出,等待下一轮按键扫描。

作为改进,所述步骤(1)中,具体的初始化任务包括:1)将纵向io端口设置为输出,且输出低电平;2)将横向io端口设置为输入;3)将中断引脚int设置为下降沿外部中断,并使能外部中断;4)开启定时器(该定时器用于记录某个被按下的按键所持续的时间t)。

作为改进,所述扫描检测环节中,每一轮的全过程扫描,又细分log2(n)个阶段,无论在哪一个阶段的哪一次扫描检测,mcu都进行了以下相同的扫描检测过程:1)muc根据当前所处的阶段,设置指定某纵向io端口的电平为低,其余为高;2)mcu读取所有横向io端口高低电平,并记录电平状态;3)将2)得到的状态,与一个临时缓冲区buftmp的数据逐一进行对比,如果该状态已存在,则对应同一个状态的次数累计加1;反之,在buftmp中增加该状态的数据,并将该状态的次数初始化为1;4)延时若干纳秒;5)重复2)~4)相同的操作共10次,并检测buftmp中累计次数最多的那些数据,是否仅有唯一1个,如果不是,则继续重复2)~4)的操作,直到次数最多的数据是唯一的;6)将buftmp中次数最多的数据取出来,将该数据的累计次数与设定的阈值对比;如果累计次数满足大于或者等于该阈值的条件下,mcu返回该数据,至此,本扫描检测过程结束;如果不能满足该条件,则重复2)~5)的操作,直到满足条件。

附图说明

图1为矩阵按键电路图。

图2为逻辑电路图。

图3为矩阵按键的列端口递归式对半划分算法流程图。

图4为矩阵按键的扫描检测算法流程图。

图5为按键数据的分析处理环节的算法流程图。

具体实施方式

下面结合说明书附图对本发明作进一步说明。

一种可检测多个任意组合按键的扫描检测电路,包括:mcu、16×16矩阵按键电路以及或逻辑电路。

所述mcu一共设有16+16+1个io引脚,其中一个io引脚带外部中断功能。

如图1所示,所述矩阵按键电路包括16条横向支路row0~row15和16条纵向支路col0~col15,横向支路与纵向支路交叉处形成一个键位,16条横向支路与16条纵向支路相交形成16×16个矩阵分布的键位。每个键位对应一个二极管、一个电容和一个接触开关,二极管的阳极与横向支路连接,二极管的阴极通过陶瓷电容与纵向支路连接,接触开关与电容并联;每个按键代表唯一一个键码;每个节点上的电容对按键一定程度上起降低抖动的作用,使mcu检测结果更可靠,而节点的二极管起防止键位冲突的作用。在横向支路的第一端形成16个横向io端口,在纵向支路的第一端形成16个纵向io端口,所述横向io端口和纵向io端口均与mcu的io引脚连接。纵向支路的第二端通过10kω的上拉电阻后与电源vcc连接,当没有任何按键按下时,所有横向io端口被电源vcc上拉到高电平。横向支路的第二端通过100ω的第一电阻后与电源vcc连接,第一电阻起到电平传递以及按键按下时防止对应的横向io端口和纵向io端口短路。

如图2所示,或逻辑电路包括m个二极管、电源vcc和电阻r113,每个二极管对应一个横向io端口,该二极管、电源vcc和电阻r113组成所有的横向io端口,电源vcc通过电阻r113与二极管阳极连接,电源vcc通过电阻r113输出至端口int。端口int与mcu外部中断功能的io引脚连接。实际应用场合里,大部分的时间按键都处于弹起的状态,所有横向io端口被上拉为高电平,端口int为高电平。mcu没有收到外部中断的信号,这种情况下,mcu可以处理其它任务;反之,当只要至少有一个按键被按下,根据或逻辑电路,端口int被某个二极管钳位到低电平,产生一个下降沿的中断信号给到mcu,mcu响应中断后可立即展开整个矩阵按键的扫描检测工作。

本发明可检测多个任意组合按键的扫描检测方法,包括以下步骤:

(1)首先,mcu上电后,马上初始化所有的io口状态。具体要做以下几个初始化任务:

1)将col0~col15设置为输出,且输出低电平;

2)将row0~row15设置为输入(最好设置为带弱上拉输入);

3)将中断引脚int设置为下降沿外部中断,并使能外部中断;

4)开启定时器(用于记录某个被按下的按键所持续的时间t等作用)。

(2)如果mcu响应外部中断,则进入按键的扫描检测过程,这个过程细分为扫描检测、数据分析处理共2个环节:

(i)扫描检测环节

对所有矩阵按键的检测,需要经过一轮又一轮的重复扫描过程;每一轮的扫描之间可间隔一小段空闲时间(时间不能太长,3ms以内比较适宜,mcu在这些空闲时间可处理其它任务),而每一轮的全过程扫描,又细分以下4个阶段(log2(列数16)=4,具体解释如下)。

第1阶段,当mcu收到int中断后,说明肯定至少有一个按键被按下,mcu将col0~col15分为对半前后两组:(col0~col7)、(col8~col15),共2组,mcu以相同方式先后分别处理这两半的列端口对应的按键扫描,即mcu先拉低前一半的所有列端口(col0~col7),再检查所有的行端口是否有引脚被拉低;如果无,则直接退出当前的这一半的按键扫描;如果有,则进入第二阶段,继续将当前的列端口划分一半,以类似的方式进行扫描。

第2阶段,mcu分别将第一阶段划分的两组列端口(col0~col7)、(col8~col15)依次划分成(col0~col3)、(col4~col7)、(col8~col11)、(col12~col15),共4组,以相同的方式,mcu对这4组分别进行扫描,例如,将(col0~col3)全部拉低(其余列端口给高电平),然后检测所有行端口是否有引脚为低电平;如果没有,则退出当前该组的扫描;反之,则进入下一扫描阶段。

第3阶段,mcu以同样的方式,在第2阶段的划分基础上,继续对半划分,将所有列端口依次划分(col0,col1)、(col2,col3)、(col4,col5)、(col6,col7)、(col8,col9)、(col10,col11)、(col12,col13)、(col14,col15),共8组,同样,mcu以类似的方式进行按键扫描。

第4阶段,mcu以同样的方式,在第3阶段的划分基础上,继续对半划分,此时,一共划分16组,每一组便是对应单独一列,mcu将某列的端口拉低(其余端口置高电平),然后检测所有行端口是否被拉低;如果没有,则退出当前组的扫描;反之,接下来mcu就要分析该列对应的按键是否按下或者弹起。与其它前3个阶段不一样的地方在于,第4阶段划分的组所包含的列数,总是为1列,这说明mcu在当前这个阶段,已经可以判断该列上对应所有按键的状态可以确定下来。因此,mcu在这一阶段需要多做一个事情,就是将所有按键的状态保存下来,存放到一个buf的内存缓冲区中,每一个按键的状态用1比特来记录,为1表示按下,为0表示弹起,对于4*4矩阵按键,需要16bit的空间,即两个字节。

当所有列都经历第4阶段的扫描后,此时buf缓冲区记录了当前所有按键的最近状态。如图3所示,在实际的软件设计上,采用递归的方式完成以上所列举的对半划分的扫描检测过程。至此,一轮的扫描过程结束,等待下一轮同样的扫描过程。

如图4所示,无论在哪一个阶段的哪一次扫描检测,mcu都进行了以下相同的扫描检测过程。该过程采用“多次采样取最大概率”的方法进行检测,保证检测结果的可靠性,具体如下:

(1)muc根据当前所处的阶段,设置指定某些列的io端口的电平为低,其余为高;

(2)mcu读取所有行的io端口高低电平,并记录电平状态;

(3)将(2)得到的状态,与一个临时缓冲区buftmp的数据逐一进行对比;如果该状态已存在,则对应同一个状态的次数累计加1;反之,在buftmp中增加该状态的数据,并将该状态的次数初始化为1;

(4)延时若干纳秒;

(5)重复(2)~(4)相同的操作共10次,并检测buftmp中累计次数最多的那些数据,是否仅有唯一1个;如果不是,则继续重复(2)~(4)的操作,直到次数最多的数据是唯一的;

(6)将buftmp中次数最多的数据取出来,将该数据的累计次数与设定的阈值对比。如果累计次数满足大于或者等于该阈值的条件下,mcu返回该数据;至此,本扫描检测过程结束。如果不能满足该条件,则重复(2)~(5)的操作,直到满足条件。

(ii)数据分析处理环节

如图5所示,数据分析处理环节需要以下几个步骤:

①在当前扫描结束后,所有的按键状态数据存放到buf内存缓冲区中,将所有按下的按键全部找出来,将这类按键键值,逐个逐个地与空键集合(即某些节点上设计上不需要加按键,将这类节点对应的键值形成一个集合,这里简称空键集合)进行匹配;如果匹配发现有按下的按键为空键,则退出当前一轮扫描,等待下一轮,同时,mcu向上一层应用函数返回报错数值(开发人员可根据这个自我检测的方法来排查和定位电路问题或者软件问题)。

②将当前一轮与前一轮、前二轮的按键扫描结果进行对比,即将连续前后3轮扫描检测出的buf缓冲区数据进行对比;如果连续3轮的扫描结果一致,则将当前一轮的buf中的数据与前一个保存前一次也是满足连续3轮检测结果一致的bufprev缓冲区数据进行对比;如果不一致,则结束当前一轮扫描,等待下一轮。

③如果buf与bufprev对比的结果是一致的,说明没有任何按键按下或者弹起,直接进入到以下第⑤个步骤;反之,如果不一致,则对比并且找到buf与bufprev中每一个不同比特的数据,通过该不同比特的数据所处的位置,可定位唯一1个有发生变化的按键及其键码(键位);而通过比特的变化,得知该按键是弹起还是按下;具体地,比如bufprev中的第0个(从0算起)比特数据为0,变成buf中的第0个比特数据1,得知矩阵第0个按键被按下。

④在③的基础上,逐个初步判断某个已经按下的按键是否为刚按下(上一轮的状态为弹起,而当前为按下,表明该按键为刚按下);如果初步确认按键为弹起,则将对应按键的释放时间设置为0;反之,如果初步确认按键为按下,将初步确认为按下的按键对应的数据(包括键码keyvalue、状态keystatus、按下时间presstime,释放时间releasetime),添加到buf2中;

⑤利用内部定时器定时中断的功能,逐个更新buf2中的所有按键的按下时间和释放时间:

a)对于初步确认为刚按下的按键,其按下时间presstime初始化为0;

b)对于初步确认为刚弹起的按键,其释放时间releasetime初始化为0;

c)对于其它按键,更新其按下时间和释放时间。

⑥逐个判断单个按键是否最终确认为弹起,即判断以下3个条件:

a)buf2中存在这个按键数据;

b)releasetime>=t释放阈值;

c)keystatus为弹起;

如果满足以上3个条件,则在buf2中清除该释放按键的数据,并且向上层函数发送单按键释放的消息;否则,跳到步骤⑦。

⑦逐个判断单个按键是否最终确认为按下。即判断以下3个条件:

a)buf2中存在这个按键数据;

b)releasetime>=t按下阈值;

c)keystatus为按下;

如果满足以上3个条件,则并且向上层函数发送单按键按下的消息;否则,跳到步骤⑧。

⑧逐个判断组合按键是否最终确认为按下,判断所有组成的按键同时满足以下3个条件:

a)buf2同时存在所有所需按键数据;

b)releasetime>=t按下阈值;

c)keystatus为按下;

如果满足以上3个条件,则将该组合键的相关数据放到buf3中;将buf3中该组合键的标志位flag标志为1,证明该组合按键成立;并且向上层函数发送组合键按下消息;否则,跳到步骤⑨。

⑨逐个判断组合按键是否最终确认为释放,即判断所有组成按键满足以下3个条件:

a)buf3存在该组合键的数据;

b)buf3该组合键数据中的flag位置为成立;

c)在第⑧步骤提到的3个条件不再同时满足(即任意一个条件不成立即可);

如果满足以上3个条件,则向上层函数发送组合键释放消息,并且将buf3中该组合键的数据删除掉;否则,跳到步骤⑩。

⑩将buf数据替换bufprev的数据。

利用内部定时器定时中断的功能,更新timerbuf2定时器。

判断buf2中的按键数据是否为空且timerbuf2超时;如果是,退出按键扫描任务,直到响应下一次外部中断;否则,直接退出,等待下一轮按键扫描。

本矩阵按键扫描检测方案,在以下软件和硬件的角度的几个细节做了对按键消抖的处理,提高了该检测方案的稳定性与可靠性。

1)在硬件设计上,每个节点上的按键均并联一个10pf的电容,在硬件上一定程度上降低了按键的抖动程度;

2)在软件上,在按键扫描检测环节中每一个阶段的每一次扫描检测处理中,均采取了多次扫描取最大概率的扫描结果,并要求最大概率的扫描结果满足一定的次数方作为最为最后的判断结果;

3)在数据分析处理环节,增加了与空键集合(如果有的话)对比查找的处理,实现软件层面的自检功能;

4)在数据分析处理环节,不论对单按键还是组合按键的判断,均要求经过以上第②步这个关键步骤,即满足连续3轮的按键扫描检测的结果为完全一致的情况下,保证按键的数据足够可靠稳定,才能进行下一步的按键数据分析处理等操作。因此,极大降低了按键误判的几率;

5)在数据分析处理环节,不论对单按键还是组合按键的按下和释放操作的判断,都分别要求经过第③和第④步骤的“初步确认”之后,从第⑥到第⑨这几个按键状态的最终确认都引入了按键的“按下时间”和“释放时间”,即要求满足时间的阈值条件后,方能最终确认;

6)在数据分析处理环节,经过第这两个步骤,利用类似第5)点的方式,即超时的阈值判断,来提高“长时间无按键按下”这种情况的判断的准确度,降低误判率。

本发明在以下几个细节处理,提高了mcu的工作效率:(1)软件上,在扫描检测环节上,采取了对半递归分组的方式进行检测扫描;如果其中一半对应的按键没有按下,则对这一半的按键扫描直接退出;因此,该方式更好的适应了按键在绝大部分的时间里大多处于弹起的实际应用场合,从而提高了mcu的工作效率。(2)在硬件上,在矩阵按键对应的所有行端口均采取二极管或逻辑电路,其逻辑输出端口作为外部中断信号源给到mcu中断引脚,结合软件中数据分析处理环节方式,可实现无任何按键按下的情况下,mcu可处理其它任务,直到响应新的外部中断信号;因此,该处理方式也极大提高了mcu的工作效率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1