GT911单片机驱动程序[通俗易懂]

GT911单片机驱动程序[通俗易懂]GT911手册及驱动程序(安卓、MTK).rar-嵌入式文档类资源-CSDN下载https://download.csdn.net/download/qasxc78563/15117948参考:STM32F103驱动GT911-DarkBright-博客园https://www.cnblogs.com/DarkBright/p/10730346.htmlGT911与主机接口共有6PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。这里用P11做中断脚,P13做复位

大家好,又见面了,我是你们的朋友全栈君。

GT911手册及驱动程序(安卓、MTK).rar-嵌入式文档类资源-CSDN下载 https://download.csdn.net/download/qasxc78563/15117948

参考:STM32F103驱动GT911 – DarkBright – 博客园 https://www.cnblogs.com/DarkBright/p/10730346.html

GT911 与主机接口共有 6 PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。

这里用P11做中断脚,P13做复位脚,P31为SDA,P32为SCL

TouchPannels.c

#define _TOUCH_PANNEL_C_
#include "TouchPannel.h"
#ifdef TouchPannelEn
void GT911_INT_Init(void)
{ 
   
     SetAP1_1M(0);//设置P11输出0
}
void GT911_INT(U8 cmd)
{ 
   
     if(cmd)    SetAP1_1M(1);
     else    SetAP1_1M(0);
}
//中断设置
void GT911_INT_Change(void)
{ 
   
		GetAP1_1M();//读引脚值
	    EA = 1;  //总中断开关
	    EX0 = 1;    //允许外部中断0
	    IT0 = 1;    //外部中断0的触发方式
        SetINTInput();
}
void GT911_RST_Init(void)
{ 
   
     SetAP1_3M(0);
}
void GT911_RST(U8 cmd)
{ 
   
     if(cmd)    SetAP1_3M(1);
     else    SetAP1_3M(0);
}

void TP_I2C_Read(U16 addr,U8*pData,U8 len)
{ 
   
	U8 i=0;

	I2CStart();
	I2CWrite(CTP_SLAVE_ADDR);		//写地址
	ACKCheck();
	I2CWrite((U8)(addr>>8));		// 
	ACKCheck();	 
	I2CWrite((U8)(addr&0XFF));		// 
	ACKCheck();
	I2CStop();
	  
	I2CStart();
	I2CWrite(CTP_SLAVE_ADDR|0x01);		// 读地址
	ACKCheck();

	  for(i=0;i<len;i++)
	  { 
   
		pData[i]=I2CRead();
		AckSend();	
		//printf("d=%x",pData[i]);
	  }
	  pData[i]=I2CRead();
	  NACKSend();
	  I2CStop();
}

U8 TP_WR_Reg(U16 reg,U8 *buf,U8 len)
{ 
   
     U8 i;
     U8 ret=0;
     I2CStart();    
      I2CWrite(CTP_SLAVE_ADDR);       
     ACKCheck();
     I2CWrite(reg>>8);    
     ACKCheck();                                                           
     I2CWrite(reg&0XFF);     
     ACKCheck();  
     for(i=0;i<len;i++)
     { 
          
         I2CWrite(buf[i]);    
         ret=ACKCheck();
         if(ret)break;  
     }
     I2CStop();                        
     return ret; 
}

U8 CODE  GT911_Cfg[] ={ 
   \
	0x41,0x00,0x06,0x00,0x08,0x0A,0x05,0x00,0x01,0x0F,\
	0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0xFB,0x03,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x30,0xAA,\
	0x1F,0x1C,0xD6,0x09,0x00,0x00,0x00,0x9A,0x33,0x25,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,\
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,\
	0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0x16,0x17,\
	0x18,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x14,0x13,0x12,0x11,0x10,0x0F,0x0E,0x0D,\
	0x0C,0x0A,0x08,0x07,0x06,0x04,0x02,0x00,0x19,0x1B,\
	0x1C,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,\
	0x27,0x28,0x29,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,\
	0x00,0x00,0x00,0x00,0x63,0x01};

