1.对比用延时消抖的方式检测按键和用中断的方式检测按键:对于中断检测按键的方式,如果不在程序中做一些再次检测按键是否按下等处理的话,其精度是不如用延时消抖的方式加测按键来的可靠。
2.原因在于:我们在利用中断检测按键时,在中断程序中并没有延时,那么就会存在一个问题,当按下按键时,会可能有多次抖动,尽管我们设置的是下降沿触发中断,但这多次的抖动中也同样可能会有多次下降沿,故就有可能多次触发中断。
3.解决的办法还是只能通过延时,修正后的代码见下图3;而对于《STM32库开发实战指南》 P90 中的代码是会引起误触发的。
图1:传统方式的延时消抖检测按键程序
图2:粗略的延时函数
图3:修正后的利用中断方式检测按键的代码
4.那么问题来了,在中断程序中也使用了延时,那跟传统的延时消抖还有什么区别呢?
区别是:传统的延时消抖程序要写在 main函数 的 while循环 中,不停的检测按键是否按下,白白占用CPU资源;而采用中断的方式,并不会影响其他程序的执行,只有当按键按下时,才会触发中断,进入到中断服务程序中。
关键字:STM3 检测按键
引用地址:
STM32中关于检测按键的一些问题
推荐阅读最新更新时间:2024-03-16 16:22
【STM32】GPIO输入—按键检测
2.1硬件设计 弹性按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一 下子断开,使用按键时会产生如图带波纹信号,需要用软件消抖处理滤波,不方便输入检测。当然有专用的去抖电路,也有专用的去抖芯片,但通常我们用软件延时的方法就能解决抖动问题,没有必要添加多余的硬件电路。 2.2软件设计 同 LED 的工程,为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便 以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根 据您的喜好命名,这些文件不属于 STM32标准库的内容,是由我们自己根据应用需要编写 的。 2.2.1编程要点 使能 GPIO端口时钟;
[单片机]
一文详解STM32的时钟系统
STM32的时钟树 时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。 STM32本身十分复杂,外设非常多,任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,如果都用高速时钟势必造成浪费。同一个电路,时钟越快功耗越大、抗电磁干扰能力越弱。复杂的MCU采用多时钟源的方法来解决这些问题。如下图,是STM32的时钟系统框图。 如上图左边的部分,看到STM32有4个独立时钟源,HSI、HSE、LSI、LSE。 HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。 HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 LSI是低速内部时钟,RC
[单片机]
51单片机入门之七:按键检测
按键是单片机系统中最常用的交互方式,大学课程里介绍按键的时候,分为了两种:独立式按键和矩阵式按键。在单片机初期,各种扩展芯片的匮乏,导致了IO口资源的宝贵。而今各种按键管理芯片层出不穷,可以实现用尽可能少的IO口检测较多的按键,所以本人认为,矩阵式键盘如今存在的意义只是用在教学上了。下面介绍按键检测的方法。 功能描述: 图中有8个按键,8个发光二极管,1个数码管。当按键1按下时,数码管显示数字1,同时第一个发光二极管点亮。依次类推,当第八个按钮按下时,数码管显示8,并且第八个发光二极管点亮。 硬件分析:按键的一端接单片机,另一端接地,按键按下后单片机侧为低电平,所以当单片机检测到相应的端口为低电平时即可判断按键被按下,(实
[单片机]
STM32-(05):GPIO原理与操作
简单分析:红色框主要是输出电路(O),蓝色框主要是输入电路(I);关于输出电路,可以通过写位设置/清除寄存器来改变输出数据寄存器,或者直接读写输出数据寄存器,有这两种方式,继而通过I/O端口输出。如果打开了复用功能,就走复用的通道,输出控制就是一个锁存器。若寄存器写入1,输出控制的上方输出1,则CMOS管P-MOS导通,CMOS管N-MOS不导通,输出高电平,若寄存器写入0,输出低电平。关于输入电路,I/O进来有两个保护二极管,防止电压过高,再进入,有两个电阻,上拉和下拉,当不拉时为浮空输入,一般用于模拟输入,经过施密特触发器,如果用作GPIO口,将值写入寄存器,如果用作复用,走复用通道。 GPIO功能描述 端口配置表+
[单片机]
KST51单片机:通过中断实现矩阵按键的次数检测与消抖
以Key4为例,使用定时中断2ms进行消抖,对连续8次(16ms)的按键状态进行判断. 如果全部为1则弹起,将按键当前状态(Keysta)为1; 全部为0则按下,将按键当前状态(Keysta)置0; 其余状态都为抖动,按键当前状态不变。 在主程序里对按键状态进行判断,如果按键当前状态(Keysta)与按键历史状态(backup)不同,则说明按键状态发生变化。程序中是弹起时,按键次数改变,将最新的按键次数送给数码管显示,将按键历史状态更新为当前状态并进行下一次判断。源代码如下: #include reg52.h sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2
[单片机]
stm32f103——外部中断和事件——检测按键按下点灯
中断与事件的区别 我们先来看中断/事件控制器的内部 注意:对某个通道的上升沿和下降沿检测,通过配置上升/下降沿选择寄存器来进行检测哪一种沿。但是,只能在上升沿和下降沿两者中二选一来进行检测。 中断/事件寄存器:选择最后输出的是中断还是事件。 如果选择的是事件寄存器: 路径如图所示: 选择事件寄存器后,路径如图中红色箭头所示,我们由此可以知道事件路径最终输出的是脉冲信号。所以,事件的最终产物是指定频率的脉冲信号。可以输出脉冲信号给外设,使外设做出相应操作。 如果选择的是中断寄存器: 路径如图所示: 选择中断寄存器后,路径如图中红色箭头所示,我们由此可以知道中断路径到达的是中断控制器NVIC,然
[单片机]
MSP430利用IO中断方式来实现按键检测
/************************************************************************ **********MSP430F14-利用IO中断方式实现按键检测程序*********** 以下是结合MC430F14开发板来实现的按键检处理程序实验。分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转。例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机。单片机唤醒后再进行去抖动动作,同时执行键处理程序;处理完后再次进入LPM4低功耗模式。 在本程序中用户可以灵活地修改程序来实现你相关的功能。 本程序适用在手持设备或电池
[单片机]
MSP430入门教程专题(六)——IO中断方式按键检测
//MSP430F14-利用IO中断方式实现按键检测程序 //以下是结合MC430F14开发板来实现的按键检处理程序实验. //分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转. //例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机.单片机唤醒 //后再进行去抖动动作.同时执行键处理程序.处理完后再次进入LPM4低功耗模式. //在本程序中用户可以灵活地修改程序来实现你相关的功能. //本程序适用在手持设备或电池供电的设计中.此程序结构比较通用,级用户可参与或套用修改. //应用目标板:MC430F14x开发板 #include msp430x14x.h #defin
[单片机]