STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键

代码

#include "stm32f4xx.h"                 
#include "GT9147.h"
#include "Touch.h"
#include "C_Touch_I2C.h"
#include "usart.h"
#include "delay.h"
#include "LCD.h"
#include "string.h"//GT9147配置参数表
//第一个字节为版本号(0X60),必须保证新的版本号大于等于GT9147内部
//flash原有版本号,才会更新配置.
const u8 GT9147_CFG_TBL[]=
{ 0X60,0XE0,0X01,0X20,0X03,0X05,0X35,0X00,0X02,0X08,0X1E,0X08,0X50,0X3C,0X0F,0X05,0X00,0X00,0XFF,0X67,0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A,0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00,0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00,0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62,0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00,0X00,0X00,0X1A,0X18,0X16,0X14,0X12,0X10,0X0E,0X0C,0X0A,0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X29,0X28,0X24,0X22,0X20,0X1F,0X1E,0X1D,0X0E,0X0C,0X0A,0X08,0X06,0X05,0X04,0X02,0X00,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
};  
//发送GT9147配置参数
//mode:0,参数不保存到flash
//     1,参数保存到flash
u8 GT9147_Send_Cfg(u8 mode)
{u8 buf[2];u8 i=0;buf[0]=0;buf[1]=mode;	//是否写入到GT9147 FLASH?  即是否掉电保存for(i=0;i<sizeof(GT9147_CFG_TBL);i++)buf[0]+=GT9147_CFG_TBL[i];//计算校验和buf[0]=(~buf[0])+1;GT9147_WR_Reg(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL));//发送寄存器配置GT9147_WR_Reg(GT_CHECK_REG,buf,2);//写入校验和,和配置更新标记return 0;
} 
//向GT9147写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 GT9147_WR_Reg(u16 reg,u8 *buf,u8 len)
{u8 i;u8 ret=0;Touch_IIC_Start();	Touch_IIC_Send_Byte(GT_CMD_WR);   	//发送写命令 	 Touch_IIC_Wait_Ack();Touch_IIC_Send_Byte(reg>>8);   	//发送高8位地址Touch_IIC_Wait_Ack(); 	 										  		   Touch_IIC_Send_Byte(reg&0XFF);   	//发送低8位地址Touch_IIC_Wait_Ack();  for(i=0;i<len;i++){	   Touch_IIC_Send_Byte(buf[i]);  	//发数据ret=Touch_IIC_Wait_Ack();if(ret)break;  }Touch_IIC_Stop();					//产生一个停止条件	    return ret; 
}
//从GT9147读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度			  
void GT9147_RD_Reg(u16 reg,u8 *buf,u8 len)
{u8 i; Touch_IIC_Start();	Touch_IIC_Send_Byte(GT_CMD_WR);   //发送写命令 	 Touch_IIC_Wait_Ack();Touch_IIC_Send_Byte(reg>>8);   	//发送高8位地址Touch_IIC_Wait_Ack(); 	 										  		   Touch_IIC_Send_Byte(reg&0XFF);   	//发送低8位地址Touch_IIC_Wait_Ack();  Touch_IIC_Start();  	 	   Touch_IIC_Send_Byte(GT_CMD_RD);   //发送读命令		   Touch_IIC_Wait_Ack();	   for(i=0;i<len;i++){	   buf[i]=Touch_IIC_Read_Byte(i==(len-1)?0:1); //发数据	  } Touch_IIC_Stop();//产生一个停止条件    
} 
//初始化GT9147触摸屏
//返回值:0,初始化成功;1,初始化失败 
u8 GT9147_Init(void)
{u8 temp[5]; GPIO_InitTypeDef  GPIO_InitStructure;	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOB,C时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;//PB1设置为上拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PC13设置为推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化	Touch_IIC_Init();      	//初始化电容屏的I2C总线  GT_RST=0;				//复位delay_ms(10);GT_RST=1;				//释放复位		    delay_ms(10); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PB1设置为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化	delay_ms(100);  GT9147_RD_Reg(GT_PID_REG,temp,4);//读取产品IDtemp[4]=0;printf("CTP ID:%s\r\n",temp);	//打印IDif(strcmp((char*)temp,"9147")==0)//ID==9147{temp[0]=0X02;			GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器if(temp[0]<0X60)//默认版本比较低,需要更新flash配置{printf("Default Ver:%d\r\n",temp[0]);GT9147_Send_Cfg(1);//更新并保存配置}delay_ms(10);temp[0]=0X00;	 GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束复位   return 0;} return 0;
}
const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
u8 GT9147_Scan(u8 mode)
{u8 buf[4];u8 i=0;u8 res=0;u8 temp;u8 tempsta;static u8 t=0;//控制查询间隔,从而降低CPU占用率   t++;if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率{GT9147_RD_Reg(GT_GSTID_REG,&mode,1);	//读取触摸点的状态  temp=0;GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志 			if((mode&0XF)&&((mode&0XF)<6)){temp=0XFF<<(mode&0XF);		//将点的个数转换为1的位数,匹配tp_dev.sta定义 tempsta=tp_dev.sta;			//保存当前的tp_dev.sta值tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES; tp_dev.x[4]=tp_dev.x[0];	//保存触点0的数据tp_dev.y[4]=tp_dev.y[0];for(i=0;i<5;i++){if(tp_dev.sta&(1<<i))	//触摸有效?{GT9147_RD_Reg(GT9147_TPX_TBL[i],buf,4);	//读取XY坐标值if(tp_dev.touchtype&0X01)//横屏{tp_dev.y[i]=((u16)buf[1]<<8)+buf[0];tp_dev.x[i]=800-(((u16)buf[3]<<8)+buf[2]);}else{tp_dev.x[i]=((u16)buf[1]<<8)+buf[0];tp_dev.y[i]=((u16)buf[3]<<8)+buf[2];}  //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]);}			} res=1;if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)//非法数据(坐标超出了){ if((mode&0XF)>1)		//有其他点有数据,则复第二个触点的数据到第一个触点.{tp_dev.x[0]=tp_dev.x[1];tp_dev.y[0]=tp_dev.y[1];t=0;				//触发一次,则会最少连续监测10次,从而提高命中率}else					//非法数据,则忽略此次数据(还原原来的)  {tp_dev.x[0]=tp_dev.x[4];tp_dev.y[0]=tp_dev.y[4];mode=0X80;		tp_dev.sta=tempsta;	//恢复tp_dev.sta}}else t=0;					//触发一次,则会最少连续监测10次,从而提高命中率}}if((mode&0X8F)==0X80)//无触摸点按下{ if(tp_dev.sta&TP_PRES_DOWN)	//之前是被按下的{tp_dev.sta&=~(1<<7);	//标记按键松开}tp_dev.x[0]=0xffff;tp_dev.y[0]=0xffff;tp_dev.sta&=0XE0;	//清除点有效标记	} 	if(t>240)t=10;//重新从10开始计数return res;
}