//驱动写入配置
U8 GT911_Send_Cfg(U8 mode)
{ 
   
     U8 buf[2];
     U8 i=0;
     buf[0]=0;
     buf[1]=mode;    
     for(i=0;i<sizeof(GT911_Cfg);i++)buf[0]+=GT911_Cfg[i];
     buf[0]=(~buf[0])+1;
     TP_WR_Reg(GT_CFGS_REG,(U8*)GT911_Cfg,sizeof(GT911_Cfg));
     TP_WR_Reg(GT_CHECK_REG,buf,2);
     return 0;
} 
//GT911初始化
void InitialTouchPannelDevice(void)
{ 
   
    U8  tmp[4]={ 
   0};
	//printfStr("InitialTouchPannelDevice");
	GT911_RST_Init();
	GT911_INT_Init();

	GT911_RST(0);
	GT911_INT(1);
	DelayMs(1);
	GT911_RST(1);
	DelayMs(6);
	GT911_INT(0);
	DelayMs(55);
	GT911_INT_Change();
	DelayMs(50);

     TP_I2C_Read(GT_PID_REG, tmp, 4);

     tmp[0] = 0x02;
     TP_WR_Reg(GT_CTRL_REG, tmp, 1);
     TP_I2C_Read(GT_CFGS_REG, tmp, 1);
	 
     if(tmp[0] < 0x60){ 
   
         //printf("Default Ver:0x%X\r\n",tmp[0]);
         GT911_Send_Cfg(1);
     }
     DelayMs(10);
     tmp[0] = 0x00;
     TP_WR_Reg(GT_CTRL_REG, tmp, 1);
		 
}
//读取一个点的坐标
BOOL GetPointValue()
{ 
   
	U8  tmp[1]={ 
   0};
	TP_I2C_Read(0x8140, g_touchPointInfor, 0x40);
	tmp[0] = g_touchPointInfor[0x0E];
	printf("tmp[0]=%x", tmp[0]);
	if((tmp[0]&0x80) && ((tmp[0]&0x0f)>0)){ 
   
		if(tmp[0]==0x81)
		{ 
   
			//GetPointData(tmp[0]&0x0f, g_touchPointInfor);

			g_curPoint.xPos = g_touchPointInfor[0x11]<<8 | g_touchPointInfor[0x10] ;
			g_curPoint.yPos = g_touchPointInfor[0x13]<<8 | g_touchPointInfor[0x12];
			printf("x1=%d",g_curPoint.xPos);  
			printf("y1=%d",g_curPoint.yPos);    
		}
	}
	tmp[0] = 0;
	//每次读取后要重新写寄存器
	TP_WR_Reg(0x814E, &tmp, 1);
	return 1;
}
//读取5个点的坐标
#if 0
void GetPointData(U8 cnt, U8 *Pdata)
{ 
   
	Pdata=Pdata;
     switch(cnt){ 
   
         case 5:
	 printf("x5=%d",Pdata[0x31]<<8 | Pdata[0x30]);  
	 printf("y5=%d",Pdata[0x33]<<8 | Pdata[0x32]);       
         case 4:
	 printf("x4=%d",Pdata[0x29]<<8 | Pdata[0x28]);  
	 printf("y4=%d",Pdata[0x2B]<<8 | Pdata[0x2A]);      
         case 3:
	 printf("x3=%d",Pdata[0x21]<<8 | Pdata[0x20]);  
	 printf("y3=%d",Pdata[0x23]<<8 | Pdata[0x22]);  
         case 2:
	 printf("x2=%d",Pdata[0x19]<<8 | Pdata[0x18]);  
	 printf("y2=%d",Pdata[0x1B]<<8 | Pdata[0x1A]);  
         case 1:
	 printf("x1=%d",Pdata[0x11]<<8 | Pdata[0x10]);  
	 printf("y1=%d",Pdata[0x13]<<8 | Pdata[0x12]);          
             break;
         default:
             break;
     }
}
#endif

#endif

TouchPannel.h

#ifndef _TOUCH_PANNEL_H__
#define _TOUCH_PANNEL_H__

#ifdef _TOUCH_PANNEL_C_
#define _TOUCH_PANNEL_EXTERN_ 
#else
#define _TOUCH_PANNEL_EXTERN_ extern
#endif

#define TouchPannelEn
#define I2C_EN ENABLE
#define TP_X_MAX_PIXEL 800 
#define TP_Y_MAX_PIXEL 480

UCHAR XDATA  g_touchPointInfor[0x40];//存放数据信息
#define CTP_SLAVE_ADDR 0x28
//GT911 部分寄存器定义
#define GT_CTRL_REG 0X8040 //GT911控制寄存器
#define GT_CFGS_REG 0X8047 //GT911配置起始地址寄存器
#define GT_CHECK_REG 0X80FF //GT911校验和寄存器
#define GT_PID_REG 0X8140 //GT911产品ID 寄存器
#define GT_GSTID_REG 0X814E //GT911当前触摸情况
//中断脚设置
#define SetINTInput() GetAP1_1M() //读取引脚值
//SDA,SCL
#define GetSda() GetAP3_1M() 
#define SetSda(x) SetAP3_1M(x) //设置引脚值
#define SetScl(x) SetAP3_2M(x) 
#define SetSdaOutput() SetSda(1) 
#define SetSdaInput() GetSda()
#define SetSclOutput() SetScl(1)

