嵌入式-SPI番外之按钮驱动程序的编写-Day15

目录

一、按钮简单操作回忆

二、按钮新操作实现

(1)按钮的点击实现灯亮/灭

①连接电路

②初始化板载LED和按钮

③按钮程序的基本原理(核心仍为0亮/1灭)

④按钮消抖的原理

三、按钮封装的操作-点击,双击,多击,长按

(1)实验结果

使用串口调试助手实现,按钮的多种操作实现串口助手的数字变化。(单机-数字+1,双击数字清零,长按数字持续++)

(2)搭建电路

(3)串口的初始化

(4)按钮初始化

(5)进程函数(必须要有的)


一、按钮简单操作回忆

首先,回忆一下之前学过的GPIO的按钮实验,即做到了持续按下按钮,灯持续亮,松开按钮,则灯灭。

代码的简单逻辑是:

二、按钮新操作实现

(1)按钮的点击实现灯亮/灭

最终实现:当点击按钮并松开的时候,实现灯亮,再点击然后松开的时候,实现灯灭,即不断的点击切换灯的状态。(这就不是之前的长按了)

①连接电路

②初始化板载LED和按钮

初始化按钮,其实就是初始化单片机的随便一个正常的GPIO的引脚,初始化为输入上拉模式;

初始化板子上的LED,其实就是将指定的GPIO的13引脚初始化为输出开漏模式;

③按钮程序的基本原理(核心仍为0亮/1灭)

这里主要的难点是当按钮被点击后,你松开按钮的一瞬间让灯实现状态的转换。

所以需要获取松开按钮的指令,核心为0亮/1灭,所以使用两变量存储状态的变化,当变化发送,并且是信号从0变为1,表示松开按钮了,那就向板载灯发送对应的信号。

这里逻辑很简单,就是默认是按钮松开的,所以默认是1的信号,然后不断的读当前的输入寄存器的信号,当发生变化了,就:

首先判断当前的变化是松开还是按下,我们这里实现的是按钮松开去实现灯的变化,所以选择第一个去实现。

之后在当前的if条件里面去切换亮灭状态。(这里有个小难点,你不知道当前的灯的状态是啥,所以你不好控制让他亮还是灭,所以这里使用GPIO自带的读取输出寄存器的值(读取最近一次发送的值)接口去读取他之前是的状态是啥,如果之前的输出寄存器是1(灭),那么就写0让他亮,相反同理。)

④按钮消抖的原理

通过前面的实验会进行基本的实现,但是会出现一个问题,就是按钮有时候按下去失灵,这就是抖动出现的毛刺现象。

比如当按下的时候,会出现不稳定的波动毛刺,既而导致刚按下或者松开的一会,会有高低电压的抖动,而失灵也正是因为此时你刚按下的时候,他一开始抖动造成的0-1-0-1-0这种,那因为一开始这种抖动变化的很快,导致人眼只能看见一开始的0和最后抖完的0,所以就相当于没有变化,即失灵现象。

要解决这种,直接加个延迟就行。

三、按钮封装的操作-点击,双击,多击,长按

(1)实验结果

使用串口调试助手实现,按钮的多种操作实现串口助手的数字变化。(单机-数字+1,双击数字清零,长按数字持续++)

(2)搭建电路

(3)串口的初始化

串口初始化,就两步

(1)IO引脚的初始化

(2)自身模块的初始化

(4)按钮初始化

封装函数里面有这个button的封装,直接用就行,其中有按钮的Init,具体的功能为:

实现了按钮的初始化,同样是两个参数:

一个是名称(需要自己定义一个变量去传地址进去)

一个是结构体(内部的那几个可以都默认为0)

注意:这里按钮的初始化里面没有初始化引脚为IPU即输入上拉模式,是因为在这个初始化参数里面默认实现了,所以这里的结构体只需提供GPIO名称和引脚编号

(5)进程函数(必须要有的)

该函数需要放到main的while里面生效。

原因就是这个函数内部就是前面实现的那个按钮点击实现灯亮/灭的操作,这里去掉了灯的亮灭指令保留按钮的按或者释放的检测功能。

当按钮按下/释放的时候,会自动执行(按钮按下/或者按钮释放的回调函数)以及一个按钮轮询 的一个函数,这个函数里面就根据检测到按钮的实现情况去动态的调用你自己实现的按钮点击和按钮长按的回调函数

相关推荐
迎風吹頭髮28 分钟前
UNIX下C语言编程与实践53-UNIX 共享内存控制:shmctl 函数与共享内存管理
服务器·c语言·unix
SundayBear2 小时前
基于STM32的RT-Thread移植
单片机·嵌入式硬件
学Linux的语莫3 小时前
机器学习数据处理
java·算法·机器学习
R6bandito_3 小时前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
逆小舟3 小时前
【C/C++】指针
c语言·c++·笔记·学习
earthzhang20213 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
清风6666664 小时前
基于单片机的元胞自动机仿真系统设计
单片机·嵌入式硬件·毕业设计·课程设计
迎風吹頭髮4 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
千千道4 小时前
利用keil +RASC给瑞萨RA8D1编译烧写程序
单片机·嵌入式硬件·mcu·物联网
武文斌774 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习