这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机实现电脑键盘去抖的编程设计

共5条 1/1 1 跳转至

单片机实现电脑键盘去抖的编程设计

工程师
2020-04-11 22:05:58     打赏

当轻触开关合闭或是断掉时都有每段电平不平稳的時期,轻触开关在合闭时不容易立刻就平稳的接入,在断掉时也不容易突然之间完全断掉,只是在合闭和断掉的一瞬间随着了一个一个的电平颤动。这类颤动通常都会10ms上下。为了保证程序流程对功能键的一回合闭或是一回断掉只没有响应一回,务必开展功能键的去抖解决。当检验到功能键情况转变时,并不是马上去没有响应姿势,只是先等候合闭或断掉平稳后再开展解决。

功能键去抖方式 可分成硬件配置去抖和手机软件去抖,硬件配置去抖没有文中的探讨中,文中只探讨手机软件去抖。

通常的手机软件去抖就是说程序流程在检验到功能键合闭或断掉时启用每段廷时汇编程序(在c语言中叫涵数),程序流程再此死等10ms或更长。廷时之后再检验功能键的情况是不是与廷时前的情况相同,若相同就实行电脑键盘程序流程一部分,若不相同,则绕过实行电脑键盘程序流程。

这类方式 在程序流程劳动量并不是挺大时是沒有难题的。但在某些CPU负荷较为大的程序流程中,尤其某些程序流程运行中有较为多的在不确定性時间就会产生的终断的状况下(外界终断、串口终断、定时器中断等),这里死等,总有将会导致某一部分程序流程不可以非常好的被实行,乃至程序流程跑飞等比较严重难题。

单片机实现电脑键盘去抖的编程设计

自己历经很多年的程序编写,小结了一整套处理这难题的方式 ,供大家参考。

单片机设计电脑键盘去抖的编程设计

程序流程是用51汇编语言写的,大伙儿若想用c语言撰写,参照这流程表改一下下就成。

先表述这流程表中的自变量和汇编程序:

KSTEP:步进电机标示自变量,当程序流程从子程序进到到此汇编程序后,马上依据这KSTEP的值跳至相对的程序语言。

KEYSCAN:读电脑键盘汇编程序,若你的功能键总数很少得话,立即读IO口。功能键总数多得话,还要用向量方法读电脑键盘,这儿未作赘言。

HASK:位自变量,读电脑键盘汇编程序中的位自变量,当读电脑键盘汇编程序KEYSCAN检验到有键合闭时置“1”,相反置“0”。

R2:键值自变量,读电脑键盘汇编程序KEYSCAN读取的键值。

KVALU:键值自变量,R2的键值送至这儿,供此汇编程序下一回分辨或子程序应用。

K20MS:20ms记时器自变量,当初次检验到有键合闭时往里送值10。程序流程复位中设置定时器中断为2ms间隔时间。进到定时器中断后,最先分辨K20MS是不是为0?若此0则立即撤出定时器中断;若不以0则将K20MS减1后再撤出定时器中断。那样K20MS自变量从10瘦到0時间为20ms。键断掉时都是相同地实行。

KAVA:位自变量,告知子程序:键合闭(断掉)合理。

程序流程表述:

1.程序流程复位时KSTEP的数值0,因此一进到本子h程序流程,程序流程立刻就跳至型号KSC0处,在此地启用读电脑键盘汇编程序KEYSCAN。

1.1从KEYSCAN出去后,若位自变量HASK的数值0,表明沒有键合闭,程序流程立即跳至型号RET处撤出。

1.2若位自变量HASK的数值1,就是说有键合闭,这时将标值1送进步进电机标示自变量KSTEP中,有利于到时候进到本子h程序流程时,程序流程立即跳至型号KSC1处。再将从KEYSCAN汇编程序读出的键值送进自变量KVALU中,用以到时候再启用读电脑键盘汇编程序KEYSCAN时与R2读取的键值开展较为。

最终将标值10送进20ms记时器自变量K20MS中,用以2ms定时器中断后减1,随后撤出汇编程序。

2.当子程序再度启用本子h程序流程时,程序流程立刻就跳至型号KSC1处。

2.1在此地最先辨别20ms记时器自变量K20MS是不是瘦到0(也就是说辨别20ms廷时来到沒有?),若K20MS不以0(20ms廷时都还没到),则马上撤出。

