STM32f746gdiscovery 触摸屏 FT5336 驱动

由于网上找不到这个触摸屏 FT5336芯片的寄存器信息,只能从别人的驱动中找到寄存器信息,还好只需要配置个把寄存器,然后直接读取坐标信息即可,支持5个触摸点坐标读取。

原理图部分,芯片采用IIC通讯,地址为:0x70,2个IIC数据线,1个中断线,测试也比较简单,读取id寄存器0xA8,如果读取到数据为0x51,那么恭喜你,基本通讯已经成功了。

代码如下:

/*************************************************************************************************************
 * 文件名		:	FT5336.c
 * 功能			:	FT5336电容触摸屏驱动
 * 作者			:	[email protected]
 * 创建时间		:	2020-02-14
 * 最后修改时间	:	2020-02-14
 * 详细:			FT5336默认开启的触摸中断输出,并且空闲高电平,中断为低电平触发
 FT5336最大更新速度120Hz,支持5点触摸
*************************************************************************************************************/	
#include "stm32f7xx.h" 
#include "system.h" 
#include "main.h" 
#include "FT5336.h"  


static bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling);//FT5336芯片中断输出模式

/*************************************************************************************************************************
*函数        	:	bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr, 
						bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
						bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
*功能        	:	FT5336初始化
*参数        	:	pHandle:句柄;SlaveAddr通讯地址;Func_ReadReg:读寄存器接口;Func_WriteReg:写寄存器接口
*返回        	:	TRUE:初始化成功;FALSE:初始化失败
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	需要提前初始化IIC接口
*************************************************************************************************************************/
bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr, 
	bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
	bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
{
	u8 id;
	u8 retry;
	u8 temp;
	
	if(pHandle == NULL || Func_ReadReg == NULL || Func_WriteReg == NULL) 
	{
		DEBUG("FT5336_Init 无效的参数\r\n");
		return FALSE;
	}
	pHandle->SlaveAddr = SlaveAddr;							//通讯地址
	pHandle->Func_ReadReg = Func_ReadReg;					//读寄存器接口
	pHandle->Func_WriteReg = Func_WriteReg;					//写寄存器接口
	pHandle->ActiveTouchCount = 0;							//复位当前有效触摸点数量
	pHandle->ActiveTouchIndex = 0;							//复位当前处理的有效触摸点索引
	pHandle->isInitialization = FALSE;						//初始化未成功
	//读取芯片id
	for(retry = 0;retry < 5;retry ++)
	{
		id = FT5336_ReadID(pHandle);						//读取芯片id
		if(FT5336_ID_VALUE != id)
		{
			SYS_DelayMS(10);
		}
	}
	if(FT5336_ID_VALUE != id)
	{
		DEBUG("[FT5336读取失败],无效的id:0x%02X\r\n",id);
		return FALSE;
	}
	//查看工作模式
	temp = 0xff;
	pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_DEV_MODE_REG, &temp, 1);
	if(temp != FT5336_DEV_MODE_WORKING)
	{
		DEBUG("[FT5336]:异常的工作模式%d\r\n", temp);
	}
	//检查固件版本
	temp = 0xff;
	pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_FIRMID_REG, &temp, 1);
	if(temp == 0 || temp == 0xff)
	{
		DEBUG("[FT5336]:异常的固件版本%d\r\n", temp);
	}
	else
	{
		uart_printf("[FT5336固件版本]:0x%02X\r\n", temp);
	}
	
	//此处初始化成功了,进行后续操作
	FT5336_SetIntOutMode(pHandle, TRUE);								//设置触摸中断为低电平保持模式
	FT5336_SetCtrlMode(pHandle, FT5336_CTRL_KEEP_ACTIVE_MODE);			//设置FT5336芯片控制模式
	
	pHandle->isInitialization = TRUE;									//初始化成功了
	
	return TRUE;
}


/*************************************************************************************************************************
*函数        	:	u8 FT5336_ReadID(FT5336_HANDLE *pHandle)
*功能        	:	FT5336读取芯片id
*参数        	:	pHandle:句柄
*返回        	:	id;0:无效
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	
*************************************************************************************************************************/
u8 FT5336_ReadID(FT5336_HANDLE *pHandle)
{
	u8 id;
	
	if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_CHIP_ID_REG, &id, 1) == FALSE)
	{
		return 0;	//读取失败
	}
	return id;
}



