找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4945|回复: 5
收起左侧

单片机T0中断服务函数,按键状态扫描+消抖,keybuf=(keybuf<<)|key4怎么理解

[复制链接]
ID:584016 发表于 2019-7-31 12:22 | 显示全部楼层 |阅读模式
  1. void InterruptTimer() interrupt 1
  2. {
  3. static unsigned char keybuf = =0xff;
  4. TH0=0xf8;TL0=0xcd;
  5. keybuf=(keybuf<<1)|key4;请问这行怎么理解
  6. if(keybuf==0x00)
  7. {keysta=0};
  8. ............

  9. }
复制代码
回复

使用道具 举报

ID:213173 发表于 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
回复

使用道具 举报

ID:123289 发表于 2019-8-1 08:36 | 显示全部楼层
你需要先弄清楚:keybuf、key4是干什么用的。
回复

使用道具 举报

ID:511461 发表于 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
假如左边时间是起始 0 时刻,每经过 2ms 左移一次,每移动一次,判断当前连续的 8 次按键状态是不是全 1 或者全 0,如果是全 1 则判定为弹起,如果是全 0 则判定为按下,如果0 和 1 交错,就认为是抖动,不做任何判定。
回复

使用道具 举报

ID:56665 发表于 2019-8-1 14:30 | 显示全部楼层
其实没必要写这么写,直观一点不行吗,又不会节省很多空间。
回复

使用道具 举报

ID:415088 发表于 2019-11-8 14:23 | 显示全部楼层
起始就是连续检测8此,来判断按键,消抖而已,文档上就讲解的很详细的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表