STM32实战项目-触摸按键
前言:
通过触摸按键控制LED灯以及继电器,具体实现功能如下:
1、触摸按键1单击与长按,控制LED1;
2、触摸按键2单击与长按,控制LED2;
3、触摸按键3单击与长按,控制LED3;
4、触摸按键4单击与长按,控制继电器;
目录
1.硬件电路
1.1触摸按键
1.2 继电器
2.外部中断 /事件控制器(EXIT)
3.软件程序
3.1按键检测函数
3.2回调函数
3.3继电器按键检测函数
4.结果演示
1.硬件电路
1.1触摸按键
原理图如下所示:
其中,驱动芯片TTP224N,我们可以看到该芯片有四种基本参数,可以是快速单击模式;多键模式,最长输出时间为16s,还有直接模式cmos输出,低电平有效。其引脚输出是高电平, 所以 外部中断管脚默认也为高电平,当触摸按键被触摸时候,芯片引脚内部自动节点,外部管脚被自动拉低,所以,按键触发中断采用的是下降沿触发。图解如下:

1.2 继电器
原理图如下:

继电器,使用5v上拉,默认断开状态,触摸按键并没有上拉,所以采用推挽输出,默认低电平,按下之后,三极管导通,构成回路,继电器吸合。图解如下:

2.外部中断 /事件控制器(EXIT)
外部中断/事件控制器由 19 个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。
主要特性:
● 每个中断/事件都有独立的触发和屏蔽;
● 每个中断线都有专用的状态位;
● 支持多达 19 个中断/事件请求;
● 检测脉冲宽度低于 APB2 时种宽度的外部信号。参见数据手册中电气特性部分的相关参数。
框图如下:

从框图中,我们可以看到,外部中断可以边沿检测电路触发,也可由软件触发,当请求挂起,和中断屏蔽都不相应,可使能NVIC中断控制器。
3.软件程序
程序框架不会改变,只是配置完cubemax,按键端口,中断优先级(这个在上一章串口终端都介绍过)会自动生成,相应的源文件,我们只需要在我们自己的应用文件中新增继电器源文件,以及按键源文件就可以,如下图所示:

我们想要使用HLA库里面的中断函数,我们就要了解,他的参数设置,以及函数功能,如下所示:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);//回调函数
3.1按键检测函数
封装一个按键结构体,包含 标志位,按键单击和长按以及按键检测函数。
typedef struct
{uint8_t volatile KEY_Flag; //按键标志位uint8_t Click; //单击uint8_t Press; //长按void (*KEY_Detect)(void); //按键检测
} KEY_t;/* extern variables-----------------------------------------------------------*/
extern KEY_t KEY1;
extern KEY_t KEY2;
extern KEY_t KEY3;
extern KEY_t KEY4;
函数实现
初始化结构体内容及指针指向
//结构体定义
KEY_t KEY1 = {FALSE,FALSE,FALSE,KEY1_Detect};
KEY_t KEY2 = {FALSE,FALSE,FALSE,KEY2_Detect};
KEY_t KEY3 = {FALSE,FALSE,FALSE,KEY3_Detect};
KEY_t KEY4 = {FALSE,FALSE,FALSE,KEY4_Detect};
函数部分
static void KEY1_Detect()
{uint8_t i = 0;if(KEY1.KEY_Flag == TRUE){//初识状态 让其为长按KEY1.Click = FALSE;KEY1.Press = TRUE;//检测按键是否为长按for(i=0;i<200;i++){HAL_Delay(10);//两秒后,如果为高电平,则说明是单击 跳出循环if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_SET){KEY1.Click = TRUE;KEY1.Press = FALSE;break; }}if(KEY1.Click == TRUE){printf("检测到触摸按键1单击\r\n");//翻转一下LED.LED_Flip(LED1);}if(KEY1.Press == TRUE){printf("检测到触摸按键1长按\r\n");//LED.LED_Flip(LED1);HAL_Delay(200);LED.LED_Flip(LED1);}//回到起始状态KEY1.KEY_Flag = FALSE;KEY1.Click = FALSE;KEY1.Press = FALSE;}
}
3.2回调函数
对于按键检测标志位,有触摸按键 触摸时候就会触发中断进入回调函数,代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin){case KEY1_Pin: KEY1.KEY_Flag = TRUE; break;case KEY2_Pin: KEY2.KEY_Flag = TRUE; break;case KEY3_Pin: KEY3.KEY_Flag = TRUE; break;case KEY4_Pin: KEY4.KEY_Flag = TRUE; break;default:printf("´错误,触摸按键错误\r\n\r\n");}
}
3.3继电器按键检测函数
原理跟控制led灯的按键一样,控制继电器打开,关闭,以及翻转,具体代码如下,
结构体封装:
typedef struct
{void (*Relay_ON)(void); //打开void (*Relay_OFF)(void); //关闭void (*Relay_Flip)(void); //·翻转
} Relay_t;/* extern variables-----------------------------------------------------------*/
extern Relay_t Relay;
函数实现:
static void Relay_ON(void);
static void Relay_OFF(void);
static void Relay_Flip(void);/* Public variables-----------------------------------------------------------*/
Relay_t Relay =
{Relay_ON,Relay_OFF,Relay_Flip
};static void Relay_ON(void)
{HAL_GPIO_WritePin(Relay_GPIO_Port,Relay_Pin,GPIO_PIN_SET);
}/** @name Relay_OFF* @brief 关闭* @param None* @retval None
*/
static void Relay_OFF(void)
{HAL_GPIO_WritePin(Relay_GPIO_Port,Relay_Pin,GPIO_PIN_RESET);
}/** @name Relay_Flip* @brief 取反* @param None* @retval None
*/
static void Relay_Flip(void)
{HAL_GPIO_TogglePin(Relay_GPIO_Port,Relay_Pin);
}
4.结果演示

