【STM32】-TTP223B触摸开关

前言

本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。

准备工作

今天这篇文章介绍的是触摸开关这一外围硬件。

  1. ST-link调试器
  2. STM32最小系统板
  3. 单路TTP223B触摸传感器模块
  4. LED灯珠

开始

1.理清思路

通过查找网络资料我们了解到该传感器特点如图所示

image-20250122213606990

博主也是第一次尝试自己查阅资料来写一个模块的驱动代码,在此之前是跟着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引脚别接反了,亮绿灯代表没接错)

9ca634a95e5a6d0a949b724b1079162

编写驱动

和按键驱动一样,我们首先在Hardware目录新建触摸模块的c和h文件,取名Touch

image-20250122215437318

在新建的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

以上代码全部写好后我们就可以编译并下载到系统板上查看效果了

结尾

感谢你能阅读到这里,相信你已经掌握了触摸模块的驱动编写了吧!在这里,我希望各位大佬跟我一起共进步,后续我也会多分享一些我自己的学习经验,以及像这篇文章一样的模块分享,最后还是感谢你的阅读,我们下篇文章再见吧

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的进程和线程

ref 接受几个设定: 进程是一家almost密不透风的公司,缅甸KK园区 线程里面工作的…人 进程**[园区]**内公共资源对于进程来说,可以共享. 别的园区[进程],一般不能和自己的园区共享人员资源,除非… 好的,现在再接受设定: 单个CPU在任一时刻只能执行单个线程,只有…

消息队列篇--原理篇--Pulsar和Kafka对比分析

Pulsar和Kafka都是高性能、分布式的消息队列系统,广泛应用于大规模数据流处理和实时分析场景。然而,它们的设计哲学、架构特点和适用场景存在显著差异。以下是Pulsar和Kafka的详细对比,帮助你根据具体需求选择最合适的技术。 1、架构设计 P…

Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理

目录 1.忽略特殊文件 1.1.那如何配置我们需要忽略的文件的呢? 1.2.如何检验效果? 2.给命令配置别名 3.基本操作之版本回退 3.1.使用场景: 3.2.使用方法: 4.撤销修改 情况一:对于工作区的代码,还没…

Saas Paas Iaas服务区别

Saas、Paas和Iaas是云计算中常见的服务模式,它们分别代表软件即服务(Software as a Service)、平台即服务(Platform as a Service)和基础设施即服务(Infrastructure as a Service)。仅供大家参考…

nslookup在内网渗透的使用

1. 什么是 nslookup? nslookup(Name Server Lookup)是一个用于查询 DNS(域名系统)记录的命令行工具。通过该工具,用户可以查询域名的解析结果,例如获取某个域名对应的 IP 地址或查找域名的相关记…

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

pikachu靶场-敏感信息泄露概述

敏感信息泄露概述 由于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; ---通过访问url下的目录&#xff0c;可以直接列出目录下的文件列表; ---输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版…

阿九的python 爬虫进阶课18.3 学习笔记

文章目录 前言1. 爬取大标题2. 爬取小标题3. 证券栏下的标题4. 某篇文章里的具体内容 前言 网课链接&#xff1a;https://www.bilibili.com/video/BV1kV4y1576b/新浪财经网址&#xff1a;https://finance.sina.com.cn/需先下载库&#xff1a; conda install lxml布置爬取的一…

客户案例:电商平台对帐-账单管理(亚马逊amazon)

账单管理&#xff1a; 功能定义&#xff1a; 账单管理用于上传亚马逊&#xff08;amazon&#xff09;平台下载的原始账单数据&#xff0c;美国站、日本站、墨西哥站等账单模板直接进行数据上传&#xff0c;做到0调整&#xff0c;下载下来的账单数据无缝上传至对账平台-账单管…

web端ActiveMq测试工具

如何用vue3创建简单的web端ActiveMq测试工具&#xff1f; 1、复用vue3模板框架 创建main.js,引入APP文件&#xff0c;createApp创建文件&#xff0c;并加载element插件&#xff0c;然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…

linux-ubuntu学习笔记碎记

~指/home/user_name这个目录 查看软件安装目录&#xff1a;whereis vim 查看当前路径&#xff1a;pwd 终端中键入ctrls会挂起终端&#xff0c;即终端不响应键鼠&#xff1b;ctrlq可以恢复。 和虚拟机开启共享文件夹互传文件 点击桌面&#xff0c;按ctrlaltt&#xff0c;开…

QT调用OpenSceneGraph

OSG和osgQt编译教程&#xff0c;实测通过 一、下载OpenSceneGraph OpenSceneGraphhttps://github.com/openscenegraph/OpenSceneGraph 二、使用CMAKE编译OpenSceneGraph 1.打开cmake&#xff0c;配置源代码目录 2. CMAKE_INSTALL_PREFIX设置为install文件夹&#xff0c;生…

ES6 简单练习笔记--变量申明

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…

Java 8 实战 书籍知识点散记

一、Lambda表达式 1.1 Lambda表达式的一些基本概念 1.2 Lambda表达式的三个部分 // 简化前Comparator<Apple> byWeightnew Comparator<Apple>() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}};//Lambda表达式Comp…

XCP 协议基础

文章目录 一、XCP 简介二、XCP的主要功能三、什么是标定四、什么时候进行标定五、标定的意义六、标定的三层架构XCP协议 和 CCP协议的区别参考 一、XCP 简介 XCP 协议的全称为 eXtended Calibration Protocol&#xff0c;即扩展标定协议。 另有其他定义&#xff0c;XCP 协议全…

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…

python创建一个httpServer网页上传文件到httpServer

一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…

vue3搭建实战项目笔记

vue3搭建实战项目笔记 搭建项目笔记1.1.创建Vue项目1.2.划分目录结构assets -> 资源&#xff08;css/font/img&#xff09;components -> 抽取出来的公共组件hooks -> 组件对应的公共逻辑抽取到hooks文件夹下router -> 路由mock -> 模拟数据的一些配置service -…

OneData体系架构详解

阿里巴巴的 OneData 体系架构方法论&#xff0c;主要分为三个阶段&#xff1a;业务板块、规范定义 和 模型设计。每个阶段的核心目标是确保数据的高效管理、共享与分析能力。 一. 业务板块&#xff08;Business Segment&#xff09; 业务板块是OneData体系架构中的第一步&…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…