• 多点电容触碰实验


    TK-7016这款屏幕其实是由TFT LCD+触摸屏组合起来的。底下是LCD面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的LCD屏幕。电容触摸屏也是需要一个驱动IC的,驱动IC一般会提供一个I2C接口给主控制器,主控制器可以通过I2C接口来读取驱动IC里面的触摸坐标数据。

    寄存器地址 位 寄存器功能 描述
    0X00 [6:4] 模式寄存器 设置FT5426的工作模式:
    000:正常模式。
    001:系统信息模式
    100:测试模式。
    0X02 [3:0] 触摸状态寄存器 记录有多少个触摸点,
    有效值为1~5。
    0X03 [7:6] 第一个触摸点X坐标高位数据 事件标志:
    00:按下。
    01:抬起
    10:接触
    11:保留
    [3:0] X轴坐标值高4位。
    0X04 [7:0] 第一个触摸点X坐标低位数据 X轴坐标值低8位
    0X05 [7:4] 第一个触摸点Y坐标高位数据 触摸点的ID。
    [3:0] Y轴坐标高4位
    0X06 [7:0] 第一个触摸点Y坐标低位数据 Y轴坐标低8位
    0X09 [7:6] 第二个触摸点X坐标高位数据 与寄存器0X03含义相同。
    [3:0]
    0X0A [7:0] 第二个触摸点X坐标低位数据 与寄存器0X04含义相同。
    0X0B [7:4] 第二个触摸点Y坐标高位数据 与寄存器0X05含义相同。
    [3:0]
    0X0C [7:0] 第二个触摸点Y坐标低位数据 与寄存器0X06含义相同
    0X0F [7:6] 第三个触摸点X坐标高位数据 与寄存器0X03含义相同。
    [3:0]
    0X10 [7:0] 第三个触摸点X坐标低位数据 与寄存器0X04含义相同。
    0X11 [7:4] 第三个触摸点Y坐标高位数据 与寄存器0X05含义相同。
    [3:0]
    0X12 [7:0] 第三个触摸点Y坐标低位数据 与寄存器0X06含义相同
    0X15 [7:6] 第四个触摸点X坐标高位数据 与寄存器0X03含义相同。
    [3:0]

    0X16 [7:0] 第四个触摸点X坐标低位数据 与寄存器0X04含义相同。
    0X17 [7:4] 第四个触摸点Y坐标高位数据 与寄存器0X05含义相同。
    [3:0]
    0X18 [7:0] 第四个触摸点Y坐标低位数据 与寄存器0X06含义相同
    0X1B [7:6] 第五个触摸点X坐标高位数据 与寄存器0X03含义相同。
    [3:0]
    0X1C [7:0] 第五个触摸点X坐标低位数据 与寄存器0X04含义相同。
    0X1D [7:4] 第五个触摸点Y坐标高位数据 与寄存器0X05含义相同。
    [3:0]
    0X1E [7:0] 第五个触摸点Y坐标低位数据 与寄存器0X06含义相同
    0XA1 [7:0] 版本寄存器 版本高字节
    0XA2 [7:0] 版本低字节
    0XA4 [7:0] 中断模式寄存器 用于设置中断模式:
    0:轮询模式
    1:触发模式

    1. /***************************************************************
    2. Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
    3. 文件名 : bsp_ft5xx6.c
    4. 作者 : 左忠凯
    5. 版本 : V1.0
    6. 描述 : 触摸屏驱动文件,触摸芯片为FT5xx6,
    7. 包括FT5426和FT5406
    8. 其他 : 无
    9. 论坛 : www.openedv.com
    10. 日志 : 初版V1.0 2019/1/21 左忠凯创建
    11. ***************************************************************/
    12. 1 #include "bsp_ft5xx6.h"
    13. 2 #include "bsp_i2c.h"
    14. 3 #include "bsp_int.h"
    15. 4 #include "bsp_delay.h"
    16. 5 #include "stdio.h"
    17. 6
    18. 7 struct ft5426_dev_struc ft5426_dev;
    19. 8
    20. 9 /*
    21. 10 * @description : 初始化触摸屏,其实就是初始化FT5426
    22. 11 * @param : 无
    23. 12 * @return : 无
    24. 13 */
    25. 14 void ft5426_init(void)
    26. 15 {
    27. 16 unsigned char reg_value[2];
    28. 17
    29. 18 ft5426_dev.initfalg = FT5426_INIT_NOTFINISHED;
    30. 19
    31. 20 /* 1、初始化IIC2 IO
    32. 21 * I2C2_SCL -> UART5_TXD
    33. 22 * I2C2_SDA -> UART5_RXD
    34. 23 */
    35. 24 IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL, 1);
    36. 25 IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA, 1);
    37. 26 IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL, 0x70B0);
    38. 27 IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA, 0X70B0);
    39. 28
    40. 29 /* 2、初始化触摸屏中断IO和复位IO */
    41. 30 gpio_pin_config_t ctintpin_config;
    42. 31 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);
    43. 32 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);
    44. 33 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF080);
    45. 34 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0X10B0);
    46. 35
    47. 36 /* 中断IO初始化 */
    48. 37 ctintpin_config.direction = kGPIO_DigitalInput;
    49. 38 ctintpin_config.interruptMode = kGPIO_IntRisingOrFallingEdge;
    50. 39 gpio_init(GPIO1, 9, &ctintpin_config);
    51. 40
    52. 41 GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn); /* 使能GIC中对应的中断 */
    53. 42 system_register_irqhandler(GPIO1_Combined_0_15_IRQn,
    54. (system_irq_handler_t)gpio1_io9_irqhandler,
    55. NULL); /* 注册中断服务函数 */
    56. 43 gpio_enableint(GPIO1, 9); /* 使能GPIO1_IO09的中断功能 */
    57. 44
    58. 45 /* 复位IO初始化 */
    59. 46 ctintpin_config.direction=kGPIO_DigitalOutput;
    60. 47 ctintpin_config.interruptMode=kGPIO_NoIntmode;
    61. 48 ctintpin_config.outputLogic=1;
    62. 49 gpio_init(GPIO5, 9, &ctintpin_config);
    63. 50
    64. 51 /* 3、初始化I2C */
    65. 52 i2c_init(I2C2);
    66. 53
    67. 54 /* 4、初始化FT5426 */
    68. 55 gpio_pinwrite(GPIO5, 9, 0); /* 复位FT5426 */
    69. 56 delayms(20);
    70. 57 gpio_pinwrite(GPIO5, 9, 1); /* 停止复位FT5426 */
    71. 58 delayms(20);
    72. 59 ft5426_write_byte(FT5426_ADDR, FT5426_DEVICE_MODE, 0);
    73. 60 ft5426_write_byte(FT5426_ADDR, FT5426_IDG_MODE, 1);
    74. 61 ft5426_read_len(FT5426_ADDR, FT5426_IDGLIB_VERSION, 2,
    75. reg_value);
    76. 62 printf("Touch Frimware Version:%#X\r\n",
    77. ((unsigned short)reg_value[0] << 8) + reg_value[1]);
    78. 63 ft5426_dev.initfalg = FT5426_INIT_FINISHED; /* 标记初始化完成 */
    79. 64 ft5426_dev.intflag = 0;
    80. 65 }
    81. 66
    82. 67 /*
    83. 68 * @description : GPIO1_IO9最终的中断处理函数
    84. 69 * @param : 无
    85. 70 * @return : 无
    86. 71 */
    87. 72 void gpio1_io9_irqhandler(void)
    88. 73 {
    89. 74 if(ft5426_dev.initfalg == FT5426_INIT_FINISHED)
    90. 75 {
    91. 76 //ft5426_dev.intflag = 1;
    92. 77 ft5426_read_tpcoord();
    93. 78 }
    94. 79 gpio_clearintflags(GPIO1, 9); /* 清除中断标志位 */
    95. 80 }
    96. 81
    97. 82 /*
    98. 83 * @description : 向FT5426写入数据
    99. 84 * @param – addr : 设备地址
    100. 85 * @param - reg : 要写入的寄存器
    101. 86 * @param – data : 要写入的数据
    102. 87 * @return : 操作结果
    103. 88 */
    104. 89 unsigned char ft5426_write_byte(unsigned char addr,
    105. unsigned char reg,
    106. unsigned char data)
    107. 90 {
    108. 91 unsigned char status=0;
    109. 92 unsigned char writedata=data;
    110. 93 struct i2c_transfer masterXfer;
    111. 94
    112. 95 /* 配置I2C xfer结构体 */
    113. 96 masterXfer.slaveAddress = addr; /* 设备地址 */
    114. 97 masterXfer.direction = kI2C_Write; /* 写入数据 */
    115. 98 masterXfer.subaddress = reg; /* 要写入的寄存器地址 */
    116. 99 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
    117. 100 masterXfer.data = &writedata; /* 要写入的数据 */
    118. 101 masterXfer.dataSize = 1; /* 写入数据长度1个字节 */
    119. 102
    120. 103 if(i2c_master_transfer(I2C2, &masterXfer))
    121. 104 status=1;
    122. 105
    123. 106 return status;
    124. 107 }
    125. 108
    126. 109 /*
    127. 110 * @description : 从FT5426读取一个字节的数据
    128. 111 * @param – addr : 设备地址
    129. 112 * @param - reg : 要读取的寄存器
    130. 113 * @return : 读取到的数据。
    131. 114 */
    132. 115 unsigned char ft5426_read_byte(unsigned char addr,
    133. unsigned char reg)
    134. 116 {
    135. 117 unsigned char val=0;
    136. 118
    137. 119 struct i2c_transfer masterXfer;
    138. 120 masterXfer.slaveAddress = addr; /* 设备地址 */
    139. 121 masterXfer.direction = kI2C_Read; /* 读取数据 */
    140. 122 masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
    141. 123 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
    142. 124 masterXfer.data = &val; /* 接收数据缓冲区 */
    143. 125 masterXfer.dataSize = 1; /* 读取数据长度1个字节 */
    144. 126 i2c_master_transfer(I2C2, &masterXfer);
    145. 127 return val;
    146. 128 }
    147. 129
    148. 130 /*
    149. 131 * @description : 从FT5429读取多个字节的数据
    150. 132 * @param – addr : 设备地址
    151. 133 * @param - reg : 要读取的开始寄存器地址
    152. 134 * @param - len : 要读取的数据长度.
    153. 135 * @param - buf : 读取到的数据缓冲区
    154. 136 * @return : 无
    155. 137 */
    156. 138 void ft426_read_len(unsigned char addr,unsigned char reg,
    157. unsigned char len,unsigned char *buf)
    158. 139 {
    159. 140 struct i2c_transfer masterXfer;
    160. 141
    161. 142 masterXfer.slaveAddress = addr; /* 设备地址 */
    162. 143 masterXfer.direction = kI2C_Read; /* 读取数据 */
    163. 144 masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
    164. 145 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
    165. 146 masterXfer.data = buf; /* 接收数据缓冲区 */
    166. 147 masterXfer.dataSize = len; /* 读取数据长度 */
    167. 148 i2c_master_transfer(I2C2, &masterXfer);
    168. 149 }
    169. 150
    170. 151 /*
    171. 152 * @description : 读取当前触摸点个数
    172. 153 * @param : 无
    173. 154 * @return : 无
    174. 155 */
    175. 156 void ft5426_read_tpnum(void)
    176. 157 {
    177. 158 ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
    178. FT5426_TD_STATUS);
    179. 159 }
    180. 160
    181. 161 /*
    182. 162 * @description : 读取当前所有触摸点的坐标
    183. 163 * @param : 无
    184. 164 * @return : 无
    185. 165 */
    186. 166 void ft5426_read_tpcoord(void)
    187. 167 {
    188. 168 unsigned char i = 0;
    189. 169 unsigned char type = 0;
    190. 170 //unsigned char id = 0;
    191. 171 unsigned char pointbuf[FT5426_XYCOORDREG_NUM];
    192. 172
    193. 173 ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
    194. FT5426_TD_STATUS);
    195. 174
    196. 175 /*
    197. 176 * 从寄存器FT5426_TOUCH1_XH开始,连续读取30个寄存器的值,
    198. 177 *30个寄存器保存着5个点的触摸值,每个点占用6个寄存器。
    199. 178 */
    200. 179 ft5426_read_len(FT5426_ADDR, FT5426_TOUCH1_XH,
    201. FT5426_XYCOORDREG_NUM, pointbuf);
    202. 180 for(i = 0; i < ft5426_dev.point_num ; i++)
    203. 181 {
    204. 182 unsigned char *buf = &pointbuf[i * 6];
    205. 183 ft5426_dev.x[i] = ((buf[2] << 8) | buf[3]) & 0x0fff;
    206. 184 ft5426_dev.y[i] = ((buf[0] << 8) | buf[1]) & 0x0fff;
    207. 185 type = buf[0] >> 6; /* 获取触摸类型 */
    208. 186 //id = (buf[2] >> 4) & 0x0f;
    209. 187 if(type == FT5426_TOUCH_EVENT_DOWN || type ==
    210. FT5426_TOUCH_EVENT_ON )/* 按下 */
    211. 188 {
    212. 189
    213. 190 } else { /* 释放 */
    214. 191
    215. 192 }
    216. 193 }
    217. 194 }

  • 相关阅读:
    算法与数据结构-图
    MQ通道常用知识列举(一)
    uniapp小程序实现绘制内容,生成海报并保存截图(Painter和Canvas两种方式举例)
    vulnhub BTRSys: v2.1
    Druid实现SQL监控、慢SQL记录、Spring监控、去广告
    Linux编译安装libmodbus库
    【LeetCode-中等题】46. 全排列
    北京筑龙出席安徽省《电子招标投标办法》修订意见研讨会并发言
    左对齐和右对齐
    计算机网络-应用层(应用层概述,网络应用模型(C/S模型,P2P模型),DNS域名协议)
  • 原文地址:https://blog.csdn.net/qq_66545503/article/details/126695060