单片机键盘如何去抖
eeskill 2023-11-28

当轻触开关合闭或是断掉时都有每段电平不平稳的時期,轻触开关在合闭时不容易立刻就平稳的接入,在断掉时也不容易突然之间完全断掉,只是在合闭和断掉的一瞬间随着了一个一个的电平颤动。这类颤动通常都会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花的時间依据功能键总数的是多少而不一样,通常为好多个微秒到一百多微秒)。

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 光立方程序编写步骤

    基于51单片机的4*4*4光立方程序实现原理及程序代码。LED光立方的复位电路、时钟电路、每层LED灯电路控制逻辑,系统总原理图,工作流程及相关C语言源码实现。希望能够对你学习了解LED光立方程序编写及LED立方实体制...

    前天
  • 封装继承多态

    封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中...

    前天
  • 封装是什么意思?

    即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中...

    前天
  • 超声波模块测距51程序_单片机超声波测距c语言

    超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 //超声波模块程序 //Trig = P2^0 //Echo = P3^2 #include #define uchar unsigned char #define uint unsigned int // void delay(uint z) {...

    07-01
  • 大佬带你看嵌入式系统,嵌入式系统该学习什么?

    嵌入式系统是当今的热门系统之一,在诸多领域,嵌入式系统都有所应用。为增进大家对嵌入式系统的认识,小编将为大家介绍嵌入式系统是一个什么样的专业,以及学习嵌入式系统该学习哪些内容。如果你对嵌入式系统具有...

    06-27
  • c51单片机编程要点总结

    c51单片机编程要点总结 1、头文件:#include (我用的是 STC 89C54RD+) 2、预定义:sbit LED = P1^0// 定义 P1 口的 0 位为 LED 注:“P1^0”这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7 注2...

    06-25
  • C语言基础知识点汇总

    总结C语言基础知识点

    06-23
  • Keil使用中的若干问题

      一、混合编程  1、模块内接口:  使用如下标志符:  #pragma asm  汇编语句  #pragma endasm  注意:如果在c51程序中使用了汇编语言,注意在keil编译器中需要激活Properties中的“Generate Assembler...

    06-23
  • ESP32-finsh

    esp32c2添加finsh实现了ping指令和AT指令解析

    06-13
  • 一文讲通C语言位域,快速掌握!

    在嵌入式系统的开发中,内存是最程序员非常需要关注的对象,尤其是MCU开发、网络协议解析、硬件寄存器操作等领域,能否对内存进行高效的利用和合理的管理,将直接影响程序的性能和硬件的稳定性。

    06-10
下载排行榜
更多
评测报告
更多
广告