23-STM32CubeMX系列教程23LCD触摸控制
百为STM32开发板教程之六——触摸画板程序

百为技术官方淘宝网店 技术支持论坛 平移:
百为技术官方淘宝网店 技术支持论坛 旋转:
因此,从上面的缩放,平移,旋转,可以得出 LCD 坐标和触摸屏坐标的计算 公式 XL=XT*A+XT*B+C YL=YT*D+YT*E+F 所以,只要计算出参数 A,B,C,D,E,F, 我们就可以将从触摸芯片(ADS7843/TSC2046/XPT2046)上读出的触摸屏坐标转 换成 LCD 坐标 2、我们采用 tslib 的五点校准算法, 其中触摸采样采用 tslib 里的排序取中间值, 另外加上阈值判断的滤波算法。 typedef struct { int x[5], xfb[5]; int y[5], yfb[5]; int a[7]; } calibration; 其中 xfb[5],yfb[5]存放预先设定的 5 个 LCD 坐标值。x[5],y[5]存放从触 摸 Y+上加电压时,从未加电压的 X+或 X-上可以读 出触摸点的电压。同样在 X-和 X+上加电压时,可以从 Y+或 Y-上读出另一个方向 的电压。
百为技术官方淘宝网店 技术支持论坛 3、触摸屏的排线引出有 4 个信号:XL,YD,XR,YU:
百为技术官方淘宝网店 技术支持论坛 函数 get_sample 调用 put_cross 输出田字形光标,并通过 getxy 采样触摸 坐标值
static void get_sample (calibration *cal, int index, int x, int y, char *name) { put_cross(x, y, 2 | XORMODE); //调用 getxy 将采样到的触摸坐标值存放在 x[],y[]数组里 while(!getxy (&cal->x [index], &cal->y [index])); put_cross(x, y, 2 | XORMODE); //将预先设定的 LCD 坐标值存放在 xfb[],yfb[]数组里 cal->xfb [index] = x; cal->yfb [index] = y; }
STM32触摸屏程序

现在随着TFT屏的价格快速滑落,原来旧有的单色屏已经远远跟不上了发展的需要,加上触摸屏的成本也不是很高,因而无论在成本还是技术发展的优势上面,TFT屏发展已经获得了平分秋色的实力。
但是在传统意义上面来说,使用TFT 屏控制必然考虑到arm体现,因而,性价比较高的STM32就走上了台前。
我们现在使用的是一款STM32F103RBT6的芯片。
这个芯片具有很好的性价比:ARM Cortex-M3内核,128kB Flash,20KB RAM,最高工作时钟72MHz,64脚。
我们选用的是2.8寸的TFT屏,TFT屏的控制芯片是:ILI9325;其触摸屏控制芯片为ADS7843。
我们首先看到的是TFT屏和该芯片的接口,其接口定义如下:2.8寸彩色TFT屏模块接脚定义脚位功能描述脚位功能描述01脚3V3电源正17脚DB14数据线02脚GND电源负18脚DB15数据线03脚DB00数据线19脚CS屏片选,低有效04脚DB01数据线20脚RS寄存器选择05脚DB02数据线21脚WR写使能,低有效06脚DB03数据线22脚RD读使能,低有效07脚DB04数据线23脚RESET复位,低有效08脚DB05数据线24脚BACK_LIGHT背光控制,高有效09脚DB06数据线25脚MISO SPI主入从出10脚DB07数据线26脚INT触摸中断输出11脚DB08数据线27脚MOSI SPI主出从入12脚DB09数据线28脚BUSY触摸芯片忙检测13脚DB10数据线29脚SCLK SPI时钟14脚DB11数据线30脚SDA I2C数据线15脚DB12数据线31脚T_CS触摸芯片片选16脚DB13数据线32脚SCL I2C时钟线现在,我们使用IAR编译,然后通过JLINK下载一个程序进去,然后分析一下程序。
使用IAR的环境就不一一叙述了。
下面是ILI9325的控制程序的部分子程序以供参考。
详细程序见附件。
/****************************************************************函数名:Lcd配置函数功能:配置所有和Lcd相关的GPIO和时钟引脚分配为:PB8--PB15——16Bit数据总线低8位PC0--PC7——16Bit数据总线高8位PC8 ——Lcd_csPC9 ——Lcd_rs*PC10——Lcd_wrPC11——Lcd_rd*PC12——Lcd_rstPC13——Lcd_blaklight背光靠场效应管驱动背光模块*****************************************************************/void Lcd_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/*开启相应时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);/*所有Lcd引脚配置为推挽输出*//*16位数据低8位*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13| GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/*16位数据高8位*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO _Pin_6|GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);/*控制脚*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;GPIO_Init(GPIOC, &GPIO_InitStructure);/*背光控制*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;GPIO_Init(GPIOC, &GPIO_InitStructure);}void DataToWrite(u16 data){u16 temp;temp = GPIO_ReadOutputData(GPIOB);GPIO_Write(GPIOB, (data<<8)|(temp&0x00ff));temp = GPIO_ReadOutputData(GPIOC);GPIO_Write(GPIOC, (data>>8)|(temp&0xff00));}/******************************************************************** *********名称:u16 CheckController(void)*功能:返回控制器代码*入口参数:无*出口参数:控制器型号*说明:调用后返回兼容型号的控制器型号*调用方法:code=CheckController();********************************************************************* *******/u16 CheckController(void){u16 tmp=0,tmp1=0,tmp2=0;GPIO_InitTypeDef GPIO_InitStructure;DataToWrite(0xffff);//数据线全高Set_Rst;Set_nWr;Set_Cs;Set_Rs;Set_nRd;Set_Rst;Delay_nms(1);Clr_Rst;Delay_nms(1);Set_Rst;Delay_nms(1);LCD_WR_REG(0x0000,0x0001); //start oscillationDelay_nms(1);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13| GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);/*16位数据高8位*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO _Pin_6|GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOC,GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_9);GPIO_ResetBits(GPIOC,GPIO_Pin_11);tmp1 = GPIO_ReadInputData(GPIOB);tmp2 = GPIO_ReadInputData(GPIOC);tmp = (tmp1>>8) | (tmp2<<8);GPIO_SetBits(GPIOC,GPIO_Pin_11);GPIO_SetBits(GPIOC,GPIO_Pin_8);/*16位数据低8位*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13| GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/*16位数据高8位*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO _Pin_6|GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);return tmp;}/**********************************************函数名:Lcd初始化函数功能:初始化Lcd入口参数:无返回值:无***********************************************/void Lcd_Initialize(void){u16 i;Lcd_Light_ON;DataToWrite(0xffff);//数据线全高Set_Rst;Set_nWr;Set_Cs;Set_Rs;Set_nRd;Set_Rst;Delay_nms(1);Clr_Rst;Delay_nms(1);Set_Rst;Delay_nms(1);/*#ifdef ILI9325LCD_WR_REG(0x00e3,0x3008);LCD_WR_REG(0x00e7,0x0010);LCD_WR_REG(0x00ef,0x1231); //Set the internal vcore voltageLCD_WR_REG(0x0001,0x0100); //When SS = 0, the shift direction of outputs is from S1 to S720#endif //When SS = 1, the shift direction of outputs is from S720 to S1.#ifdef ILI9320LCD_WR_REG(0x00e5,0x8000);LCD_WR_REG(0x0000,0x0001);LCD_WR_REG(0x0001,0x0100);//SDelay_nms(10);#endifLCD_WR_REG(0x0002,0x0700);//Line inversion#if ID_AM==000LCD_WR_REG(0x0003,0x0000);//屏幕旋转控制TFM=0,TRI=0,SWAP=1,16 bits system interface swap RGB to BRG,此处ORG和HWM为0#elif ID_AM==001LCD_WR_REG(0x0003,0x0008);#elif ID_AM==010LCD_WR_REG(0x0003,0x0010);。
STM32微控制器触摸感应应用说明书

AN5105基于STM32微控制器的触摸感应控制入门引言本文档帮助客户快速找到基于STM32微控制器的触摸感应应用的相关信息。
本文档适用于STM32F0、STM32F3、STM32L0、STM32L1和STM32L4系列产品,列出了涉及触摸感应的所有现有的应用笔记和用户手册,并提供了触摸感应的关键信息的记录位置。
本文档还解释了如何使用STM32CubeMx图形界面在STM32L0538-DISCO和STM32F072B-DISCO探索板上构建触摸感应应用。
1概述本文档适用于基于Arm ®的器件。
提示Arm 是Arm Limited (或其子公司)在美国和/或其他地区的注册商标。
概述术语和原理2术语和原理2.1术语下面是与触摸感应有关的主要术语:•采集模式–CT:电荷转移采集原理。
此模式用在STM32微控制器上。
•触摸感应STM32外设–TSC:触摸感应控制器外设–组:同时采集的通道组–通道:基本采集项–组合:1-3个通道加上1个采样电容(Cs)•传感器–触摸键或TKey:单通道传感器–线性传感器:多通道传感器,电极排列成直线–旋转传感器:多通道传感器,电极排列成圆形–主动屏蔽:沿传感器走线和/或传感器本身布设的走线或其周围的铜层。
主动屏蔽的驱动方式与传感器类似。
可在不降低灵敏度的情况下改善抗噪性。
•STM32软件–TSL:触摸感应库–Delta:测量值与参考值之间的差值–测量值:在通道上测得的电流信号–参考值:基于测量值样本的平均值的参考信号–DTO:检测超时。
超时由TSLPRM_DTO定义。
参见tsl_conf.h文件中的TSLPRM_DTO。
–DXS:检测排除机制。
排除机制由TSLPRM_USE_DXS定义。
参见tsl_conf.h文件中的TSLPRM_USE_DXS。
–ECS:环境变化机制。
参见文件tsl_conf.h中的TSLPRM_ECS_DELAY。
•涉及的硬件–Cx:传感器电容(典型值为几pF)–Cp:寄生电容(典型值为几pF)–Ct:等效触摸电容–Cs/Cskey/Csshield:采样电容(典型值为2.2至100nF)–Rs/Rskey/Rsshield:串联电阻,ESD保护(典型值为100Ohms至10K)2.2原理STM32触摸感应特性以电荷转移为基础。
STM32CubeMx配置过程详解

STM32CubeMx使用详解——cuyebiren——意法半导体STM32/STM8社区STM32CubeMx是STM32系列单片机初始化代码工程生成工具。
我们可以用它搜索选择满足我们需求的芯片,用它配置芯片外设引脚和功能,用它配置使用如LWIP、FAT32、FreeRTOS等第三方软件系统,还可以用它做功耗评估。
STM32CubeMx 不仅能生成初始化代码工程,也能生成引脚配置信息的pdf和txt文档,方便查阅和设计原理图。
——我相信STM32CubeMx的强大会使玩过它的人赞不绝口,毅然决然地放弃使用标准库,转而使用基于HAL库的它和HAL库。
下面就开始介绍STM32CubeMx的使用:一、打开软件后的界面,如下。
这里主要介绍“Help”菜单。
“Updater Setings”可以设置下载的固件库及其解压文件的存放位置,这样就可以找到软件下载的固件库到底存放到哪了。
“Install New Libraries”可以检查并下载固件库和软件更新情况,以及历史版本,也可以手动导入固件库。
二、点击“New Projet”进入芯片选择界面。
这里选择STM32F407ZGTx(因为我的开发板是这个型号)。
三、选择芯片型号双击或点“OK”,进入工程配置。
四、外设使能及引脚选择。
五、时钟配置。
六、外设及中间件参数配置。
七、工程设置。
八、生成Keil工程。
九、生成的Keil工程分析。
十、HAL库函数(API函数)查找方法。
解压Cube固件包,打开找到Drivers文件夹,再打开如下。
.chm 文件就是HAL 库的API速查手册。
方法如下:十一、学习HAL库的最好方法就是学习官方列程。
打开Cube 固件包,找到Projects 文件夹,里边有好多列程,都是官方出的开发板的HAL库列程,不过是手动建的工程,不是用 CubeMx 生成的。
十二、添加应用程序。
十三、串口打印效果。
十四、小结。
CubeMx 生成的 Keil 工程,可以像我们平时用标准库建的工程一样添加工程文件、工程文件夹和工程路径。
STM32CubeMX使用说明

STM32CubeMX使用说明黄盈鑫目录安装软件 (1)安装固件包 (4)创建一个简单的工程 (8)安装软件●到ST的网站上下载最新版本的STM32CubeMX软件:/content/st_com/en/products/development-tools/software-development-too ls/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx. html●编写这份文档的时候最新版本是V4.17.0将下载后的压缩包解压,双击里面的SetupSTM32CubeMX-4.17.0.exe文件来安装软件,出现下图的界面的时候按Next按钮继续:●在下面的窗口中选择“I accept the terms of this license agreement”然后继续按Next按钮。
●下一个出现的窗口是选择软件安装的路径,默认安装路径是C:\Program Files(x86)\STMicroelectronics\STM32Cube\STM32CubeMX,可以根据实际需要选择别的路径,本次安装在D盘相同的路径上。
●按Next按钮后弹出一个确认窗口,按确定键确定。
●接着弹出下图的配置窗口,按原来默认的配置,按Next键继续。
●安装完后,按Next键继续。
●按Done键关闭下面的窗口,完成所有的安装。
安装固件包●点击桌面上的STM32CubeMX图标运行软件。
●先修改软件包的安装路径,点击help菜单选“Updater Settings”选项。
●软件包默认安装在C:/Users/XIN/STM32Cube/Repository/目录下,STM32Cube软件包比较大可以点击Browse按键修改安装的路径。
●修改完软件包的安装路径后开始安装STM32Cube软件包,点击help菜单选“Install newsoftware and/or firmware packages”选项。
STM32单片机LCD显示接口编程 及其应用

任务三 用LCD来显示机器人运动状态
• C语言的编译预处理
–宏定义
即#define指令,具有如下形式: #define 名字 替换文本 它是一种最简单的宏替换。例如: #define LeftIR GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) #define RightIR GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
任务二 编写LCD模块驱动程序
• 在本任务中,你将通过编写程序来驱动LCD显示器,并显示你 的机器人所要显示的字符或字符串,这样你就可以不需要调 试终端的帮助而显示字符或者字符串。 源程序参考教材P203例程LCDdisplay.c
任务二 编写LCD模块驱动程序
• LCDdisplay.c是如何工作的?
• 例程:MoveWithLCDDisplay.c以例程 NavigationWithSwitch.c为模版,删除串口显示语句,添加 LCD显示部分。 • MoveWithLCDDisplay.c是如何工作的
– switch处理每个case之后,调用Display_List_Char( )函数在 LCD 的二行上显示了相关信息
任务一 认识LCD显示器
• 状态字说明
• 当前数据地址指针的数值,对应数据指针(地址)
LCD内部RAM地址映射图
任务一 认识LCD显示器
• 指令说明
• 显示开/关及光标设置
任务一 认识LCD显示器
• 其他指令
任务一 认识LCD显示器
• 初始化LCD
miniSTM32F103开发版LCD显示实验和触摸屏实验文档

表 16.1.3 MY、MX、MV 设置与 LCD 扫描方向关系表 这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片, BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从 左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可, 这样可以大大提高显示速度。 接下来看指令:0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认) 下面,该指令用于设置横坐标(x 坐标) ,该指令如表 16.1.4 所示:
图 16.1.4 16 位数据与显存对应关系图 从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0 和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这 样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。 这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越 大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效) ,且参数 除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一 样,必须加以注意。 接下来,我们介绍一下 ILI9341 的几个重要命令,因为 ILI9341 的命令很多,我们这里就 不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介 绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。 首先来看指令: 0XD3, 这个是读 ID4 指令, 用于读取 LCD 控制器的 ID, 该指令如表 16.1.1 所示: 顺序 指令 参数 1 参数 2 参数 3 参数 4 控制 RS 0 1 1 1 1 RD 1 ↑ ↑ ↑ ↑ WR ↑ 1 1 1 1 D15~D8 XX XX XX XX XX D7 1 X 0 1 0 1 X 0 0 1 各位描述 D6 D5 0 X 0 0 0 D4 1 X 0 1 0 D3 0 X 0 0 0 D2 0 X 0 0 0 D1 1 X 0 1 0 D0 1 X 0 1 1 HEX D3H X 00H 93H 41H
STM32的液晶与触摸屏显示

