【STM32】-TTP223B触摸开关
前言
本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。
准备工作
今天这篇文章介绍的是触摸开关这一外围硬件。
- ST-link调试器
- STM32最小系统板
- 单路TTP223B触摸传感器模块
- LED灯珠
开始
1.理清思路
通过查找网络资料我们了解到该传感器特点如图所示
博主也是第一次尝试自己查阅资料来写一个模块的驱动代码,在此之前是跟着B站UP主江协科技学习如何编写驱动代码的。
第一次独立编写驱动代码我是怎么做的呢?我首先想到,既然都是开关,那么是不是可以修改先前学习的按钮驱动代码,在其基础上来实现驱动触摸开关呢?答案是可以!
这里贴上按钮驱动代码 Key.c
来供大家参考,注意这里是按钮驱动不是我们本次介绍的触摸驱动
#include "stm32f10x.h" // Device header
#include "Delay.h"void Key_Init(void)
{//初始化按钮端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIOInitStructure;GPIOInitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIOInitStructure.GPIO_Pin = GPIO_Pin_1;GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIOInitStructure);}uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;//判断1号端口按钮按下情况if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);//规避按下按钮的抖动while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); //一直按住按钮则卡住Delay_ms(20);//规避松开按钮的抖动KeyNum = 1;}return KeyNum;
}
2.编写代码
有了以上思路我们开始编写触摸模块的驱动代码
连接电路
这里我将触摸传感器的SIG口接到了STM32最小系统板的PB1接口上。LED灯珠接到PA1接口上,采用高电平触发接法。
连接完电路通电后效果如图所示(传感器的VCC还有GND引脚别接反了,亮绿灯代表没接错)
编写驱动
和按键驱动一样,我们首先在Hardware目录新建触摸模块的c和h文件,取名Touch
在新建的Touch.c文件当中新建一个Touch_Init函数,代码如下
首先初始化RCC时钟,然后选择上拉输入模式,接着巴拉巴拉(相信你们都会了,我这里就不多说)
#include "stm32f10x.h" // Device header
#include "Delay.h"void Touch_Init(void)
{//初始化按钮端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIOInitStructure;GPIOInitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIOInitStructure.GPIO_Pin = GPIO_Pin_1;GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIOInitStructure);
}
有了触摸模块的初始化函数后我们还需要一个函数用于获取按钮状态,即按钮是否被触摸,这里我们新建函数 Touch_GetNum
注意这个函数是有返回数值的,这里返回类型为uint8_t,还有就是,和按键一样我们为了避免外界因素对我们产生的影响,还是要进行一个消抖动的过程,代码如下
uint8_t Touch_GetNum(void)
{uint8_t TouchNum = 0;//判断1号端口按钮按下情况if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1){Delay_ms(20);//消去抖动while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1); //一直按住按钮则卡住Delay_ms(20);//消去抖动TouchNum = 1;}return TouchNum;
}
完成这两个函数后我们的触摸模块驱动基本已经完成了,完整代码如下
#include "stm32f10x.h" // Device header
#include "Delay.h"void Touch_Init(void)
{//初始化按钮端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIOInitStructure;GPIOInitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIOInitStructure.GPIO_Pin = GPIO_Pin_1;GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIOInitStructure);
}uint8_t Touch_GetNum(void)
{uint8_t TouchNum = 0;//判断1号端口按钮按下情况if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1){Delay_ms(20);//消去抖动while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1); //一直按住按钮则卡住Delay_ms(20);//消去抖动TouchNum = 1;}return TouchNum;
}
写完Touch.c后别忘了在头文件touch.h当中添加这两个函数,代码如下
#ifndef __TOUCH_H
#define __TOUCH_Hvoid Touch_Init(void);
uint8_t Touch_GetNum(void);#endif
到这里我们驱动代码已经编写完成了,接下来就是到main.c当中完善一下逻辑代码了
这里直接贴上完整代码
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "Touch.h"uint8_t TouchNum;int main(void)
{ LED_Init(); //LED灯珠初始化Touch_Init(); //触摸模块初始化while (1){TouchNum = Touch_GetNum();if(TouchNum == 1){LED1_Turn();}}
}
还有LED灯珠驱动这里也一并贴上(同样的也是放在Hardware文件夹内)
LED.c
#include "stm32f10x.h" // Device headervoid LED_Init(void)
{//初始化LED端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIOInitStructure;GPIOInitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIOInitStructure.GPIO_Pin = GPIO_Pin_1;GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIOInitStructure);
}void LED1_ON(void)
{//开启LEDGPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED1_OFF(void)
{//关闭LEDGPIO_SetBits(GPIOA, GPIO_Pin_1);
}void LED1_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}
LED.h
#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);#endif
以上代码全部写好后我们就可以编译并下载到系统板上查看效果了
结尾
感谢你能阅读到这里,相信你已经掌握了触摸模块的驱动编写了吧!在这里,我希望各位大佬跟我一起共进步,后续我也会多分享一些我自己的学习经验,以及像这篇文章一样的模块分享,最后还是感谢你的阅读,我们下篇文章再见吧
相关文章:

