分析按键去抖流程

分析按键去抖流程,第1张

在键数较少时可用硬件方法消除键抖动。上图所示的闹指升RS触发器为常用的硬件去抖。图中两个“与非”门构成一个RS触发器。当按键按下时,输出为0当键按下时,输出为1。此时即使用按键的机械性能,使按键因液老d性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。如果按键较多,常用软件方法去抖,逗高即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。一般来说,软件消抖的方法是不断检测按键值,直到按键值稳定。实现方法:假设未按键时输入1,按键后输入为0,抖动时不定。可以做以下检测:检测到按键输入为0之后,延时5ms~10ms,再次检测,如果按键还为0,那么就认为有按键输入。延时的5ms~10ms恰好避开了抖动期。

消除抖动的方法有硬件和软件两种方法。硬件方法常用RS触掘轮发器电路。软件方法是当禅散瞎检测出键闭合后执行一个10ms~20ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。

有消除按键的机械抖动的原因:

通常的按键所用开关为机械d性开关。由于机械触电的d性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误贺空读多次。为了确保CPU对键的一次闭合仅作一次处理,必须去除抖动。

复合键就是给个按键标志位,比如按下为1,没按为0 。如果 复合键为2 个以上功能 ,就要以0、1、2.。。赋值标志。然后程序中判断哪个值就转哪个功能 。

使用这个到板子里面:

#include <reg52.h>

sbit ADDR0 = P1^0

sbit ADDR1 = P1^1

sbit ADDR2 = P1^2

sbit ADDR3 = P1^3

sbit ENLED = P1^4

sbit KEY1 = P2^4

sbit KEY2 = P2^5

sbit KEY3 = P2^6

sbit KEY4 = P2^7

unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}

void delay()

void main(){

bit keybuf = 1//按键值暂存,临时保存按键的扫描值

bit backup = 1//按键值备份,保存配尘前一次的扫描值

unsigned char cnt = 0//按键计数,记录按键按下的次数

ENLED = 0 //选择数码管 DS1 进行显示

ADDR3 = 1

ADDR2 = 0

ADDR1 = 0

ADDR0 = 0

P2 = 0xF7 //P2.3 置 0,即 KeyOut1 输出低电平

P0 = LedChar[cnt] //显示按键次数初值

while (1){

keybuf = KEY4 //把当前扫描值暂存

if (keybuf != backup){  //当前值与前次值不相等说明此时按键有动作

delay() //延时大约 10ms

if (keybuf == KEY4){  //判断扫描值有没有发生改变,即按键抖动

if (backup == 0){  //如果前次察卖神值为 0,则说明当前是d起动作

cnt++ //按键次数+1

//只用 1 个数码管显示,所以加到 10 就清零重新开始

if (cnt >= 10){

cnt = 0

}

P0 = LedChar[cnt]//计数值显示到数码管上

}

backup = keybuf//更新备份为当败亏前值,以备进行下次比较

}

}

}

}

/* 软件延时函数,延时约 10ms */

void delay(){

unsigned int i = 1000

while (i--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12452334.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存