STM32的液晶与触摸屏显示TFT-LCD 英文全称为:Thim Film Transistor Liquid Crystal Display。
TFT即薄膜场效应管。
所谓薄膜晶体管,是指液晶显示器上的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动。
从而可以做到高速度、高亮度、高对比度显示屏幕信息。
TFT-LCD 液晶显示屏是薄膜晶体管型液晶显示屏。
我们采用的3.5 寸液晶屏,它的控制芯片是ILI9488,触摸驱动芯片为TSC2046。
最大支持解析度为:HVGA,分辨率为480×320,接口可以为8位或者16位并口,我们这里是使用16 位并口,以发挥STM32的优势。
而背光则使用一个三极管驱动。
引脚电路图如下图:引脚介绍LCD_CS是TFTLCD的片选信号LCD_RS是命令和数据的标志(0,读写命令。
1是写命令)LCD_WR是向TFTLCD写入数据LCD_RD是从TFTLCD读取数据D[17-1]是数据16位双向数据线RST是硬复位的标志BL_CTR背光处理信号lT_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号驱动时序图:驱动流程:RGB565格式说明(16色):指令集:0XD3指令:用于读取LCD控制器的ID0X36指令:用于控制读写方向0X2A指令:用于设置横坐标起始位置和终止位置(x坐标)0X2B指令:用于设置纵坐标起始位置和终止位置(y坐标)0X2C指令:用于写颜色数据0X2E指令:用于读颜色指令接线图:程序:#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"int main(void){u8 x=0;u8 lcd_id[12]; //存放LCD ID字符串delay_init(); //延时函数初始化uart_init(9600); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口LCD_Init();POINT_COLOR=RED;sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GT811有两组寄存器,一组为配置&功能设置寄存器,在初始化的时候配置。触摸屏配置参数由制造商 提供。我们只需了解下面这个四个寄存器即可,此处为设置显示屏的分辨率。
另一组为输出信息寄存器,读取这组寄存器既可以判断当前屏幕的触摸状态。TouchpointFlag寄存器存 储当前触摸的点数,tp0~tp4位触点状态标识为,当tp0置1时,即表示有触点0按下。 GT811最多支持5个触点,若刚开始一次由三个触点按下,tp0,tp1,tp2均置1,表示有三个触点。若此时 第二个触点释放,则tp1清零,只有tp0,tp2为1。当再次有触点按下时,则为tp1置1,最新按下的是触 点2,而不是触点3和触点4。
1/10
参考应用电路如下图,实际上我们在使用的时候只需关心四个引脚即可。I2C_SDA,I2C_SCL为I2C通 信引脚,/RSTB为系统复位引脚,INT为中断信号引脚,但有触摸时,INT输出触发信号,如果MCU对应 的管脚开启外部中断则会触发MCU进入外部中断。
2/10
二、 GT811控制方式
上图为主 CPU 对 GT811 进行的写操作流程图。首先主 CPU 产生一个起始信号, 然后发送地址信息及 读写位信息“0”表示写操作:0XBA。 在收到应答后,主 CPU 发送寄存器的 16 位地址,随后是 8 位要写 入到寄存器的 数据内容。 GT811 寄存器的地址指针会在写操作后自动加 1,所以当主 CPU 需要对连续 地 址的寄存器进行写操作时,可以在一次写操作中连续写入。写操作完成,主 CPU 发送停止信号结束 当前写操作。
//Data Addr high
//Data Addr low
}
/******************************************************************************* * Function Name : i2C_RD_Reg * Description : Writes to the selected register. * Input : - reg: address of the selected register. * - buf: Need to read the BUF pointer. * - len: The length of the array * Output : None * Return : None * Attention : None *******************************************************************************/ void I2C_ReadReg(uint8_t I2c_Addr,uint16_t reg,uint8_t *buf,uint8_t len) { uint8_t i; I2C_Start(); I2C_Send_Byte(I2c_Addr); I2C_Wait_Ack(); #ifdef I2C_MEMADD_16BIT I2C_Send_Byte(reg>>8); I2C_Wait_Ack(); #endif I2C_Send_Byte(reg&0xFF); I2C_Wait_Ack(); I2C_Stop(); I2C_Start(); I2C_Send_Byte(I2c_Addr+1); I2C_Wait_Ack(); for(i=0;i<len;i++) { buf[i]=I2C_Read_Byte(i==(len-1)?0:1); } I2C_Stop(); //Data Addr high
//Data Addr low
}
GT811.c为触摸芯片的驱动文件,下面简单介绍一下初始化函数和读取触摸状态函数。程序开始先拉低复位管 脚复位芯片,注意如果延时时间过短则会导致复位不成功。读取GT811的ID值判断通信是否正常。设置屏幕分辨 率并将配置参数写入到配置&功能寄存器组中。
6/10
/** * @brief Initialize the GT811 communication bus * from MCU to GT811 : ie I2C channel initialization (if required). * @retval None */ uint8_t GT811_Init(void) { I2C_Init(); /* reset GT811 */ HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin, GPIO_PIN_RESET); HAL_Delay(200); HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin, GPIO_PIN_SET); HAL_Delay(200); /* if Version is correct, send the configuration parameters */ if(GT811_ReadID() == GT811_VERSION_VALUE) { /* touch screen configuration parameter (touch screen manufacturers provide) */ uint8_t GTP_CFG_DATA[]= { 0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x05,0x55,0x15,0x55,0x25,0x55,0x35,0x55,0x45,0x55, 0x55,0x55,0x65,0x55,0x75,0x55,0x85,0x55,0x95,0x55,0xA5,0x55,0xB5,0x55,0xC5,0x55,0xD5,0x55,0xE5,0x55, 0xF5,0x55,0x1B,0x03,0x00,0x00,0x00,0x13,0x13,0x13,0x0F,0x0F,0x0A,0x50,0x30,0x05,0x03,0x64,0x05,0xe0, 0x01,0x20,0x03,0x00,0x00,0x32,0x2C,0x34,0x2E,0x00,0x00,0x04,0x14,0x22,0x04,0x00,0x00,0x00,0x00,0x00, 0x20,0x14,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x30,0x25,0x28,0x14,0x00, 0x00,0x00,0x00,0x00,0x00,0x01, }; /* config */ GTP_CFG_DATA[62] GTP_CFG_DATA[61] GTP_CFG_DATA[60] GTP_CFG_DATA[59]
= = = =
GT811_MAX_WIDTH >> 8; GT811_MAX_WIDTH & 0xff; GT811_MAX_HEIGHT >> 8; GT811_MAX_HEIGHT & 0xff;
I2C_WriteReg(GT811_CMD_WR,GT811_CONFIG_REG,(uint8_t *)GTP_CFG_DATA,sizeof(GTP_CFG_DATA)); } return HAL_OK; }
三、新建工程
本章在前面显示字符个工程上修改, 复制刚才的的工程修改文件夹名。打开 Cube工程更加原理图重 新配置。 PD7设置为中断输入,本章采用模拟 I2C, PD12,PD13设置为 GPIO输出模式, PD11输出 GPIO 输出。并设置用户标签。
4/10
开启外部中断。
生成报告以及初始化代码,编译程序。若程序没有出错,下载下面的应用程序解压放在BSP文件里面并 添加进工程中。 BSP.zip
如下为读触摸状态函数,先通过I2C读去输出信息寄存器,判断TouchpointFlag寄存器的tp0~tp4是否置 1,即是否有触摸,若有则将寄存器的值转为坐标值,存储在TS_StateTypeDef 结构体的指针内存中。
7/10
void GT811_GetState(TS_StateTypeDef *TS_State) { uint8_t RegBuf[34]; /* Read touch message */ I2C_ReadReg(GT811_CMD_WR,GT811_READ_XY_REG,RegBuf,sizeof(RegBuf)); /* get touch massage */ TS_State->SensorId = RegBuf[0x00] >> 6; TS_State->touchDetected = RegBuf[0x00] & 0x1F; if(TS_State->touchDetected != 0) { //Touch point 1 coordinates TS_State->touchY[0] = GT811_MAX_HEIGHT - (((uint16_t)RegBuf[0x02] << 8) + RegBuf[0x03]); TS_State->touchX[0] = (((uint16_t)RegBuf[0x04] << 8) + RegBuf[0x05]); TS_State->touchWeight[0] = RegBuf[0x06]; //Touch point 2 coordinates TS_State->touchY[1] = GT811_MAX_HEIGHT - (((uint16_t)RegBuf[0x07] << 8) + RegBuf[0x08]); TS_State->touchX[1] = (((uint16_t)RegBuf[0x09] << 8) + RegBuf[0x0A]); TS_State->touchWeight[1] = RegBuf[0x0B]; //Touch point 3 coordinates TS_State->touchY[2] = GT811_MAX_HEIGHT - (((uint16_t)RegBuf[0x0C] << 8) + RegBuf[0x0D]); TS_State->touchX[2] = (((uint16_t)RegBuf[0x0E] << 8) + RegBuf[0x0F]); TS_State->touchWeight[2] = RegBuf[0x10]; //Touch point 4 coordinates TS_State->touchY[3] = GT811_MAX_HEIGHT - (((uint16_t)RegBuf[0x11] << 8) + RegBuf[0x18]); TS_State->touchX[3] = (((uint16_t)RegBuf[0x19] << 8) + RegBuf[0x1A]); TS_State->touchWeight[3] = RegBuf[0x1B]; //Touch point 5 coordinates TS_State->touchY[4] = GT811_MAX_HEIGHT - (((uint16_t)RegBuf[0x1C] << 8) + RegBuf[0x1D]); TS_State->touchX[4] = (((uint16_t)RegBuf[0x1E] << 8) + RegBuf[0x1F]); TS_State->touchWeight[4] = RegBuf[0x20]; } }