【STM32】-TTP223B触摸开关
前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗
三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性,防止误解锁的情况。如果希望在检测到人脸后直接进入主界面,可以通过以下设置调整: 打开设置: 进入三星手机的【设置】应用。 进入生物识别和安全&a…...

Frida使用指南(三)- Frida-Native-Hook
1.Process、Module、Memory基础 1.Process Process 对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等 2.Module Module 对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件), 能查询模块的信息,如模块的基址、名…...

网络安全 | F5-Attack Signatures-Set详解
关注:CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集:使用过滤器或手动选择要包含的签名。 基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于,可以专注于定义用户感兴趣的攻击签名…...

004 mybatis基础应用之全局配置文件
文章目录 配置内容properties标签typeAlias标签mappers标签 配置内容 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler…...

【岛屿个数——BFS / DFS,“外海”】
题目 推荐阅读 AcWing 4959. 岛屿个数(两种解法,通俗解释) - AcWing 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second int dx4[4] {-1, 0, 1, 0}, dy4[4] …...

MySQL常用数据类型和表的操作
文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数,取值范围为1~64,若…...

2025_1_27 C语言内存,递归,汉诺塔问题
1.c程序在内存中的布局 代码段(Code Segment) 位置:通常位于内存的最低地址。 用途:存储程序的可执行指令。 特点:只读,防止程序运行时被修改。数据段(Data Segment) 位置…...

开源音乐管理软件Melody
本文软件由网友 heqiusheng 推荐。不过好像已经是一年前了 😂 简介 什么是 Melody ? Melody 是你的音乐精灵,旨在帮助你更好地管理音乐。目前的主要能力是帮助你将喜欢的歌曲或者音频上传到音乐平台的云盘。 主要功能包括: 歌曲…...

Nginx开发01:基础配置
一、下载和启动 1.下载、使用命令行启动:Web开发:web服务器-Nginx的基础介绍(含AI文稿)_nginx作为web服务器,可以承担哪些基本任务-CSDN博客 注意:我配置的端口是81 2.测试连接是否正常 访问Welcome to nginx! 如果…...

【TCP 协议】确认应答机制 超时重传 三次握手 四次挥手
TCP报文首部 确认应答机制 TCP 是可靠的,指的是它能够确保数据从源端准确无误地传输到目的端。 当客户端和服务器通信时,客户端向服务器发送报文,那么,客户端怎么知道服务器已经收到报文了呢? 服务器收到客户端发的报…...

jenkins-k8s pod方式动态生成slave节点
一. 简述: 使用 Jenkins 和 Kubernetes (k8s) 动态生成 Slave 节点是一种高效且灵活的方式来管理 CI/CD 流水线。通过这种方式,Jenkins 可以根据需要在 Kubernetes 集群中创建和销毁 Pod 来执行任务,从而充分利用集群资源并实现更好的隔离性…...

基于vue和elementui的简易课表
本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客,原程序在vue3.5.13版本下不能运行,修改两处: 1)slot-cope改为v-slot 2)return background-color:rgb(24 144 255 / 80%);color: #fff; …...

可用的IPv6公共DNS(2025年1月更新)
境内IPv6 DNS: 1. 腾讯DNS:2402:4e00:: 2. 阿里DNS:2400:3200::1、2400:3200:baba::1 3. ISP(电信服务运营商)的IPv6 DNS,请以各ISP实际下发的为准,或拨打10000、10010、10086等号码询问人工…...