/*************************************************************************************************************************
*函数        	:	bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling)
*功能        	:	FT5336芯片中断输出模式
*参数        	:	pHandle:句柄;isPolling:TRUE:触摸一直保持低电平,松开后恢复高电平;FALSE:触摸过程中定时输出低电平脉冲
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	用于设置触摸屏的触摸中断状态输出模式
*************************************************************************************************************************/
bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling)
{
	u8 regValue = 0;
  
	if(isPolling)	//触摸保持低电平
	{
		regValue = FT5336_G_MODE_INTERRUPT_POLLING;
	}
	else
	{
		regValue = FT5336_G_MODE_INTERRUPT_TRIGGER;
	}
	
	return pHandle->Func_WriteReg(pHandle->SlaveAddr, FT5336_GMODE_REG, &regValue, 1);		//写入FT5336中断寄存器
}


/*************************************************************************************************************************
*函数        	:	bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode)
*功能        	:	设置FT5336芯片控制模式
*参数        	:	pHandle:句柄;CtrlMode:控制模式;见:FT5336_CTRL_MODE
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	用于设置触摸屏的工作模式
*************************************************************************************************************************/
bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode)
{
	u8 regValue = CtrlMode;
	
	return pHandle->Func_WriteReg(pHandle->SlaveAddr, FT5336_CTRL_REG, &regValue, 1);		//写入FT5336寄存器
}


/*************************************************************************************************************************
*函数        	:	u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle)
*功能        	:	FT5336芯片返回有效的触摸点数量
*参数        	:	pHandle:句柄
*返回        	:	0-5:触摸点数量
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	
*************************************************************************************************************************/
u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle)
{
	u8 nbTouch = 0;

	//读取寄存器 FT5336_TD_STAT_REG 获取有效的触摸点数量
	if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_TD_STAT_REG, &nbTouch, 1) == FALSE)
	{
		nbTouch = 0;
	}
	nbTouch &= 0x07;
	if(nbTouch > FT5336_MAX_DETECTABLE_TOUCH)	//点数超过了最大值,读取的数据可能是无效的,直接清零
	{
		nbTouch = 0;
	}

	pHandle->ActiveTouchCount = nbTouch;					//记录当前有效触摸点数量
	pHandle->ActiveTouchIndex = 0;							//复位当前处理的有效触摸点索引

	return nbTouch;
}

/*************************************************************************************************************************
*函数        	:	u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT])
*功能        	:	FT5336获取触摸区域信息
*参数        	:	pHandle:句柄;pTouchArea:触摸区域信息,见FT5336_TOUCH_TYPE定义
*返回        	:	0-5:触摸点数量
*依赖			: 	底层宏定义
*作者       	:	[email protected]
*时间     		:	2020-02-16
*最后修改时间	:	2020-02-16
*说明        	:	x,y坐标只有12bit有效位;x坐标的最高2位为触摸状态,具体值定义见:
*************************************************************************************************************************/
u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT])
{
	u8 num;
	u8 buff[FT5336_USER_TOUCHT_COUNT * FT5336_ONE_TOUCH_REG_CNT];		//读取缓冲区
	u8 i;
	u8 *p = buff;
	
	num = FT5336_GetTouchPointCount(pHandle);							//获取触摸点数量
	if(num > FT5336_USER_TOUCHT_COUNT) num = FT5336_USER_TOUCHT_COUNT;	//限制触摸点的数量-由用户决定支持的数量
	if(num > 0)															//有触摸,读取触摸点的信息
	{
		if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_P1_XH_REG, buff, num * FT5336_ONE_TOUCH_REG_CNT) == FALSE)
		{
			DEBUG("读取触摸区域信息失败\r\n");
			num = 0;
		}
		else //读取成功了,填充信息
		{
			for(i = 0;i < num;i ++)
			{	
#if(FT5336_TOUCH_POS_XY_EXCHANGE)	//需要对调XY坐标
				pTouchArea[i].Ypos = *p ++;		//X高位
				pTouchArea[i].Ypos <<= 8;
				pTouchArea[i].Ypos |= *p ++;	//X低位		
				pTouchArea[i].Event = (pTouchArea[i].Ypos >> FT5336_TOUCH_EVT_FLAG_SHIFT)&FT5336_TOUCH_EVT_FLAG_MASK;	//Event
				pTouchArea[i].Ypos &= FT5336_TOUCH_POS_DATA_MASK;
				pTouchArea[i].Xpos = *p ++;		//Y高位
				pTouchArea[i].Xpos <<= 8;
				pTouchArea[i].Xpos |= *p ++;	//Y低位
				pTouchArea[i].Xpos &= FT5336_TOUCH_POS_DATA_MASK;
#else //不需要对调
				pTouchArea[i].Xpos = *p ++;		//X高位
				pTouchArea[i].Xpos <<= 8;
				pTouchArea[i].Xpos |= *p ++;	//X低位		
				pTouchArea[i].Event = (pTouchArea[i].Xpos >> FT5336_TOUCH_EVT_FLAG_SHIFT)&FT5336_TOUCH_EVT_FLAG_MASK;	//Event
				pTouchArea[i].Xpos &= FT5336_TOUCH_POS_DATA_MASK;
				pTouchArea[i].Ypos = *p ++;		//Y高位
				pTouchArea[i].Ypos <<= 8;
				pTouchArea[i].Ypos |= *p ++;	//Y低位
				pTouchArea[i].Ypos &= FT5336_TOUCH_POS_DATA_MASK;
#endif //FT5336_TOUCH_POS_XY_EXCHANGE			
				
				
				pTouchArea[i].Weight = *p ++;	//触摸压力
				pTouchArea[i].Area = *p ++;		//触摸区域
			}
		}
	}
	
	return num;
}