typedef unsigned char	 UCHAR;
typedef unsigned char   BYTE;
typedef unsigned char   UINT8;
typedef unsigned char	 U8;
typedef unsigned int    U16;
typedef unsigned long   U32;
#define DATA volatile data
#define BDATA volatile bdata
#define IDATA volatile idata
#define PDATA volatile pdata
#define XDATA volatile xdata
#define CODE volatile code

typedef struct _POINT
{ 
   
    U16 xPos;
	U16 yPos;
}POINT;

U8 XDATA g_ucTPFlags;
POINT XDATA g_curPoint;
POINT XDATA g_prePoint;
BOOL  g_bTPIntFlag;

_TOUCH_PANNEL_EXTERN_ void DelayI2c(U16 delayTime);
_TOUCH_PANNEL_EXTERN_ void I2CStart(void);
_TOUCH_PANNEL_EXTERN_ void I2CStop(void);
_TOUCH_PANNEL_EXTERN_ FLAG ACKCheck(void);
_TOUCH_PANNEL_EXTERN_ void NACKSend(void);
_TOUCH_PANNEL_EXTERN_ void I2CWrite(U8 tempdata);
_TOUCH_PANNEL_EXTERN_ U8 I2CRead(void);
_TOUCH_PANNEL_EXTERN_ void AckSend(void);
_TOUCH_PANNEL_EXTERN_ void InitialTouchPannelDevice(void);
_TOUCH_PANNEL_EXTERN_ BOOL GetPointValue();

I2C.C

#include "TouchPannel.h"
#if I2C_EN
/*********************************************************** void DelayI2c(U16 delayTime) ************************************************************/
void DelayI2c(U16 delayTime)	
{ 
   
	while(delayTime) 
	{ 
   
	    delayTime = delayTime - 1;
    }   
} 
/********************************************************** void I2CStart(void) ***********************************************************/
void I2CStart(void)
{ 
     
	SetSdaOutput();
    SetSclOutput();
	DelayI2c(5);		//___
	SetSda(1);			// |
	SetScl(1);			// |___SDA
	DelayI2c(20);    //____ 
	SetSda(0);			// |
	DelayI2c(20);  // |__SCL
	SetScl(0);	
	DelayI2c(20);
}
/*********************************************************** void I2CStop(void) ************************************************************/
void I2CStop(void)
{ 
      
    SetSdaOutput();    // ___SDA
	SetSda(0);		  // |
	SetScl(1);			  //___|
	DelayI2c(20);	  //_______SCL
	SetSda(1);		  //
	DelayI2c(20);	  //
}
/*********************************************************** FLAG ACKCheck(void) ************************************************************/
FLAG ACKCheck(void)
{ 
   
    U8 loop = 200;
    SetSdaInput();
	DelayI2c(2);								   
	SetScl(1);
	do
	{ 
   
	    DelayI2c(10);
		if(GetSda() == 0)
		{ 
   
		   SetScl(0);	
	       return(0);    //这里说明有ACK信号 
		}
		else
		{ 
   
		   if(loop == 1)
		   { 
   
		        SetScl(0);		
			    printfStr("Ack Error!");
	            return(1);   
		   }
		}
	}while(--loop) ;
    return 1;	
}
/*********************************************************** void NACKSend(void) ************************************************************/
void NACKSend(void)
{ 
   
    SetSdaOutput();
	SetSda(1);           //"发送非应答位"
	DelayI2c(10);
	SetScl(1);	
	DelayI2c(10);
	SetScl(0);	
	DelayI2c(10);
	SetSda(1);	
}

void AckSend(void)
{ 
   
    SetScl(0);
	DelayI2c(10);	//延时5us
	SetSda(0);
	DelayI2c(10);	//延时5us
	SetScl(1);
	DelayI2c(10);	//延时5us 
	SetScl(0);	
	DelayI2c(10);	//延时5us
}
/*********************************************************** void I2CWrite(U8 tempdata) ************************************************************/
void I2CWrite(U8 tempdata)
{ 
   
	U8 XDATA num;                           //"发送数据位数"
	SetSdaOutput();
	for(num = 0;num < 8;num ++)
	{ 
   
		SetSda((tempdata >> (7-num)) & 1);	//"先发高位"
		DelayI2c(20);
		SetScl(1);                        //下降缘 读取
		DelayI2c(20);
		SetScl(0);
		DelayI2c(20);	
	}
	SetSda(1);
}
/*********************************************************** U8 I2CRead(void) ************************************************************/
U8 I2CRead(void)
{ 
   
	U8 XDATA temp = 0xff;
	U8 XDATA num;         //"接收数据位数"
	SetSdaInput();
	for(num = 0;num < 8;num ++)
	{ 
   
		SetScl(1);
		DelayI2c(20);
		temp = temp << 1;//"先接收高位"
		if(GetSda() == 1)
		{ 
   
			temp = temp | 0x01;
		}
		if(GetSda() == 0)
		{ 
   
			temp = temp & 0xfe;
		}
		SetScl(0);
		DelayI2c(20);
	}
	return (temp);
}
#endif