代码参考她的就行

STM32F4_触摸屏_触摸屏驱动-CSDN博客

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

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

相关文章

x86 和 x64 arm的区别

x86和x64是基于英特尔x86架构的复杂指令集架构&#xff08;ISA&#xff09;&#xff0c;而ARM是一种精简指令集架构。 什么是指令集架构 假设我们现在要开发一个cpu&#xff0c;就好比说我们去修建一栋楼&#xff0c;开发商会先将图纸设计好。设计好之后由施工单位按照设计图…

openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.c

文章目录 openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.c概述笔记END openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.c 概述 DSA签名(摘要算法SHA256), DSA验签(摘要算法SHA256) 签名 : 用发送者的私钥进行签名. 验签 : 用发送者的公…

基于SSM的图书馆管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

win系统环境搭建(十四)——Windows系统下使用docker安装mysql8和mysql5.7

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7 文章目录 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7MySQL81.新建文件夹2.创建…

windows开机默认启动某个程序

在Windows操作系统中&#xff0c;你可以通过将程序添加到“启动”文件夹或使用任务计划程序来实现开机自动启动某个程序。以下是两种常见的方法&#xff1a; 方法 1&#xff1a;使用“启动”文件夹 找到启动文件夹 按 Win R 打开运行对话框。输入 shell:startup&#xff0c;然…