//头文件

/*************************************************************************************************************
 * 文件名		:	FT5336.h
 * 功能			:	FT5336电容触摸屏驱动
 * 作者			:	[email protected]
 * 创建时间		:	2020-02-14
 * 最后修改时间	:	2020-02-14
 * 详细:			使用的IIC与FT5336通讯
*************************************************************************************************************/
#ifndef __FT5336_H__
#define __FT5336_H__
#include "system.h"
#include "SoftwareIIC.h"


#define FT5336_IIC_SLAVE_ADDRESS            ((u8)0x70)			//FT5336 IIC通讯地址

//触摸屏宽高定义
#define FT5336_MAX_WIDTH                    ((u16)480)     	//触摸屏最大宽度
#define FT5336_MAX_HEIGHT                   ((u16)272)     	//触摸屏最大高度

#define FT5336_TOUCH_POS_XY_EXCHANGE		1				//是否将横坐标与纵坐标对调

//芯片支持的最大触摸点数
#define FT5336_MAX_DETECTABLE_TOUCH         (0x05)

//FT5336的当前工作模式寄存器,用于判断触摸屏是否在正常工作
#define FT5336_DEV_MODE_REG                 ((u8)0x00)
#define FT5336_DEV_MODE_WORKING             ((u8)0x00)				//默认工作模式
#define FT5336_DEV_MODE_FACTORY             ((u8)0x04)				//工厂模式

#define FT5336_DEV_MODE_MASK                ((u8)0x07)
#define FT5336_DEV_MODE_SHIFT               ((u8)0x04)

//手势ID寄出去你
#define FT5336_GEST_ID_REG                  ((u8)0x01)
//相关手势值
#define FT5336_GEST_ID_NO_GESTURE           ((u8)0x00)
#define FT5336_GEST_ID_MOVE_UP              ((u8)0x10)
#define FT5336_GEST_ID_MOVE_RIGHT           ((u8)0x14)
#define FT5336_GEST_ID_MOVE_DOWN            ((u8)0x18)
#define FT5336_GEST_ID_MOVE_LEFT            ((u8)0x1C)
#define FT5336_GEST_ID_SINGLE_CLICK         ((u8)0x20)
#define FT5336_GEST_ID_DOUBLE_CLICK         ((u8)0x22)
#define FT5336_GEST_ID_ROTATE_CLOCKWISE     ((u8)0x28)
#define FT5336_GEST_ID_ROTATE_C_CLOCKWISE   ((u8)0x29)
#define FT5336_GEST_ID_ZOOM_IN              ((u8)0x40)
#define FT5336_GEST_ID_ZOOM_OUT             ((u8)0x49)

//触摸数据状态寄存器:读取将有效触摸点的数量 (0..5) 
#define FT5336_TD_STAT_REG                  ((u8)0x02)

//XH或YH的最高2位代表的触摸按钮状态信息
#define FT5336_TOUCH_EVT_FLAG_PRESS_DOWN    ((u8)0x00)
#define FT5336_TOUCH_EVT_FLAG_LIFT_UP       ((u8)0x01)
#define FT5336_TOUCH_EVT_FLAG_CONTACT       ((u8)0x02)
#define FT5336_TOUCH_EVT_FLAG_NO_EVENT      ((u8)0x03)

