资讯详情

触摸屏实验

文章目录

    • 触摸屏
      • 红外触摸屏
      • 表面声波触摸屏
      • 电容触摸屏
        • 原理
        • 分类
          • 表面电容电容触摸屏
          • 投影电容触摸屏
            • 自我电容
            • 交互电容
        • 硬件连接
        • GT9147寄存器
          • 控制命令寄存器 0X8040
          • 产品ID寄存器
          • 状态寄存器(0X814E)
          • 坐标数据寄存器
        • 代码
      • 电阻触摸屏
        • 原理
        • 校准
        • XPT2046
          • 数字接口
        • 代码
      • 电阻屏和电容屏的区别

触摸屏

红外触摸屏

由安装在触摸屏外框上的红外在触摸屏外框上 红外探测网在屏幕表面形成 触摸屏操作可以改变触点上的红外线

表面声波触摸屏

由触摸屏 声波发生器 反射器 由声波接收器组成 声波发生器可以在屏幕表面产生高频声波 当手指触摸屏幕时 触点上的声波被阻止 确定坐标位置 不怕电磁干扰 无漂移 防刮性 寿命长 透光率高

电容触摸屏

需要一个驱动IC检测电容触摸 一般通过IIC接口输出触摸数据 两种常见的电容触摸屏驱动IC:GT9147(10个感应通道) 17个驱动通道) OTT2001A(8个感应通道 13个驱动通道) 它们通过四条线和MCU连接:SDA SCL RST INT

原理

触控屏 触控面板 可接收触头等输入信号的感应装置 触摸屏:检测触摸点 液晶屏:负责显示

分类

表面电容电容触摸屏

利用ITO导电膜 屏幕表面的触摸行为幕表面的触摸行为 缺点:只能识别一个手指 即一次触摸

投影电容触摸屏

传感器利用触摸屏电极发射静电场线 投射电容传感技术 电容类型:自我电容 交互电容

自我电容

扫描电极扫描电极和地面组成 触摸屏将并联电容并联到电路中 从而改变扫描线上的整体电容量 控制IC纵横电极依次扫描 纵向和横向电极根据扫描前后的电容变化确定 eg:笔记本电脑触摸屏

交互电容

又 跨越电容 横向和纵向玻璃表面ITO电极的交叉处形成电容 扫描每个交叉口的电容变化 判断触摸点的位置 与自我电容器相比,扫描时间更长

硬件连接

T_PEN -> CT_INT T_CS ->CT_RST T_CLK ->CT_SCL T_MOSI ->CT_SDA 在这里插入图片描述

GT9147寄存器

控制命令寄存器 0X8040

2:软复位GT9147 (一般在硬复位后) 0:正常读取坐标数据

产品ID寄存器

保存产品ID 通过寄存器的值 判断驱动IC的型号 实施初始化

状态寄存器(0X814E)

最高位 表示buffer状态 有数据(坐标/按键) buffer 为1 低四位表示有效触点的数量 范围0~5 0:没有触摸 5表示5点触摸

坐标数据寄存器

五个触点 每个触点需要6个寄存器来存储数据 以触点1为例 我们通常只使用触点x,y坐标 所以只需要读 0X8150~0X8153的数据 组合可以获得触点坐标 GT9147支持自增寄存器地址 提高读取速度

代码

扫描函数

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进入检测一次
	{ 
        
		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];
					}  
				}			
			} 
			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;					
		}
	}
	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;
}
//电容型触摸屏测试
void ctp_test(void)
{ 
        
	u8 t=0;
	u8 i=0;	  	    
 	u16 lastpos[5][2];		//最后一次的数据
	while(1)
	{ 
        
		tp_dev.scan(0);
		for(t=0;t<5;t++)
		{ 
        
			if((tp_dev.sta)&(1<<t))
			{ 
        
				if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
				{ 
        
					if(lastpos[t][0]==0XFFFF)
					{ 
        
						lastpos[t][0] = tp_dev.x[t];
						lastpos[t][1] = tp_dev.y[t];
					}
					lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
					lastpos[t][0]=tp_dev.x[t];
					lastpos[t][1]=tp_dev.y[t];
					if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<20)
					{ 
        
						Load_Drow_Dialog();//清除
					}
				}
			}else lastpos[t][0]=0XFFFF;
		}
		
		delay_ms(5);i++;
		if(i%20==0)LED0=!LED0;
	}	
}