c高级复习
c高级复习...

电子信息工程专业主要研究哪一方面东西?
序言: 如今科技发展那叫一个迅猛,电子信息专业可是站在这股浪潮的 C 位,狠狠推动着社会向前跑。这专业就像一座神奇桥梁,把虚拟数字和现实生活紧紧相连,把那些信号变成咱们看到的画面、听到的声音。你看,从…...

RU 19.26安装(手工安装各个补丁)
使用手工方式打RU19.26 参考文档: Supplemental Readme - Grid Infrastructure Release Update 12.2.0.1.x / 18c /19c (Doc ID 2246888.1) 操作步骤: 1 Stop the CRS managed resources running from DB homes. 2 Run the pre root script. 3 Patch GI…...

深入理解Pytest中的Setup和Teardown
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 对于简单程序而言,使用 Pytest 运行测试直截了当。然而,当你…...

如何利用AI工具来进行数据分析
利用AI工具进行数据分析可以显著提高效率和准确性,以下是详细步骤和方法: 1. 明确分析目标 在开始数据分析之前,首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果,以及选择合适的AI工具和方法。 2. …...

具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力
作者:Linqing Zhong, Chen Gao, Zihan Ding, Yue Liao, Si Liu 单位:北京航空航天大学,新加坡国立大学,香港中文大学多模态实验室 论文标题:TopV-Nav: Unlocking the Top-View Spatial Reasoning Potential of MLLM …...

npm:升级自身时报错:EBADENGINE
具体报错信息如下: 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm,相对应进行更新即可…...

微信小程序实现自定义日历功能
文章目录 1. 创建日历组件实现步骤:2. 代码实现过程3. 实现效果图4. 关于作者其它项目视频教程介绍 1. 创建日历组件实现步骤: 创建日历组件:首先,你需要创建一个日历组件,包含显示日期的逻辑。样式设计:为…...

Vue 3 中的 toRef 与 toRefs:使用与案例解析
在 Vue 3 的响应式系统中,toRef 和 toRefs 是两个非常实用的工具函数。它们主要用于将响应式对象的属性转换为单独的 ref,以便在模板或逻辑中更方便地使用。本文将详细介绍 toRef 和 toRefs 的用法,并通过一个老师信息的案例来演示它们的实际…...

问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

代码随想录day20
235. 利用二叉搜索树的特性即可 /** lc appleetcode.cn id235 langcpp** [235] 二叉搜索树的最近公共祖先*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) :…...

【ProxyBroker】用Python打破网络限制的利器
ProxyBroker 1. 什么是ProxyBroker2. ProxyBroker的功能3. ProxyBroker的优势4. ProxyBroker的使用方法5. ProxyBroker的应用场景6.结语项目地址: 1. 什么是ProxyBroker ProxyBroker是一个开源工具,它可以异步地从多个来源找到公共代理,并同…...

分布式微服务系统架构第88集:kafka集群
使用集 群最大的好处是可以跨服务器进行负载均衡,再则就是可以使用复制功能来避免因单点故 障造成的数据丢失。在维护 Kafka 或底层系统时,使用集群可以确保为客户端提供高可用 性。 需要多少个broker 一个 Kafka 集群需要多少个 broker 取决于以下几个因…...

RocketMQ原理—5.高可用+高并发+高性能架构
大纲 1.RocketMQ的整体架构与运行流程 2.基于NameServer管理Broker集群的架构 3.Broker集群的主从复制架构 4.基于Topic和Queue实现的数据分片架构 5.Broker基于Pull模式的主从复制原理 6.Broker层面到底如何做到数据0丢失 7.数据0丢失与写入高并发的取舍 8.RocketMQ读…...

下载Visual Studio Community 2019
官方链接如下:Visual Studio Community 2019下载链接 https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements#download 目前官方仅建议2022版,已经关闭vs2019等旧版本,哪天开放了,记得踢我一下。 …...

一文简单回顾Java中的String、StringBuilder、StringBuffer
简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的,它们之间的区别是String是不可变的,平常开发用的最多,当遇到大量字符串连接的时候,就用StringBuilder&am…...