#define FT5336_TOUCH_EVT_FLAG_SHIFT         ((u8)12)		//从X坐标的最高2位获取EVT
#define FT5336_TOUCH_EVT_FLAG_MASK          ((u8)3)


//触摸区域坐标的掩码-12bit有效值
#define FT5336_TOUCH_POS_DATA_MASK           ((u16)0x0FFF)	//掩码

//触摸区域信息相关寄存器
#define FT5336_ONE_TOUCH_REG_CNT			6				//一个触摸点由6个寄存器组成
//#1触摸点信息
#define FT5336_P1_XH_REG                    ((u8)0x03)		//X坐标信息
#define FT5336_P1_XL_REG                    ((u8)0x04)
#define FT5336_P1_YH_REG                    ((u8)0x05)		//Y坐标信息
#define FT5336_P1_YL_REG                    ((u8)0x06)
#define FT5336_P1_WEIGHT_REG                ((u8)0x07)		//触摸点压力
#define FT5336_P1_MISC_REG                  ((u8)0x08)		//触摸区域
//#2触摸点信息
#define FT5336_P2_XH_REG                    ((u8)0x09)
#define FT5336_P2_XL_REG                    ((u8)0x0A)
#define FT5336_P2_YH_REG                    ((u8)0x0B)
#define FT5336_P2_YL_REG                    ((u8)0x0C)
#define FT5336_P2_WEIGHT_REG                ((u8)0x0D)
#define FT5336_P2_MISC_REG                  ((u8)0x0E)
//#3触摸点信息
#define FT5336_P3_XH_REG                    ((u8)0x0F)
#define FT5336_P3_XL_REG                    ((u8)0x10)
#define FT5336_P3_YH_REG                    ((u8)0x11)
#define FT5336_P3_YL_REG                    ((u8)0x12)
#define FT5336_P3_WEIGHT_REG                ((u8)0x13)
#define FT5336_P3_MISC_REG                  ((u8)0x14)
//#4触摸点信息
#define FT5336_P4_XH_REG                    ((u8)0x15)
#define FT5336_P4_XL_REG                    ((u8)0x16)
#define FT5336_P4_YH_REG                    ((u8)0x17)
#define FT5336_P4_YL_REG                    ((u8)0x18)
#define FT5336_P4_WEIGHT_REG                ((u8)0x19)
#define FT5336_P4_MISC_REG                  ((u8)0x1A)
//#5触摸点信息
#define FT5336_P5_XH_REG                    ((u8)0x1B)
#define FT5336_P5_XL_REG                    ((u8)0x1C)
#define FT5336_P5_YH_REG                    ((u8)0x1D)
#define FT5336_P5_YL_REG                    ((u8)0x1E)
#define FT5336_P5_WEIGHT_REG                ((u8)0x1F)
#define FT5336_P5_MISC_REG                  ((u8)0x20)


//控制寄存器-设置模式
#define FT5336_CTRL_REG                    		 	((u8)0x86)
//Active模式 正常模式,没有触摸是依旧保持活动,功耗大
#define FT5336_CTRL_KEEP_ACTIVE_MODE        		((u8)0x00)
//Monitor模式 省电模式,没有触摸时自动从活动模式切换到监控模式,降低功耗
#define FT5336_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE  	((u8)0x01)
//Hibernate模式 休眠模式
#define FT5336_CTRL_HIBERNATE_MODE 				 	((u8)0x02)

//Monitor模式下:无触摸时从活动模式切换到监控模式的时间段寄存器
#define FT5336_TIMEENTERMONITOR_REG         		((u8)0x87)

//Active模式下更新速度寄存器
#define FT5336_PERIODACTIVE_REG             		((u8)0x88)

//Monitor模式下更新速度寄存器
#define FT5336_PERIODMONITOR_REG            		((u8)0x89)

//中断模式寄存器(在中断模式下使用)
#define FT5336_GMODE_REG                    		((u8)0xA4)
#define FT5336_G_MODE_INTERRUPT_POLLING     		((u8)0x00)	//中断模式-触摸过程中保持低电平自己轮训
#define FT5336_G_MODE_INTERRUPT_TRIGGER     		((u8)0x01)	//脉冲触发模式-触摸过程中输出脉冲-默认模式

//FT5336 芯片ID寄存器
#define FT5336_CHIP_ID_REG                  		((u8)0xA8)
#define FT5336_ID_VALUE                     		((u8)0x51)	//FT5336 芯片ID


