XPT2046触摸屏实验过程详解与STM32代码解析 | 您所在的位置:网站首页 › mini2触摸屏休眠磁铁位置怎么设置 › XPT2046触摸屏实验过程详解与STM32代码解析 |
触摸屏的简介触摸屏的控制 XPT2046芯片简介1. XPT2046 的初始化2. XPT2046 读取 X、Y 值3. 物理坐标值的数据处理
学习目标:
1.复习 STM32 的硬件 SPI
2.学习触摸屏的原理做触摸屏实验
触摸屏的简介
现在的液晶屏大部分都带触摸了,一般我们使用比较多的是电阻式触摸屏(多点触摸属 于电容式触摸屏,比如几乎所有智能机都支持多点触摸,它们所用的屏就是电容式的触摸屏) 我们彩屏上面带的也是电阻式的触摸屏。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,它是一种多层的复 合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电 阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层 涂层、在他们之间有许多细小的(小于1/1000 英寸)的透明隔离点把两层导电层隔开绝缘。 从上面的简介,我们知道触摸屏都需要一个 AD 转换器,也就是要将电压变化读取出 来,供主机求出触摸的位置。而我们彩屏上面使用的触摸芯片是XPT2046。XPT2046 的特点主要有: 1. 一款 4 导线制触摸屏控制器,采用 SPI 模式进行通信。 2. 内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。 3. 支持从 1.5V 到 5.25V 的低电压 I/O 接口。 XPT2046 应该有 16 个引脚,如图:
3PZ6808L触摸屏的原理图 XPT2046 说起来其实就是一个 AD 转换器,所以它适合不需要什么初始化设置的, 而具体的初始化其实也就是单片机 IO 的初始化和 SPI 的初始化。 这次 STM32 是使用 SPI1 来进行操作,SPI 的设置其实在前几节课已经讲过了,这 里就不重复讲了,初始化的具体代码如下: /********************************************************************** * Function Name : TOUCH_Init * Description : 初始化触摸屏 * Input : None * Output : None * Return : None **********************************************************************/ void TOUCH_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /* SPI 的 IO 口和 SPI 外设打开时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* TOUCH-CS 的 IO 口设置 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* TOUCH-PEN 的 IO 口设置 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); SPI1_Config(); /* 要使用 FLASH 来存储校正参数,所以注意之前要初始化 */ /* 检测是否有校正参数 */ FLASH_ReadData(&TouchAdj.posState,TOUCH_ADJ_ADDR, sizeof(TouchAdj)); if(TouchAdj.posState != TOUCH_ADJ_OK) { TOUCH_Adjust(); //校正 } }在这个函数中,调用了 SPI1 的初始化函数,和触摸屏的校正程序,下面是 SPI1 的初始化程序,校正原理我们在后面在讲述。 /********************************************************************** * Function Name : SPI1_Config * Description : 初始化 SPI2 * Input : None * Output : None * Return : None *********************************************************************/ void SPI1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* SPI 的 IO 口和 SPI 外设打开时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); /* SPI 的 IO 口设置 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PA5.6.7 上拉 /********************************************************************/ /******************* 设置 SPI 的参数 *********************************/ /********************************************************************/ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//选择全双工SPI 模式 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8 位 SPI SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟悬空高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //在第二个时钟采集数据 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //Nss 使用软件控制 /* 选择波特率预分频为 256 */ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//从最高位开始传输 SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Cmd(SPI1, ENABLE); SPI_Init(SPI1, &SPI_InitStructure); } 2. XPT2046 读取 X、Y 值我们知道,触摸屏根据方向,分为 X 轴和 Y 轴两个部分,通过读取 X 轴和 Y 轴的 数据,我们就可以知道触摸屏触摸的位置了,就像数学上面的,知道了 x 坐标和 y 坐标, 那么就可以确定在坐标轴上面一个点的位置。 如何读取 XPT2046 的数据呢?接下来我们来看一个时序图: |
CopyRight 2018-2019 实验室设备网 版权所有 |