相关文章:
STM32实战项目-触摸按键
前言: 通过触摸按键控制LED灯以及继电器,具体实现功能如下: 1、触摸按键1单击与长按,控制LED1; 2、触摸按键2单击与长按,控制LED2; 3、触摸按键3单击与长按,控制LED3; 4、触摸按键4单击与长…...
安全行业-术语(万字)
肉鸡 所谓“肉鸡”说一种很形象的比喻,比喻那些可以任意被我们控制的电脑,对方可以是Windows系统,也可以说UNIX/linux系统,可以说普通的个人电脑,也可以是大型的服务器,我们可以像操作自己的电脑那样来操控…...
P1113 杂务(拓扑排序 or 记忆回溯)
题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更…...
Web3中文|政策影响下的新加坡Web3步伐喜忧参半
如果说“亚洲四小龙”是新加坡曾经的荣耀,那么当时代进入21世纪的第二个十年,用新加坡经济协会(SEE)副主席、新加坡新跃社科大学教授李国权的话来说,新加坡现在的“荣耀”是全球金融的主要“节点”或区块链行业发展的关…...
Java数据库高阶面试题,好程序员学员分享百度Java面试流程
小源下面分享一位好程序员的学员去百度Java面试流程!百度技术一面(20分钟)1、自我介绍很流畅捡重点介绍2、数据结构算法好不好挺好的(其实心还是有点虚,不过最近刷了很多好程序员出的题感觉没问题!)3、找到单链表的三等分点,如果单…...
栈和队列习题精选(持续更新中)
第一题(括号匹配)给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。…...
大数据开发 - Java入门6
目录标题do-while循环练习1:从键盘输入单词,讲输入的单词输出到控制台,输入是exit时退出循环练习2:键盘输入密码和确认密码,两次密码一致就退出循环打印注册成功,两次密码不一致就循环输入两次密码死循环fo…...
开源超级终端工具——WindTerm
1、下载和安装(我的是win10,其他版本各位自选) Releases kingToolbox/WindTerm GitHub 安装的话,相信大家不用我赘述了。 初始界面是这样的: 2、WindTerm使用 2.1 本地会话(最下面那个框,发…...
【Linux】信号常见概念
文章目录信号入门生活中的信号技术应用角度的信号signal函数注意事项信号的概念信号的产生信号的记录(保存)信号处理常见方式概述信号入门 生活中的信号 你在网上买了很多件商品,在等待不同商品快递的到来 但即便快递还没有到来,你也知道快递到了的时候应该怎么处理快递,也就…...
15000 字的 SQL 语句大全 第一部分
一、基础 1、说明:创建数据库CREATE DATABASE database-name 2、说明:删除数据库drop database dbname 3、说明:备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat …...
突发——字节跳动被要求出售 TikTok 股票,否则禁令,低代码也曾被打压
一、欲加之罪,何患无辞! 正值人们对TikTok和其它社交媒体平台对年轻用户的影响进行更广泛、持续的反思之际,美政客们以数据安全为由要求TikTok出售股票,已然不顾文明国家的体面。 在美国,TikTok拥有1.4亿用户&#x…...
2023年网络安全趋势
数据安全越来越重要。 我国《数据安全法》提出“建立健全数据安全治理体系”,各地区部门均在探索和简历数据分类分级、重要数据识别与重点保护制度。 数据安全治理不仅是一系列技术应用或产品,更是包括组织构建、规范制定、技术支撑等要素共同完成数据…...
html练习
1.用户注册界面 代码: <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#" method"get"><table border"1" widt…...
【Redis】Redis 是如何保证高可用的?(背诵版)
Redis 是如何保证高可用的?1. 说一下 Redis 是如何保证高可用的?2. 了解过主从复制么?2.1 Redis 主从复制主要的作用是什么?2.2 Redis 主从模式的拓扑结构?(1)一主一从结构(2)一主多…...
Qt---去掉标题栏后,最大化应用程序窗口时,窗口遮住了任务栏
// showMaximized(); // Qt最大化显示函数 任务栏都会覆盖static bool max false;static QRect location this->geometry();if (max) {this->setGeometry(location);//回复窗口原大小和位置// ui->maxBtn->setIcon(QIcon(":/MAX_.png"));}else {// ui-…...
Cadence Allegro 导出Netin(non-back)报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Netin(non-back)作用3,Netin(non-back)示例4,Netin(non-back)导出方法4.1,方法1:4.2,方法2:B站关注“硬小二”浏览更多演示视频...
HTML语言
1.什么是HTML? 1、HTML是超文本标记语言(Hyper Text Markup Language) 2、HTML由各种各样的标签(tag)组成,如、 3、HTML文档 网页 (1)一种纯文本文件,扩展名为.html或.html; (2)最终显示结果取决…...
线性代数之行列式
一、思维导图二、二阶、三阶行列式的定义1、二阶行列式2、三阶行列式沙路法展开3、解方程3.1解二元一次方程组观察上面两个未知量的值不难发现,它 们的分母均是上述方程组未知量的系数形成的二阶行列式,𝑥1的分子是将系数行列 式的第一列换成…...
【FPGA-Spirit_V2】小精灵V2开发板初使用
🎉欢迎来到FPGA专栏~小精灵V2开发板初使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家…...
STL与其空间配置器
目录什么是STLSTL的六大组件STL的缺陷什么是空间配置器为什么需要空间配置器GI-STL空间配置器实现原理一级空间配置器二级空间配置器内存池SGI-STL中二级空间配置器设计SGI-STL二级空间配置器之空间申请前期的准备申请空间填充内存块向内存池中索要空间SGI-STL二级空间配置器之…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