2.2若K20MS为0(表明20ms廷时時间来到),再度启用读电脑键盘汇编程序KEYSCAN。启用KEYSCAN汇编程序后,再度辨别位自变量HASK是不是合理?

2.2.1若HASK失效,表明之前(KSC0处)将会是遭受一回干挠。因此校准KSTEP(清0),撤出。使到时候启用本程序流程时,又重新开始。

2.2.2若HASK合理,则将此次从KEYSCAN读取的键值与之前读取并存有KVALU中的键值开展较为。

2.2.2.1若较为值不一样,则程序流程跳至型号KE1处,将新的键值存进KAVALU中,20ms后再启用KEYSCAN汇编程序,再度较为。

2.2.2.2若较为值同样,则表明此次键合闭合理,因此置位KAVA(当子程序是键按住实行时),告知子程序,键合闭合理,能够实行此键所需做的程序流程了。一起将标值2送进步进电机标示自变量KSTEP中,有利于到时候进到本子h程序流程时,程序流程立即跳至型号KSC2处。最终将标值10送进20ms记时器自变量K20MS中,在到时候进到KSC2型号处,也得等20ms以后再辨别键是不是断掉。

3.如今子程序启用本子h程序流程时,程序流程立刻就跳至型号KSC2处,再此也是,最先辨别20ms记时器自变量K20MS是不是瘦到0(也就是说辨别20ms廷时来到沒有?),若K20MS不以0(20ms廷时都还没到),则马上撤出。若K20MS为0,启用读电脑键盘汇编程序KEYSCAN。

启用KEYSCAN汇编程序后,辨别位自变量HASK是不是合理?

3.1若HASK失效,表明功能键将会被释放出来断掉,因此将标值3送进步进电机标示自变量KSTEP中,有利于到时候进到本子h程序流程时程序流程能够立即跳至型号KSC3处。最终将标值10送进20ms记时器自变量K20MS中,在到时候进到KSC3型号处,也得等20ms以后再辨别键是不是再次断掉情况。

3.2若HASK合理,表明功能键再次合闭情况,再较为KEYSCAN读取的键值与之前读取在KVALU中的键值开展较为。

3.2.1若较为值不一样,则程序流程跳至型号KE0处,从头开始。

3.2.1若较为值同样,则表明功能键都还没断掉,再次将标值10送进20ms记时器自变量K20MS中,等20ms以后再进到型号KSC2处,再度辨别功能键是不是断掉。

4.当子程序启用本子h程序流程时,程序流程程序流程立刻跳至型号KSC3处,還是最先辨别20ms记时器自变量K20MS是不是瘦到0,若K20MS不以0(20ms廷时都还没到),则马上撤出。若K20MS为0,启用读电脑键盘汇编程序KEYSCAN。

启用KEYSCAN汇编程序后,辨别位自变量HASK是不是合理?

4.1若HASK失效,表明功能键早已彻底释放出来断掉,因此将标值0送进步进电机标示自变量KSTEP中,有利于到时候进到本子h程序流程时,程序流程重新开始,一起置位KAVA(当子程序是键释放出来实行时),告知子程序,键释放出来合理,能够实行此键所需做的程序流程了。

4.2假如位自变量HASK再次合理,表明又有键合闭了(尽管这类几率较为小,但程序流程得编进来),依据新键值与老键值的同样与不一样,各自跳至型号KE3处,或是型号KE0处实行。

表明:KE3型号和KE7型号下边常有SETBKAVA,具体程序编写时仅用一回,依据你的子程序是在键按住实行還是键释放出来实行采用。

本程序流程的特性就是说:在等键合闭或断掉去抖的那20ms時间,并不是死等,只是搞好标识及置好必需的变量值后马上撤出到子程序去做别的事儿。程序流程每一次从进到到撤出这一汇编程序中所花的時间通常为十多微秒(没有读电脑键盘汇编程序KEYSCAN所花的時间,KEYSCAN花的時间依据功能键总数的是多少而不一样,通常为好多个微秒到一百多微秒)。




工程师
2020-04-11 23:20:54     打赏
2楼

楼主的去抖,有些复杂了


工程师
2020-04-11 23:25:05     打赏
3楼

啥年代了,还用汇编语言写啊。。。效率!效率!


工程师
2020-04-11 23:29:50     打赏
4楼

如果按键多,建议用专用的按键扫描IC,防抖动等功能都硬件IC实现了,程序软件就简单多了~


工程师
2020-04-14 21:42:31     打赏
5楼

说的很不错


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]