Webpack5入门到原理1:前言

为什么需要打包工具&#xff1f; 开发时&#xff0c;我们会使用框架&#xff08;React、Vue&#xff09;&#xff0c;ES6 模块化语法&#xff0c;Less/Sass 等 css 预处理器等语法进行开发。 这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法&#xf…

Golang 中的反射,并用来获取数据类型

Go语言提供了一种机制在运行中获取某个变量的类型&#xff0c;获取或修改变量的值&#xff0c;调用变量的方法。 示例代码如下 1. 使用 x.(type)获取变量类型 package mainimport "strconv" //StrPrint 将几种已知数据类型转化为 string func StrPrint(x interfac…

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放</title><script src"ThreeJS/three.js"></script><…

CentOS 7 安装Jdk 配置环境变量

在CentOS 7操作系统中&#xff0c;安装JDK并配置环境变量的具体步骤如下&#xff1a; 第一步、需要检查系统是否自带JDK&#xff0c;并删除已有的JDK。 第二步、下载JDK8或其它版本的安装包&#xff0c;并解压到一个新建的Java目录中。 第三步、配置环境变量。将JAVA_HOME变量设…

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因&#xff0c;该软件可以帮助您恢复…

你还在找PDF转Word的工具?一个好软件推荐,赶紧查收!

前言 前段时间朋友跟小白吐槽&#xff1a;为啥PDF文件转Word文档的工具都要收费&#xff1f; 因为他们都收费啊。 小白之前找了很多类似有这种功能的工具&#xff0c;都发现&#xff1a;不但收费&#xff0c;可能还附带全家桶&#xff0c;而且还有……广告&#xff01; 在一次…

Pytest插件“pytest-selenium” - 让自动化测试更简洁

在现代Web应用的开发中,自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具,以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例,助你轻松进入无忧的Web应用测试之…

中文词向量训练-案例分析

1 数据预处理&#xff0c;解析XML文件并分词 #!/usr/bin/env python # -*- coding: utf-8 -*- # process_wiki_data.py 用于解析XML&#xff0c;将XML的wiki数据转换为text格式 import logging import os.path import sys from gensim.corpora import WikiCorpus import jieba…

phpStorm 设置终端为git bash

环境&#xff1a; windows , PhpStorm 2022 为自己的终端配置git样式的使用&#xff0c; 默认终端样式 一、打开设置&#xff0c;选择git bin 二、重新打开终端 不加--login -i 的终端 加了--login -i 的终端 最重要的一点是什么&#xff0c;他可以像mac一样支持 ctrlv 复…

【Vue3+Ts项目】硅谷甄选 — 菜单权限+按钮权限

一、菜单权限 1.1 路由拆分 将项目路由拆分为&#xff1a; 静态路由&#xff1a;login、404、home、screen异步路由&#xff1a;权限管理&#xff08;包含三个子路由&#xff09;、商品管理&#xff08;包含四个子路由&#xff09;任意路由&#xff1a;任意路由 src/router/r…

「优选算法刷题」:有效三角形的个数

一、题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示例 2: 输入: nums [4,2,3,4] 输出: 4二、思路解析 这道…

扎克伯格宣布将购买35万个GPU

Meta公司马克.扎克伯格1月18日在Instagram上发表文章称&#xff0c;该公司正在加强人工智能研究团队的力量&#xff0c;并在充实AI基础设施“弹药库“&#xff0c;计划在今年年底前向芯片设计商英伟达购买35万个H100 GPU芯片&#xff0c;从而使该公司的GPU总量达到约60万个&…

迪菲赫尔曼密钥交换详细介绍

由于这个问题涉及到一个“原根”的概念&#xff0c;首先先简单介绍一下原根是什么&#xff1a; 原根是数论中的一个概念&#xff0c;它在模运算中具有特殊性质。假设有一个正整数m和另一个整数a&#xff0c;如果a与m互质&#xff08;即它们的最大公约数为1&#xff09;&#x…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…