标题:
单片机T0中断服务函数,按键状态扫描+消抖,keybuf=(keybuf<<)|key4怎么理解
[打印本页]
作者:
xiaobai22
时间:
2019-7-31 12:22
标题:
单片机T0中断服务函数,按键状态扫描+消抖,keybuf=(keybuf<<)|key4怎么理解
void InterruptTimer() interrupt 1
{
static unsigned char keybuf = =0xff;
TH0=0xf8;TL0=0xcd;
keybuf=(keybuf<<1)|key4;请问这行怎么理解
if(keybuf==0x00)
{keysta=0};
............
}
复制代码
作者:
wulin
时间:
2019-8-1 06:29
void InterruptTimer() interrupt 1
{
static unsigned char keybuf=0xff;
TH0=0xf8;TL0=0xcd;//11.0592MHZ/2ms
keybuf=(keybuf<<1)|key4;//请问这行怎么理解
if(keybuf==0x00)
{keysta=0};
............
}
keybuf初值1111 1111
每2ms中断1次左移1位1111 1110
如果key4按下为0,逻辑运算后keybuf是1111 1110
如果key4未按则为1,逻辑运算后keybuf还是1111 1111
当key4按下超过14ms,也就是消抖时间,keybuf值经7次移位为0000 0000并保持至松手
此时符合if(keybuf==0x00)的判断条件,keysta=0
当key4抬起超过14ms,过程与上述相同,keybuf恢复初值1111 1111
作者:
yzwzfyz
时间:
2019-8-1 08:36
你需要先弄清楚:keybuf、key4是干什么用的。
作者:
aaaaaa。
时间:
2019-8-1 09:06
keybuf = (keybuf<<1) | key4;//缓冲区左移一位,并将当前扫描值移入最低位
if (keybuf == 0x00)
{KeySta = 0; } //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段。
1-14031P05943S9.png
(3.83 KB, 下载次数: 21)
下载附件
2019-8-1 09:05 上传
假如左边时间是起始 0 时刻,每经过 2ms 左移一次,每移动一次,判断当前连续的 8 次按键状态是不是全 1 或者全 0,如果是全 1 则判定为弹起,如果是全 0 则判定为按下,如果0 和 1 交错,就认为是抖动,不做任何判定。
作者:
m182892
时间:
2019-8-1 14:30
其实没必要写这么写,直观一点不行吗,又不会节省很多空间。
作者:
八月初
时间:
2019-11-8 14:23
起始就是连续检测8此,来判断按键,消抖而已,文档上就讲解的很详细的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1