电阻触摸屏

定位准确 不支持多点触摸 触摸有效物体不局限于手指

原理

电阻屏的主要部分是电阻薄膜屏 触摸屏幕时 绝缘的两层导电层在触摸点接触 控制器侦测到接通后 一面导电层接通y轴方向的5V均匀电压场 另一导电层将接触点的电压引至控制卡进行A/D转换(A/D转换芯片) 得到电压值后与5V相比可得到触摸点的y轴坐标 同理可得x轴的坐标

校准

得到电压与坐标之间的函数关系

校准参数保存在EEPROM 断点可保存 每次启动读取该数据即可

XPT2046

4导线触摸屏控制器 支持1.5V到5.25V的低电压I/O接口 可通过执行两次A/D转换查出被按的屏幕位置

数字接口

前八个时钟输入控制字节 转换器收到足够信息 设置输入多路选择器 和 参考源输入 进入采样模式 三个多时钟后 控制字节设置完成 转换器进入转换模式 通过12个时钟周期 完成AD转换

代码

//初始化函数
u8 TP_Init(void)
{ 
        
  GPIO_InitTypeDef  GPIO_InitStructure;	
	
	if(lcddev.id==0X5510)		//电容触摸屏
	{ 
        
		if(GT9147_Init()==0)	//GT9147
		{ 
         
			tp_dev.scan=GT9147_Scan;	//指向GT9147触摸屏扫描
		}else
		{ 
        
			OTT2001A_Init();
			tp_dev.scan=OTT2001A_Scan;	//扫描函数指向OTT2001A触摸屏扫描
		}
		tp_dev.touchtype|=0X80;	//电容屏
		tp_dev.touchtype|=lcddev.dir&0X01;//横屏或竖屏
		return 0;
	}else if(lcddev.id==0X1963)
	{ 
        
		FT5206_Init();
		tp_dev.scan=FT5206_Scan;		//扫描函数指向GT9147触摸屏扫描 
		tp_dev.touchtype|=0X80;			//电容屏
		tp_dev.touchtype|=lcddev.dir&0X01;//横屏还是竖屏
		return 0;
	}else
	{ 
        
		
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF, ENABLE);//使能相应时钟

    //GPIOB1,2初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//PB1/PB2设置上拉输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//设置推挽输出
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
	  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);//初始化 
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PF11设置推挽输出
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
	  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 
		
   
		TP_Read_XY(&tp_dev.x[0],&tp_dev.y[0]);//第一次读取初始化 
		AT24CXX_Init();		//初始化24CXX
		if(TP_Get_Adjdata())return 0;//已经校准
		else			   //未校准
		{ 
         										    
			LCD_Clear(WHITE);//清屏
			TP_Adjust();  	//屏幕校准
			TP_Save_Adjdata();	 
		}			
		TP_Get_Adjdata();	
	}
	return 1; 									 
}

电阻屏和电容屏的区别

电容屏轻微手指触屏即可激活 电阻屏则需要轻触按压 电阻屏可用任何物体触摸 电容屏是人体热感应原理 只能用手指的热感区触摸 电容屏能多点触摸 电阻屏一般不能 电容屏单层加厚钢化玻璃 硬度大 寿命长 电阻屏内部是软的 易划痕 损坏 电容屏在阳光下可视性好 电阻屏可视性稍差 电容触摸屏 对环境要求较高 潮湿 多尘 高低温环境 不易使用

标签: 电容电磁触控屏

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台