Interrup.c

void  IRQ_Int1Server(void) interrupt  IntSource_INT1
{ 
   
  #ifdef TouchPannelEn 
	  g_bTPIntFlag=1;
  #endif
  	//GetPointValue();
	  INT1IrqFlagClear();  
}

main.c

void main(void)
{ 
   
		InitialTouchPannelDevice();
		///DelayMs(50);
		GetPointValue();
		while(1)
		{ 
   			  
			if(g_bTPIntFlag==1)
			{ 
   
				GetPointValue();
				g_bTPIntFlag=0;
			}
			//DelayMs(50);
		}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147837.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js全局变量详解

    js全局变量详解前言本文主要介绍3种全局变量的定义方式以及开发中会遇到的一些问题,再加上一点个人见解。首先简单的介绍一下3种全局变量的定义方式vara=1;//方式1b=2;//方式2window.c=3;//方式3这3种形式定义出来的全局变量都属于window对象对于方式1我们都不陌生,方式3也看过不少,方式2的隐似创建方式我们或多或少都干过,例如vara=1;funct

    2022年6月9日
    58
  • 计算机网络——子网划分(内含习题讲解)

    计算机网络——子网划分(内含习题讲解)PS:(习题是由b站–计算机网络-谢希仁第7版-河南科技大学视频中获得)前情提要:我们在这之前已经学过了两级的IP地址:但是两级的IP地址有很多弊端,所以我们将要学习三级IP地址,也就是两级IP地址的升级版那我们要注意什么呢?一:我怎么去知道人家用的是两级IP还是三级IP呢?答:利用子网掩码;二:那什么是子网掩码呢?…

    2022年4月19日
    38
  • mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」

    mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」常规查询查询所有字段:select*from表名;查询指定字段:select列1,列2,…from表名;使用as给字段起别名:select字段as名字….from表名;查询某个表的某个字段:select表名.字段….from表名;可以通过as给表起别名:select别名.字段….from表名as别名;消除重复行:distinct字段条件查询㈠比较运算符:>,<,>=,<=,=,!=,

    2022年5月18日
    42
  • 软件测试流程(完整版)

    软件测试流程(完整版)单纯从功能测试层面上来讲的话,APP测试、web测试在流程和功能测试上是没有区别的根据两者载体不一样,则区别如下:1.系统结构方面web项目:b/s架构,基于浏览器的;web测试只要更新来服务器端,客户端就会同步更新app项目:c/s架构,必须要有客户端;app修改来服务端,则客户端用户所有核心版本都需要进行回归测试一遍。2.性能方面web项目需监测响应时间,CPU、Memo…

    2022年6月7日
    45
  • ubuntu密码设置规则_密码复杂性策略

    ubuntu密码设置规则_密码复杂性策略版本查看cat/etc/issuecat/proc/version内核查看uname-aUbuntu修改密码及密码复杂度策略设置方法一、修改密码1、修改普通用户密码passwd2、修改root用户密码sudopasswdroot默认root用户被禁止登录,如果需要解除限制,修改配置即可sudovim/etc/ssh/sshd_config将默认配置注释掉,添加一行新的配置,默认的配置为允许root登录,但是禁止root用密码登录将默认配置注释掉,添加一行新

    2022年9月29日
    3
  • python漫画阅读器 漫画网站只能左右翻页,没法上下滚动连续下拉式观看且广告多体验差?因涉及“版权不明”, 审核未通过

    python漫画阅读器 漫画网站只能左右翻页,没法上下滚动连续下拉式观看且广告多体验差?因涉及“版权不明”, 审核未通过没钱看正版漫画,盗版漫画网站只能左右翻页,没法上下滚动观看且广告多体验差?于是我写了个python爬虫。手机上无论是收费还是免费盗版的漫画都有各种各样的app可供选择,正版的像是腾讯动漫,哔哩哔哩漫画,菠萝包等等,免费的比如动漫之家,免费搜书大全阅读器等等。(说是搜书其实也能看漫画,本质就是一个爬虫);而且阅读的体验也都很不错,且大部分时候也都是在手机上阅读。但当我心血来潮在笔记本上看盗版漫画(穷学生一个)的时候发现很多的盗版漫画网站只有左右翻页观看,翻页很累,而且图片老大一张,网站又没有漫画图片大小调整

    2022年6月16日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号