嵌入式-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里面生效。

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

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

相关推荐
Dxy12393102167 小时前
Python路径算法简介
开发语言·python·算法
And_Ii7 小时前
LCR 132.砍竹子Ⅱ
算法
汀、人工智能7 小时前
[特殊字符] 第67课:跳跃游戏II
数据结构·算法·数据库架构·图论·bfs·跳跃游戏ii
不做无法实现的梦~7 小时前
px4仿真和示例运行
单片机·嵌入式硬件
世微 如初8 小时前
AP5125 宽压大功率 LED 恒流驱动器:技术参数与应用设计指南
stm32·单片机·嵌入式硬件
Little At Air8 小时前
LeetCode 30. 串联所有单词的子串 | 困难 C++实现
算法·leetcode·职场和发展
手握风云-8 小时前
优选算法的层序之径:队列专题
数据结构·算法·leetcode
2301_789015628 小时前
C++:智能指针
c语言·开发语言·汇编·c++·智能指针
不怕犯错,就怕不做8 小时前
rk3562 buildrooot编译更新的lib库push后无效问题分析
linux·驱动开发·嵌入式硬件