问一个关于单片机按键延时防抖方面的问题,使用软件防抖(汇编、C语言均可)!

问一个关于单片机按键延时防抖方面的问题,使用软件防抖(汇编、C语言均可)!,第1张

D10mS:MOV R7,#50 ;延时的时间一般为 5-20mS

D1:MOV R6,#100 ;

D2:DJNZ R6,D2 ;

DJNZ R7,D1 ;

RET

D10mS就是一个延时程序,调用它后再进行判断电平判断,就避开了按键按下时的抖动

呵呵

不好好上课吧。不过首先要把你的老师拉出来打屁股,怎么教的书。

很简单:用定时器做一个小小的延时,比如,01秒,如果按键输入端在01秒的前后,检测到的电平都是一样的,说明是稳定的按键动作,否则就是抖动。为了防止误判断,可以延迟两次或者更多次,同时多次检测即可。

使用这个到板子里面:

#include <reg52h>

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;  //P23 置 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--);

}

由于机械触点的d性作用,开关瞬间均伴随有一连串的抖动。单片机的运行速度非常快,按下一次按键,可能在A点检测到一次低电平,在B点检测到一次高电平,在C点又检测到一次低电平。同时抖动是随机,不可测的。

所以如果不防抖的话,造成的结果就是单片机会认定你按了很多次。

以上就是关于问一个关于单片机按键延时防抖方面的问题,使用软件防抖(汇编、C语言均可)!全部的内容,包括:问一个关于单片机按键延时防抖方面的问题,使用软件防抖(汇编、C语言均可)!、今天单片机培训班的老师出了一个问题,如何用定时器做按键防抖,请问要怎么做啊,求解答。、单片机键盘去抖动c语言程序!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9305200.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存