//下面这些寄存器暂时用不上,也找不到资料
//旋转手势模式下的最小允许角度值寄存器
#define FT5336_RADIAN_VALUE_REG             		((u8)0x91)
//左移和右移手势时的最大偏移寄存器
#define FT5336_OFFSET_LEFT_RIGHT_REG        		((u8)0x92)
//上移和下移手势时的最大偏移寄存器
#define FT5336_OFFSET_UP_DOWN_REG           		((u8)0x93)
//左右移动手势时的最小距离寄存器
#define FT5336_DISTANCE_LEFT_RIGHT_REG      		((u8)0x94)
//向上和向下手势时的最小距离寄存器
#define FT5336_DISTANCE_UP_DOWN_REG         		((u8)0x95)
//放大和缩小手势时的最大距离寄存器
#define FT5336_DISTANCE_ZOOM_REG            		((u8)0x96)
//LIB版本信息的高8位寄存器
#define FT5336_LIB_VER_H_REG                		((u8)0xA1)
//LIB版本信息的低8位寄存器
#define FT5336_LIB_VER_L_REG                		((u8)0xA2)
//芯片选择寄存器
#define FT5336_CIPHER_REG                   		((u8)0xA3)
//当前的电源模式-只读寄存器
#define FT5336_PWR_MODE_REG                 		((u8)0xA5)
//FT5336固件版本寄存器
#define FT5336_FIRMID_REG                   		((u8)0xA6)
//发布代码版本寄存器
#define FT5336_RELEASE_CODE_ID_REG          		((u8)0xAF)
//FT5336系统当前的运行模式寄存器-只读
#define FT5336_STATE_REG                    		((u8)0xBC)
//滤波系数寄存器
#define FT5336_TH_DIFF_REG                  		((u8)0x85)
//触摸检测阈值
#define FT5336_TH_GROUP_REG                 		((u8)0x80)

#define FT5336_USER_TOUCHT_COUNT		5	//用户定义的触摸点数量支持1-FT5336_MAX_DETECTABLE_TOUCH
#if( FT5336_USER_TOUCHT_COUNT == 0 || FT5336_USER_TOUCHT_COUNT > FT5336_MAX_DETECTABLE_TOUCH)
#error("定义的无效的触摸点数量支持!");
#endif //FT5336_USER_TOUCHT_COUNT


//工作模式
typedef enum
{
	FT5336_ACTIVE_MODE			= FT5336_CTRL_KEEP_ACTIVE_MODE,					//Active模式 正常模式,没有触摸是依旧保持活动,功耗大
	FT5336_MONITOR_MODE			= FT5336_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE,	//Monitor模式 省电模式,没有触摸时自动从活动模式切换到监控模式,降低功耗
	FT5336_HIBERNATE_MODE		= FT5336_CTRL_HIBERNATE_MODE,					//Hibernate模式 休眠模式
}FT5336_CTRL_MODE;


//触摸区域定义
typedef struct
{
	u16 Xpos;		//触摸区域中心X坐标
	u16 Ypos;		//触摸区域中心Y坐标
	u8 Weight;		//触摸的压力
	u8 Area;		//触摸区域
	u8 Event;		//触摸状态
}FT5336_TOUCH_TYPE;	

//FT5336 句柄
typedef struct
{
	bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum);	//功能接口-读寄存器
	bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum);	//功能接口-写寄存器
	bool isInitialization;															//是否初始化成功了
	u8 SlaveAddr;																	//通讯地址
	u8 ActiveTouchCount;															//当前有效触摸点数量
	u8 ActiveTouchIndex;															//当前处理的有效触摸点索引
}FT5336_HANDLE;


//FT5336初始化
bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr, 
	bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
	bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum));

u8 FT5336_ReadID(FT5336_HANDLE *pHandle);											//FT5336读取芯片id
u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle);								//FT5336芯片返回有效的触摸点数量
bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode);			//设置FT5336芯片控制模式
u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT]);//FT5336获取触摸区域信息	
	
#endif //__FT5336_H__

IIC部分代码自己去实现,我这边就不再例举了,下面是我的IIC读写寄存器接口

//触摸屏IIC读取寄存器接口
bool TP_FT5336_IIC_ReadReg(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
	return SIIC_ReadReg(&g_SysGlobal.mIIC_Handle, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum);
}

