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实战项目-触摸按键相关推荐
- 项目篇 | 基于STM32单片机NBIOT定位实战项目
前言 绘制基于 STM32 单片机的 NBIOT 实战项目. 文章目录 前言 一.原理图 1.绘制 1)电源供电 a.USB 转 TTL 电路 b.锂电池充电管理电路 c.3.3V电压转换电路 d.一 ...
- STM32+4G模块实战项目(连接阿里云物联网平台+OTA升级):(一)初识硬件
STM32+4G模块实战项目(OTA升级) 构思占坑中ing.....,3天一章,请耐心等待 STM32+4G模块实战项目(连接阿里云物联网平台+OTA升级):(一)初识硬件 STM32+4G模块实战 ...
- STC15单片机实战项目 - 项目需求
以经典的51内核单片机设计一款产品,功能如下: 1.采用宏晶的STC15L2K32S2-LQFP32,2k SRAM,32k ROM: 目的:选用STC15系列1T的经典51内核单片机,资源丰富. 2 ...
- STM32实战总结:HAL之GUI
在TFT上简单的显示字符.数字.汉字.图形.图片等,都是一些简单的显示.如果想要进行较为复杂的显示,就推荐使用GUI. 市面上常见的嵌入式GUI有LVGL,emWin(ucGUI),TouchGFX, ...
- 串口 单片机 文件_STM32物联网实战项目 HAL裸机开发09 串口打印
就喜欢你关注我- HAL裸机开发09 - 串口打印 综合信息1.获取开发工具 微信公众号后台发送消息 - 工具2.获取开发板 淘宝搜索店铺 - 硬件家园3.快速了解平台 ...
- STM32实战 1 | STM32Cube生态系统认识与介绍
STM32实战 1 | STM32Cube生态系统认识与介绍 一.STM32Cube Ecosystem STM生态系统 二.PC软件工具套 三.STM32Cube MCU Packages(STM3 ...
- 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!
原标题:仅限今天!大厂最热数据分析经典实战项目大公开! 如今,全球早已步入数据时代,随着行业的高速发展,相关岗位缺口已超150万,且薪资超同行业50%.未来十年,数据细分岗位将扩张5倍,各行业数据人才 ...
- mybatis学习7 实战项目
自己写一个实战项目,最好和hibernate做对比. 转载于:https://www.cnblogs.com/liufei1983/p/7492214.html
- 干货满满的 Python 实战项目,点赞收藏
作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目,主要用到的库有 opencv-python numpy pillow 要是大家所 ...
最新文章
- android呼吸灯动画,Android高德地图自定义定位蓝点实现呼吸灯功能
- 【Consul】Consul架构-Gossip协议
- python发送邮件及附件
- 第4章:介绍python对象类型/4.1 python的核心数据类型/4.7 集合
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)
- 给博客或站点加入百度统计
- 珍爱生命,远离大厂政治斗争
- 前端笔记-对webpack和vue的基本认识
- 年轻人开始“反推荐算法”:算法不讲武德!
- 1.4 单片机开发软件环境搭建
- 【第一天】【ROS操作系统】【2】ROS安装教程
- 斐波那契数列的java代码
- 远程控制软件编写--系列教程
- mysql stmt fetch,mysql_stmt_fetch 奇怪的问题..
- 网站收录怎么做?如何提升收录【实操篇】
- python登陆百度网盘并读取自己的所有文件,输出到文本文件中
- 以下是两段c语言代码 函数arith(),第二章习题-ddg.doc
- DCC - Photoshop - Nvidia NormalMapFilter - 法线生成工具 - 顺便测试 Unity URP 12.1 中的 Decal System
- 远程遥控小车搭建记录
- Oracle12C静默安装 Centos7