当前位置: 首页 > news >正文

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实战项目-触摸按键

前言&#xff1a; 通过触摸按键控制LED灯以及继电器&#xff0c;具体实现功能如下&#xff1a; 1、触摸按键1单击与长按&#xff0c;控制LED1&#xff1b; 2、触摸按键2单击与长按&#xff0c;控制LED2; 3、触摸按键3单击与长按&#xff0c;控制LED3; 4、触摸按键4单击与长…...

安全行业-术语(万字)

肉鸡 所谓“肉鸡”说一种很形象的比喻&#xff0c;比喻那些可以任意被我们控制的电脑&#xff0c;对方可以是Windows系统&#xff0c;也可以说UNIX/linux系统&#xff0c;可以说普通的个人电脑&#xff0c;也可以是大型的服务器&#xff0c;我们可以像操作自己的电脑那样来操控…...

P1113 杂务(拓扑排序 or 记忆回溯)

题目描述 John的农场在给奶牛挤奶前有很多杂务要完成&#xff0c;每一项杂务都需要一定的时间来完成它。比如&#xff1a;他们要将奶牛集合起来&#xff0c;将他们赶进牛棚&#xff0c;为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的&#xff0c;因为这样才有更…...

Web3中文|政策影响下的新加坡Web3步伐喜忧参半

如果说“亚洲四小龙”是新加坡曾经的荣耀&#xff0c;那么当时代进入21世纪的第二个十年&#xff0c;用新加坡经济协会&#xff08;SEE&#xff09;副主席、新加坡新跃社科大学教授李国权的话来说&#xff0c;新加坡现在的“荣耀”是全球金融的主要“节点”或区块链行业发展的关…...

Java数据库高阶面试题,好程序员学员分享百度Java面试流程

小源下面分享一位好程序员的学员去百度Java面试流程&#xff01;百度技术一面(20分钟)1、自我介绍很流畅捡重点介绍2、数据结构算法好不好挺好的(其实心还是有点虚&#xff0c;不过最近刷了很多好程序员出的题感觉没问题&#xff01;)3、找到单链表的三等分点&#xff0c;如果单…...

栈和队列习题精选(持续更新中)

第一题&#xff08;括号匹配&#xff09;给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。…...

大数据开发 - Java入门6

目录标题do-while循环练习1&#xff1a;从键盘输入单词&#xff0c;讲输入的单词输出到控制台&#xff0c;输入是exit时退出循环练习2&#xff1a;键盘输入密码和确认密码&#xff0c;两次密码一致就退出循环打印注册成功&#xff0c;两次密码不一致就循环输入两次密码死循环fo…...

开源超级终端工具——WindTerm

1、下载和安装&#xff08;我的是win10&#xff0c;其他版本各位自选&#xff09; Releases kingToolbox/WindTerm GitHub 安装的话&#xff0c;相信大家不用我赘述了。 初始界面是这样的&#xff1a; 2、WindTerm使用 2.1 本地会话&#xff08;最下面那个框&#xff0c;发…...

【Linux】信号常见概念

文章目录信号入门生活中的信号技术应用角度的信号signal函数注意事项信号的概念信号的产生信号的记录(保存)信号处理常见方式概述信号入门 生活中的信号 你在网上买了很多件商品,在等待不同商品快递的到来 但即便快递还没有到来,你也知道快递到了的时候应该怎么处理快递,也就…...

15000 字的 SQL 语句大全 第一部分

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name 2、说明&#xff1a;删除数据库drop database dbname 3、说明&#xff1a;备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat …...

突发——字节跳动被要求出售 TikTok 股票,否则禁令,低代码也曾被打压

一、欲加之罪&#xff0c;何患无辞&#xff01; 正值人们对TikTok和其它社交媒体平台对年轻用户的影响进行更广泛、持续的反思之际&#xff0c;美政客们以数据安全为由要求TikTok出售股票&#xff0c;已然不顾文明国家的体面。 在美国&#xff0c;TikTok拥有1.4亿用户&#x…...

2023年网络安全趋势

数据安全越来越重要。 我国《数据安全法》提出“建立健全数据安全治理体系”&#xff0c;各地区部门均在探索和简历数据分类分级、重要数据识别与重点保护制度。 数据安全治理不仅是一系列技术应用或产品&#xff0c;更是包括组织构建、规范制定、技术支撑等要素共同完成数据…...

html练习

1.用户注册界面 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#" method"get"><table border"1" widt…...

【Redis】Redis 是如何保证高可用的?(背诵版)

Redis 是如何保证高可用的&#xff1f;1. 说一下 Redis 是如何保证高可用的&#xff1f;2. 了解过主从复制么&#xff1f;2.1 Redis 主从复制主要的作用是什么?2.2 Redis 主从模式的拓扑结构&#xff1f;&#xff08;1&#xff09;一主一从结构&#xff08;2&#xff09;一主多…...

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&#xff1f; 1、HTML是超文本标记语言&#xff08;Hyper Text Markup Language&#xff09; 2、HTML由各种各样的标签(tag)组成&#xff0c;如、 3、HTML文档 网页   (1)一种纯文本文件&#xff0c;扩展名为.html或.html&#xff1b;   (2)最终显示结果取决…...

线性代数之行列式

一、思维导图二、二阶、三阶行列式的定义1、二阶行列式2、三阶行列式沙路法展开3、解方程3.1解二元一次方程组观察上面两个未知量的值不难发现&#xff0c;它 们的分母均是上述方程组未知量的系数形成的二阶行列式&#xff0c;&#x1d465;1的分子是将系数行列 式的第一列换成…...

【FPGA-Spirit_V2】小精灵V2开发板初使用

&#x1f389;欢迎来到FPGA专栏~小精灵V2开发板初使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家…...

STL与其空间配置器

目录什么是STLSTL的六大组件STL的缺陷什么是空间配置器为什么需要空间配置器GI-STL空间配置器实现原理一级空间配置器二级空间配置器内存池SGI-STL中二级空间配置器设计SGI-STL二级空间配置器之空间申请前期的准备申请空间填充内存块向内存池中索要空间SGI-STL二级空间配置器之…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...