//触摸屏IIC写寄存器接口
bool TP_FT5336_IIC_WriteReg(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
	return SIIC_WriteReg(&g_SysGlobal.mIIC_Handle, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum);
}

//初始化

FT5336_IO_Init();		//触摸屏IO进行初始化
	isStatus = FT5336_Init(&g_SysGlobal.mFT5336_Handle, FT5336_IIC_SLAVE_ADDRESS, TP_FT5336_IIC_ReadReg, TP_FT5336_IIC_WriteReg);

//中断IO定义

/////////////////////////////////////////////////////////////////////////////////////////////
//TOUCH FT5336 触摸屏
#define FT5336_INT_Pin()		PIin(13)
#define FT5336_INT_EFFECTIVE_LEVEL		0						//中断有效电平:低电平

//触摸屏IO初始化
__inline void FT5336_IO_Init(void)
{
	SYS_DeviceClockEnable(DEV_GPIOI,TRUE);						//GPIO I 时钟使能
	SYS_GPIOx_OneInit(GPIOI, 13, IN_FLOATING, IN_NONE); 		//PI13输入
}
//获取触摸按下状态
__inline bool FT5336_GetisTouchDown(void) {if(FT5336_INT_Pin() == FT5336_INT_EFFECTIVE_LEVEL) return TRUE; else return FALSE;}

//测试代码,测试设计到LCD屏幕操作,你也可以注释掉LCD屏幕操作部分,使用printf打印触摸按钮相关的信息

//触摸屏测试
	if(1)
	{
		FT5336_TOUCH_TYPE TouchArea[2][FT5336_USER_TOUCHT_COUNT];
		u32 ColorBuff[FT5336_USER_TOUCHT_COUNT] = {0xFFFF8080, 0xFF80FF80, 0xFF8080FF, 0xFF808080, 0xFF80FFFF};
		u8 i;
		u8 temp;
		bool isFist[FT5336_USER_TOUCHT_COUNT];
		memset(isFist, TRUE, FT5336_USER_TOUCHT_COUNT);
		
		while(1)
		{
			LED1 = FT5336_GetisTouchDown();
			if(FT5336_GetisTouchDown() == TRUE)
			{
				temp = FT5336_GetTouchAreaInfo(&g_SysGlobal.mFT5336_Handle, TouchArea[0]);
				if(temp > 0)
				{
					for(i = 0;i < temp;i ++)
					{
						if(isFist[i] == TRUE)	//首次启动
						{
							memcpy(&TouchArea[1][i], &TouchArea[0][i], sizeof(FT5336_TOUCH_TYPE));		//初始化[1]中存储上一次的坐标
							isFist[i] = FALSE;	//去掉状态
						}
						else //非首次触摸
						{
							GDI_DrawLine(pLTDC_Layer1_GRAM_HANDLE, TouchArea[1][i].Xpos, TouchArea[1][i].Ypos,TouchArea[0][i].Xpos, TouchArea[0][i].Ypos,ColorBuff[i]);			//绘制直线(可以倾斜)
							memcpy(&TouchArea[1][i], &TouchArea[0][i], sizeof(FT5336_TOUCH_TYPE));		//缓存本次的坐标到[1]	
						}
						//uart_printf("触摸点%d:\tX:%d\tY:%d\t", i+1, TouchArea[i].Xpos, TouchArea[i].Ypos);
						//uart_printf("压力:%d\t区域:%d\tEvent:%d\r\n", TouchArea[i].Weight, TouchArea[i].Area, TouchArea[i].Event);
					}
					uart_printf("\r\n");
				}
				OSTimeDlyHMSM(0,0,0,10);
			}
			else
			{
				memset(isFist, TRUE, FT5336_USER_TOUCHT_COUNT);//抬起来了,清零
				OSTimeDlyHMSM(0,0,0,30);
			}
		}
	}

把GUI相关的注释掉,直接用串口打印调试信息最简单,就是下面2行代码

//uart_printf("触摸点%d:\tX:%d\tY:%d\t", i+1, TouchArea[i].Xpos, TouchArea[i].Ypos);
						//uart_printf("压力:%d\t区域:%d\tEvent:%d\r\n", TouchArea[i].Weight, TouchArea[i].Area, TouchArea[i].Event);

下面是我的测试效果,触摸绘图

代码只经过简单的测试,发现可以用,具体实际使用过程中如果有bug欢迎指正。

发布了143 篇原创文章 · 获赞 370 · 访问量 81万+

猜你喜欢

转载自blog.csdn.net/cp1300/article/details/104344683