历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2020年01月21日 | 基于状态机的51单片机独立按键检测与消抖思路

2020-01-21 来源:51hei

状态机的按键检测思路2
先回顾一下定义:
状态机有如下性质
按键状态机发生状态迁移的条件
如何准确检测条件是否发生并进行状态迁移
确保状态机能稳定地进行迁移
按键消抖的原理:状态切换
按键操作触发的时机

先回顾一下定义:
按键从未按下到按下,再到弹起,可以视为一个有4个状态的有限状态机。  分别是未按下、前沿抖动、按下、后沿抖动。  
即按键只在这4个状态间进行迁移,而且是当条件满足时按一定的顺序进行迁移:  未按下­­(条件1)­>前沿抖动­­(条件2)­>按下­­(条件3)­>后沿抖动­­(条件4)­>未按下  当且仅当条件成立时,才进行状态的迁移,当条件不成立时,状态机会保持当前状态不变。

状态机有如下性质

1.状态机会在条件满足时发生状态转移,由于每个状态会持续一段时间,而我们需要按键是理想的,即我们需要一个瞬间的按键事件,而不是连续的按键事件。  
总结:  
(1)当状态转移条件成立时,要进行状态的迁移。 
(2)状态转移是瞬间的,所以我们把某个状态转移当成按键来用。 
(3)未进行状态转移时,状态机会保持之前的状态。

按键状态机发生状态迁移的条件

0.png?imageView2/2/w/550 

即如何对状态机的迁移条件进行准确判定。  
如何准确检测条件是否发生并进行状态迁移
注意:按键的初始状态是未按下
//在定义时将按键状态初始化为未按下
unsigned char KEY_Status = NOPRESS;

(1)条件1:前沿抖动开始  
从未按下状态到前沿抖动开始这一事件发生,电平为由1变为0  
即在未按下状态下,突然检测到低电平,就说明迁移条件成立了,立即把状态迁移到前沿抖动,或执行其他操作。
//KEY_Status == NOPRESS && KEY_Value == 0,等价于条件1成立
if (NOPRESS ==  KEY_Status && 0 == KEY_Value)
{
KEY_Status = PRESHAKE; //执行状态迁移
timer(); //设置一个10ms定时器,用定时器溢出事件来模拟前沿抖动结束事件。
}

(2)条件2:前沿抖动结束  
从前沿抖动状态到前沿抖动结束这一事件发生,有大约10毫秒的时间,虽然没有具体的事件,但可以用定时器中断来模拟前沿抖动结束事件。在前沿抖动的状态下,一旦定时器中断,就说明迁移条件成立了,立即把状态迁移至按下,或执行其他操作。

  1. //若PRESHAKE == KEY_Status && 1 == TF1 则条件2成立

  2. if (PRESHAKE == KEY_Status && 1 == TF1)

  3. {

  4. KEY_Status = PRESS; //执行状态迁移

  5. TF = 0; //清除溢出标志

  6. TR1 = 0; //关闭定时器

  7. }


(3)条件3:后沿抖动开始  
从按下状态到后沿抖动开始这一事件发生,电平由0变1,即只要在按下状态中检测到电平为1,就认为迁移条件成立了,立即把状态迁移至后沿抖动。

  1. //KEY_Status == PRESS && KEY_Value == 1则条件3成立

  2. if (PRESS == KEY_Status && 1 == KEY_Value)

  3. {

  4. KEY_Status = TAILSHAKE; //执行状态迁移

  5. n++; //执行想要的操作

  6. timer(); //用定时器溢出来模拟后沿抖动结束事件

  7. }


(4)条件4:后沿抖动结束  
从后沿抖动状态到后沿抖动结束这一事件发生,虽然没有具体的事件,但是历时是确定的,基本在10ms左右,可以通过定时器溢出来模拟后沿抖动结束事件。一旦定时器溢出(或者定时器中断发生),就说明迁移条件成立了,立即把状态迁移至未按下。

//TF1 == 1即后沿抖动结束标志。
//要在此时关闭定时器,防止重复判断。
if (1 == TF1)
{
KEY_Status = NOPRESS;
TF1 = 0; //清除溢出标志
TR1 = 0; //关闭定时器
}

确保状态机能稳定地进行迁移

如果状态能稳定的迁移,也就是说如果我们能对状态发生迁移的条件进行准确判断,
状态机就会实现稳定的迁移。就可以在此基础上进行其他操作,不用担心状态机的状态界定错误,因为状态机是可以稳定迁移的。 

 
所以关键是对状态发生迁移的条件进行准确判定,从而使各个状态不发生交叉,即稳定迁移。  


要反复检查上面我们对状态机迁移条件界定是否准确。直到确定是准确的,就可以在此基础上做点别的事情了。  


可以在心中模拟程序执行来验证思路是否正确。

按键消抖的原理:状态切换

(按键)状态机中,由于状态的切换是通过判定条件来进行的,一旦条件成立,状态就瞬间切换了,每个状态会持续一段时间,在此期间循环可能会执行多次,但由于状态切换的条件不满足,所以不会进入if语句中操作。所以如果把任何状态切换到下一状态的瞬间当成按键事件,那么按键就只会被检测到一次,这就是按键消抖的原理。

按键操作触发的时机
实际测试发现,把对按键事件的响应操作放在后沿抖动开始时(即状态机由按下状态迁
移到后沿抖动状态的瞬间)效果比较不错,不会显得太敏感也不会显得很迟钝。


推荐阅读

史海拾趣

Aplus Flash Technology Inc公司的发展小趣事

