
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语言程序!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)