STM32CubeIDE 触摸屏I2C GT9147

硬件:

STM32F407ZG + GT9147

其中: GT9147使用模拟I2C通讯SCL和SDA。

还有RST复位引脚。

INT中断引脚:为有效减轻主CPU负担,有触摸时GT9147才会通知主CPU读取坐标信息。

触摸屏类似矩阵键盘通过x和y确定点击位置。

移植厂商触摸芯片GT9147驱动。

我们只需关心下面几个寄存器的值。

芯片状态寄存器,很关键。

由于芯片支持最多5点触摸,故还需要读取下面每个触摸点的坐标数据。

触摸扫描函数代码:

typedef struct{
	uint16_t touchnumber;
	uint16_t x[TOUCH_NUMBER];
	uint16_t y[TOUCH_NUMBER];
}Coordinates_TypeDef;

const uint16_t GT9147_TPX_TBL[5] =
{ GT_TP1_REG, GT_TP2_REG, GT_TP3_REG, GT_TP4_REG, GT_TP5_REG };
Coordinates_TypeDef Coordinates = {0};

uint8_t GT9147_ScanTouch(void)
{
	struct TouchStatus{
		uint8_t NumberOfTouch : 4;
		uint8_t HaveKey : 1;
		uint8_t ProximityValid : 1;
		uint8_t LargeDetect : 1;
		uint8_t BufferStatus : 1;
	};

	uint8_t i = 0;
	uint8_t temp[4] = {0};
	struct TouchStatus touch = {0};

	GT9147_RD_Reg(GT_GSTID_REG, (uint8_t*)&touch, 1);
	GT9147_WR_Reg(GT_GSTID_REG, temp, 1);

	memset(&Coordinates, 0, sizeof(Coordinates_TypeDef));
	if(touch.BufferStatus == 0) return 0;
	if(touch.NumberOfTouch > 5 || touch.NumberOfTouch == 0)	return 0;

	Coordinates.touchnumber = touch.NumberOfTouch;

	for(i = 0; i < touch.NumberOfTouch; i++)
	{
		GT9147_RD_Reg(GT9147_TPX_TBL[i], temp, 4);
		memcpy(&Coordinates.x[i], temp, 2);
		memcpy(&Coordinates.y[i], temp + 2, 2);
		//printf("i = %d, x = %d, y = %d\r\n", i, Coordinates.x[i], Coordinates.y[i]);
	}

	return 1;
}

测试代码:F407TFT-LCD4.rar_stm32cubeide触摸屏-嵌入式文档类资源-CSDN下载

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值