近年来,电子行业面临着原材料价格上涨、贸易壁垒增多等挑战。Aplus Flash Technology Inc公司也受到了这些因素的影响,生产成本上升,市场竞争压力加大。为了应对这些挑战,公司及时调整了发展战略,加大了对技术研发的投入,提高了生产效率和质量。同时,公司还积极开拓国际市场,通过参加国际电子展会、建立海外销售网络等方式,拓展海外市场份额。这些举措使公司在面对市场挑战时保持了稳健的发展态势。

安纳森(AnaSem)公司的发展小趣事

随着技术的不断成熟和市场的逐步扩大,安纳森开始将目光投向更广阔的全球市场。公司积极与全球各地的合作伙伴建立战略合作关系,共同开拓市场。同时,安纳森还设立了多个海外研发中心和销售网点,以便更好地了解当地市场需求,提供更贴近用户的产品和服务。这一系列的全球化布局,不仅提升了安纳森的品牌影响力,也为其未来的发展奠定了坚实的基础。

Global Navigation Systems公司的发展小趣事
远程无线防盗报警系统可以通过智能家居系统平台进行集成。通过智能家居系统的控制中心和通信协议,可以将防盗报警系统与家中的其他智能设备(如灯光、窗帘、空调等)进行联动控制。例如,当防盗报警系统触发报警时,可以自动关闭家中的门窗、开启灯光等,以吓退入侵者或提醒家庭成员注意安全。同时,用户还可以通过智能手机等终端设备远程查看和控制家中的安全状况和设备状态。
依必安派特(ebmpapst)公司的发展小趣事

为了进一步满足中国市场的本地化需求,依必安派特在2005年成立了依必安派特电机(上海)有限公司,开始了国产化进程。这一举措不仅提高了产品的性价比,还缩短了交货周期,使得依必安派特在中国市场的竞争力得到了显著提升。随着国产化产品的快速增长,依必安派特在中国的前十年市场业绩突飞猛进,为后续的飞跃发展打下了坚实基础。

Automatic Connector公司的发展小趣事

随着全球电子市场的不断扩大,Automatic Connector公司积极寻求市场拓展的机会。公司首先在国内市场取得了良好的业绩,然后逐步将目光投向了国际市场。通过与国外代理商的合作,Automatic Connector的产品成功进入了欧洲、北美等发达地区的市场。在国际市场的竞争中,公司不断提升产品性能和服务水平,逐渐树立了良好的品牌形象。

First Switchtech公司的发展小趣事

在电子行业的初期,First Switchtech公司(或类似公司)凭借其在开关技术领域的突破性创新,迅速在市场中崭露头角。公司研发出了一种新型低功耗、高可靠性的电子开关,这一创新不仅解决了当时市场上开关设备能耗高、故障率大的问题,还极大地提升了产品的整体性能。随着这一技术的广泛应用,First Switchtech公司逐渐在电子开关领域建立了领先地位,并带动了整个行业的技术进步。

问答坊 | AI 解惑

求示波器原理的资料

找了好久,市场上没有一本关于示波器的书,淘宝也搜了。最多有本用示波器修电视机的。哪能找到些好书啊?有电子版的给我发一份好吗?先谢了。hongyijiabox@163.com…

查看全部问答>

发帖发问一个bootloader问题并邀请学习6410,PXA3XX等高级货的同志了!

这几天看了6410的eboot,并对nk.bin以及nk.nb0文件重新了解了一下,发现了很多疑问。 主要是我以前一直用ADS bootloader,现在觉得两者有不可思议的差别。 一、ADS bootloader没有拷贝全局变量到RAM的行为,但是eboot.nb0有——但是这两个格式的 ...…

查看全部问答>

急!!!IIC0改成IIC1!

如题。用的2450的板子,wince5.0的平台。现在用IIC1接我的IC芯片。现在拿到手的IIC驱动是IIC0的,即用的GPE14\\GPE15,我需要将其换成IIC1,即GPB7\\GPB8。我做了如下修改: 1、 WINCE500\\PLATFORM\\SMDK2450\\Src\\Drivers\\IIC\\i2c.c中 //#de ...…

查看全部问答>

菜鸟提问,请指教。关于中断

void int0_init(void) {         if(rEINTPEND == (1…

查看全部问答>

cramfs根文件系统启动问题

我用的优龙YL2410开发板,最近想自己制作一个cramfs跟文件系统,参考网上比较著名的一个文档《Linux系统移植》的根文件系统制作部分自己制作了一个cramfs的文件系统my_rootfs.cramfs,其中busybox使用的是1.1.3。把my_rootfs.cramfs烧写到板子后发 ...…

查看全部问答>

wince5.0 S3c2440官方bsp,带camera驱动

wince5.0 S3c2440官方bsp,带camera驱动: http://www.itxxh.cn/book/2440/zaxsw1565.shtml WINCE5.0系统下,OV9650 CAMERA驱动程序: http://www.itxxh.cn/book/2440/zaxsw1568.shtml…

查看全部问答>

sim卡座无电

我用的sim300模块,连不上线,后来发现模块给sim卡座供电的管脚没有电,这是什么原因?以前的时候一切都正常,最近要用了,却出毛病了。…

查看全部问答>

怎么样的汇编代码才算绝对地址代码,生成obj里的也没有浮动地址。

怎么样的汇编代码才算绝对地址代码,生成obj里的也没有浮动地址。 是不是代码里不要段这个伪操作就可以了?…

查看全部问答>

LM3s8962体验之五……精确的位操作

Bit-banding 又称为:极细微的位处理操作, 精确的位操作,位别名区。 为了减少读-修改-写(RMW)操作的时间,ARM在Cortex-M3处理器中引入了bit-banding技术。在bit-banding使能的处理器中,存储器映射的特定区域(SRAM和外设区)能够使用地址别 ...…

查看全部问答>

论坛的论坛,不是在做电源吗?人呢?

怎么回事,没人参加吗?好萧条啊…

查看全部问答>