hal编程 gt911 触摸芯片驱动 ( 枚举 结构体 熟用)( 安富莱 f429 4.3寸电容屏 )

本文介绍了如何在基于STM32F429的板子上,使用I2C接口与GT911电容触摸屏进行交互。详细阐述了GT911的地址配置、软件复位步骤、配置寄存器以及读写操作,还提供了触摸状态检测和数据读取的代码实现。通过不断轮询GT911的特定寄存器,可以检测到屏幕是否被触摸以及触摸点的数量和位置信息。

使用板子类型以及屏幕类型

本文使用的是安富莱的板子stm32f429,
屏幕是TR433C1的4.3寸TFT显示屏, 480*272 RGB接口, 电容触摸 .

I2C

I2C简介、原理、时序请看这篇文章

使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程)

gt911

gt911简介

gt911是深圳市汇鼎科技开发

  • 专为7英寸到8英寸MID设计的新一代5点电容式触摸,由多达26个发射器电极和14个接收器电极组成,以提供更高的触摸精度。
  • gt911可同时识别 5 个触摸点位的实时准确位置,移动轨迹及触摸面积。并可根据主控需要,读取相应点数的触摸信息。

gt911的地址(8位地址情况)

gt911和其他基于i2c的芯片略有不同,它可以通过,外部引脚INT和RST引脚改变他的地址,一般地址默认是0xBA,通过用INT和RESET引脚可以输入特定的时序,改变他的地址,变为0x28,或者变回0xBA,时序如下:

地址变成0x28

  • INT和RESET都为输出模式
    在这里插入图片描述

地址变成0xBA

  • INT和RESET都为输出模式
    在这里插入图片描述

地址配置完成后

配置之后,RST保持拉高输出,INT配置成输入(变成中断线,当有中断来临时,有触摸发生),或者失能(直接通过寄存器来判断是否有触摸)。

gt911配置说明

基本写芯片和读芯片代码


void GT911_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
   
   
	HAL_I2C_Mem_Write(&hi2c1, GT911_DIV_W, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}

void GT911_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
   
   
	HAL_I2C_Mem_Read(&hi2c1, GT911_DIV_R, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}

对于hal函数说明:

  • HAL_I2C_Mem_Write
    参数1 : hal生成的i2c句柄
    参数2 : gt911的写地址,0xBA(0x28)
    参数3 : 寄存器地址
    参数4 : 寄存器大小,有8位模式,16位模式,这里选择16位模式
    参数5 : 写入寄存器的数据
    参数6 : 写入的数据长度
    参数7 : 等待超时时间,超出此时间未发出去,则发送失败
  • HAL_I2C_Mem_Read(未写的参数和上面的一样)
    参数2 : gt911的读地址,0xBB(0x29)
    参数5 : 要读出的寄存器的数据缓冲区
    参数6 : 读出数据缓冲区大小

第一步:软件复位

在这里插入图片描述

通过给寄存器0x8040地址的寄存器写入2,复位gt911芯片.,代码如下所示

/*
	功能:软件复位gt911
*/
void Software_Reset(void)
{
   
   
	uint8_t _temp=2;	//中间变量
	//往gt911中寄存器0x8040中写入2,使之复位
	GT911_WriteReg(GT_CTRL_REG, &_temp, 1);	
}

第二步:往配置寄存器中写入数据(一般可以跳过)

代码如下:

//GT911(原GT9147)配置参数表
//第一个字节为版本号(0X60),必须保证新的版本号大于等于GT911内部
//flash原有版本号,才会更新配置.
const uint8_t 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,
<think&gt;根据用户的问题,用户想了解Fortran90中"gt"的含义及使用方法。结合提供的引用,我们可以从以下几个方面分析: 1. "gt"在Fortran中是一个关系运算符,表示"大于"(greater than),用于比较两个表达式的值。 2. 在Fortran90中,关系运算符有两种形式:符号形式(如&gt;)和字母形式(如.gt.)。其中".gt."是Fortran77遗留的运算符形式,Fortran90仍然支持。 3. 引用中虽然没有直接提到"gt",但引用[4]提到了条件语句(如SELECT CASE),而关系运算符常用在条件判断中。 具体使用方法: - 语法:`a .gt. b` 判断a是否大于b,返回逻辑值(.true..false.) - 示例:`if (x .gt. 10) then ...` 判断变量x是否大于10 - 注意:运算符两侧的点号是必须的,这是Fortran的逻辑运算符的书写规范 另外,在Fortran90中也可以使用符号"&gt;",例如`if (x &gt; 10) then ...`,两者等价。 因此,回答将围绕".gt."运算符的定义、使用场景和示例展开。 </think&gt; 在Fortran 90 中,`.gt.` 是一个**关系运算符**,表示**大于**(greater than)比较。以下是详细说明: ### 含义与作用 `.gt.` 用于比较两个数值或字符表达式的值: - 若左侧值 **大于** 右侧值,返回逻辑值 `.true.` - 否则返回 `.false.` - 语法格式:`表达式1 .gt. 表达式2` ### 使用方法 #### 1. **基础数值比较** ```fortran integer :: a = 5, b = 3 if (a .gt. b) then print *, "a 大于 b" ! 此处条件成立 end if ``` #### 2. **字符比较(按ASCII码字典序)** ```fortran character(len=3) :: s1 = "cat", s2 = "dog" if (s2 .gt. s1) then print *, "dog &gt; cat" ! 成立,因 &#39;d&#39; &gt; &#39;c&#39; end if ``` #### 3. **数组条件操作** ```fortran integer, dimension(3) :: x = [2, 5, 1], y y = merge(1, 0, x .gt. 3) ! 结果 y = [0, 1, 0](仅x&gt;3的元素置1) ``` #### 4. **与逻辑运算符组合** ```fortran real :: temp = 25.0 if (temp .gt. 20.0 .and. temp .lt. 30.0) then print *, "温度适宜" end if ``` ### 注意事项 1. **点号不可省略**:必须写成 `.gt.`(若省略点号会被视为变量名)。 2. **类型兼容**:比较的双方需为相同类型(如整数、实数或字符)。 3. **替代符号**:Fortran 90 也支持符号 `&gt;`(如 `a &gt; b`),与 `.gt.` 等价[^4]。 ### 示例代码 ```fortran program gt_example implicit none integer :: num = 8 character(len=4) :: word = "fort" ! 数值比较 if (num .gt. 5) print *, "num &gt; 5" ! 输出 ! 字符比较 if (word .gt. "code") print *, "fort &gt; code" ! 成立(&#39;f&#39; &gt; &#39;c&#39;) end program ``` ### 与其他运算符对比 | 运算符 | 含义 | 示例 | |--------|------------|---------------| | `.gt.` | 大于 | `a .gt. b` | | `.lt.` | 小于 | `a .lt. b` | | `.eq.` | 等于 | `a .eq. b` | | `.ge.` | 大于或等于 | `a .ge. b` |
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值