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.结果演示

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1604.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解Spring、SpringBoot、SpringCloud三者的联系与区别

一、Spring Spring 是一个轻量级的Java 开发框架&#xff0c;主要依存于SSM 框架&#xff0c;即Spring MVC Spring Mybatis&#xff0c;定位很明确&#xff0c;Spring MVC主要负责view 层的显示&#xff0c;Spring 利用IOC 和AOP 来处理业务&#xff0c;Mybatis则是数据的持…

跨域解决方案

跨域解决方案 1.跨域基本介绍 文档&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS 跨域问题是什么&#xff1f; 一句话&#xff1a;跨域指的是浏览器不能执行其他网站的脚本&#xff0c;它是由浏览器的同源策略造成的&#xff0c;是浏览器对 javascr…

数据结构 | 栈的中缀表达式求值

目录 什么是栈&#xff1f; 栈的基本操作 入栈操作 出栈操作 取栈顶元素 中缀表达式求值 实现思路 具体代码 什么是栈&#xff1f; 栈是一种线性数据结构&#xff0c;具有“先进后出”&#xff08;Last In First Out, LIFO&#xff09;的特点。它可以看作是一种受限的…

“国产版ChatGPT”文心一言发布会现场Demo硬核复现

文章目录前言实验结果一、文学创作问题1 :《三体》的作者是哪里人&#xff1f;问题2&#xff1a;可以总结下三体的核心内容吗&#xff1f;如果要续写的话&#xff0c;可以从哪些角度出发&#xff1f;问题3&#xff1a;如何从哲学角度来进行续写&#xff1f;问题4&#xff1a;电…

学习28个案例总结

学习前 对于之前遇到的问题没有及时总结&#xff0c;导致做什么事情都是新的一样。没有把之前学习到接触到的内容应用上。通过这次对28个案例的学习。把之前遇到的问题总结成自己的经验&#xff0c;在以后的开发过程中避免踩重复性的坑。多看帮助少走弯路。 学习中 对28个案例…

2023年安徽省中职网络安全跨站脚本攻击

B-4&#xff1a;跨站脚本攻击 任务环境说明&#xff1a; √ 服务器场景&#xff1a;Server2125&#xff08;关闭链接&#xff09; √ 服务器场景操作系统&#xff1a;未知 √ 用户名:未知 密码&#xff1a;未知 1.访问服务器网站目录1&#xff0c;根据页面信息完成条件&am…

Shader基础

参考文章:Unity着色器介绍 Shader基础 Properties 声明格式 [optional: attribute] name(“display text in Inspector”, type name) default value 属性类型 Color&#xff1a;颜色属性&#xff0c;表示 RGBA 颜色值。Range&#xff1a;范围属性&#xff0c;表示一个在…

基于微信小程序的校园二手交易平台小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

22讲MySQL有哪些“饮鸩止渴”提高性能的方法

短连接风暴 是指数据库有很多链接之后只执行了几个语句就断开的客户端&#xff0c;然后我们知道数据库客户端和数据库每次连接不仅需要tcp的三次握手&#xff0c;而且还有mysql的鉴权操作都要占用很多服务器的资源。话虽如此但是如果连接的不多的话其实这点资源无所谓的。 但是…

Web自动化——前端基础知识(二)

1. Web前端开发三要素 web前端开发三要素 什么是HTMl&#xff1f; Html是超文本标记语言&#xff0c;是用来描述网页的一种标记语言HTML是一种标签规则的形式将内容呈现在浏览器中可以以任意编辑器创建&#xff0c;其文件扩展名为.html或.htm保存即可 什么是CSS&#xff1f;…

ElasticSearch-第五天

目录 es中脑裂问题 脑裂定义 脑裂过程分析 解决方案 数据建模 前言 nested object 父子关系数据建模 父子关系 设置 Mapping 索引父文档 索引子文档 Parent / Child 所支持的查询 使用 has_child 查询 使用 has_parent 查询 使用 parent_id 查询 访问子文档 …

学习 Python 之 Pygame 开发魂斗罗(一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;一&#xff09;Pygame回忆Pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音乐7. 图片翻转与…

人脸活体检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;人脸活体检测系统利用视觉方法检测人脸活体对象&#xff0c;区分常见虚假人脸&#xff0c;以便后续人脸识别&#xff0c;提供系统界面记录活体与虚假人脸检测结果。本文详细介绍基于YOLOv5深度学习技术的人脸活体检测系统&#xff0c;在介绍算法原理的同时&…

【C++】用手搓的红黑树手搓set和map

目录 一、set/map的底层结构 1、set/map的源码 2、利用模板区分set/map 3、利用仿函数控制比较大小 二、set/map的迭代器&#xff08;红黑树的迭代器&#xff09; 1、红黑树的begin、end迭代器 2、红黑树迭代器的operator 3、红黑树迭代器的operator-- 三、set的const…

人工智能大模型之ChatGPT原理解析

前言 近几个月ChatGPT爆火出圈&#xff0c;一路狂飙&#xff1b;它功能十分强大&#xff0c;不仅能回答各种各样的问题&#xff0c;还可以信写作&#xff0c;给程序找bug…我经过一段时间的深度使用后&#xff0c;十分汗颜&#xff0c;"智障对话"体验相比&#xff0c…

Spring-Data-Redis 和 Redisson TLS/SSL 连接

先决条件已经部署好redis tls环境。如未部署好&#xff0c;可参考&#xff1a;Redis 6.0 Docker容器使用SSL/TLS已知redis tls环境使用的证书&#xff1a;其中&#xff1a;ca.crt :服务器证书ca.key:服务器私钥redis.crt:客户端证书redis.key:客户端私钥证书处理生成证书p12文件…

Linux环境C语言开发基础

C语言是一门面向过程的计算机编程语言&#xff0c;与C、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言诞生于美国的贝尔实验室&#xff0c;由丹…

信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)

信创办公–基于WPS的PPT最佳实践系列&#xff08;表格和图标常用动画&#xff09; 目录应用背景操作步骤图表常用动画效果&#xff1a;擦除效果表格常用动画效果&#xff1a;轮子效果应用背景 文不如表&#xff0c;表不如图。在平时用ppt做总结时&#xff0c;我们会经常用到图…

手撕数据结构与算法——树(三指针描述一棵树)

&#x1f3c6;作者主页&#xff1a;king&南星 &#x1f384;专栏链接&#xff1a;数据结构 &#x1f3c5;文章目录&#x1f331;树一、&#x1f332;概念与定义二、&#x1f333;定义与预备三、&#x1f334;创建结点函数四、&#x1f340;查找五、&#x1f341;插入六、&a…

SpringBoot接口 - 如何生成接口文档之Swagger技术栈

SpringBoot开发Restful接口&#xff0c;有什么API规范吗&#xff1f;如何快速生成API文档呢&#xff1f;Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲&#xff0c;Swagger 就是将项目中所有&#xff08;想要暴露的&#xff09;接口展现在页面上&am…