STM32——按钮实验

使用一枚按钮去切换板载led的亮灭状态,每按下一次按钮,板载led的亮灭状态切换一次。

软件部分

板载led连接PC13,采用开漏接法(上面的MOS一直断开),PA0接按钮,把PA0设置为输入上拉模式。松开按钮PA0被上拉电阻拉到高电压,按下按钮,PA0通过按钮接地。当我们按下按钮的时候led亮灭状态没有变化,当松开时候才有变化。

因此需要捕捉按钮变化的瞬间,pre保存按钮上一次的值,cur保存按钮当前的值,然后使用蓝色虚线保持当前时刻,不断更新pre和cur的值,当pre和cur相等,代表按钮状态没有变化,pre和cur不相等,表示捕捉到按钮变化瞬间。然后进一步判断,捕捉到了按钮按下还是抬起的动作。如果像现在这样,cur=0,则表示按钮按下,反之,按钮松开。

首先声明两个变量:pre和cur,0表示按下,1表示松开,给pre和cur都赋初值1,表示按钮是松开的。在while循环内部,不断更新pre和cur,pre就是上一个时刻cur的值,直接赋值更新, cur的值就是读取PA0引脚状态,调用HAL_GPIO_ReadPin读取PA0的电压,如果读到高电压cur=1,反之为0。接着判断pre和cur是否相等,不相等说明捕捉到了按钮变化瞬间,进一步判断是按钮按下还是抬起,cur=0为按下,反之为抬起。

需要达到的效果是,按下按钮的时候led状态保持不变,抬起按钮瞬间,led切换亮灭状态,因此,应该把切换led亮灭的代码写在else里面。使用led_state保持led当前状态,0表示熄灭,1表示点亮。如果当前led点亮,就熄灭,并更新led_state的值,如果led熄灭,就点亮,也更新led_state的值。

把这些代码烧录进单片机,有时候会发现代码失灵,这是由于按键抖动引起的,使用软件进行消抖,在理想情况下,当按下按钮,引脚上的电压从高电压变成低电压,当松开按钮,引脚上的电压从高电压变成低电压,但实际上,按钮存在抖动,会造成多次触发,而按钮的抖动时间,一般不会超过10ms,因此,监测到按钮动作之后,延迟10ms就可以了。

硬件部分

参考这篇文章,写得特别好

深度解析嵌入式开发中的按键去抖技术 -- 吴川斌的博客

提炼重点写在这里,在使用单掷开关时,采用RC网络后接施密特反向触发器实现硬件上的消抖,开关松开处在稳定状态时,A处电平被拉高为高电平,施密特触发器输出低电平。当按钮按下时,电容通过R41放电, A处的电压从高电平下降到低电平,放电时长由RC控制,在A处电压降低到施密特反向触发器的低电平阈值V t *h-*后,输出Y翻转为高电平,这个放电时长刚好弥补了按钮的跳变时间,所以有效实现了硬件的消抖。按钮松开同理,这里不再次赘述。

相关推荐
Jcenav8 小时前
OCXO外围电路设计指南
单片机·嵌入式硬件
Nautiluss8 小时前
一起玩XVF3800麦克风阵列(八)
大数据·人工智能·嵌入式硬件·github·音频·语音识别
神圣的大喵8 小时前
平台无关的嵌入式通用按键管理器
c语言·单片机·嵌入式硬件·嵌入式·按键库
三佛科技-134163842128 小时前
FT8353系列(FT8353A/B/C/CD/DD/K/KD/PD)隔离型LED恒流驱动IC芯片 典型应用电路
单片机·物联网·智能家居·pcb工艺
无人装备硬件开发爱好者9 小时前
深度解析:STM32 MDK 工程 HEX 文件转 BIN 文件 —— 原理、方法、优缺点与实战指南(中)
stm32·嵌入式软件·hex2bin
阿拉斯攀登9 小时前
嵌入式-硬件基础:了解三极管
单片机·嵌入式硬件·三极管
逐步前行10 小时前
C51_74HC165并口转串口
单片机·51单片机
HarrySunCn10 小时前
如何使用VSCode开发Arduino项目
ide·vscode·单片机·编辑器
嵌入式的飞鱼11 小时前
SD NAND 焊接避坑指南:LGA-8 封装手工焊接技巧与常见错误
人工智能·stm32·单片机·嵌入式硬件·tf卡
三佛科技-1341638421211 小时前
LN8K05A/B/C_5V非隔离AC-DC电源芯片 典型应用场景、典型电路、与阻容降压的对比分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