找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5447|回复: 3
打印 上一主题 下一主题
收起左侧

STM32F429 TOUCHGFX例程 GT811电容触摸芯片驱动

[复制链接]
跳转到指定楼层
楼主
ID:216130 发表于 2018-12-10 18:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基本stm32f429的 touchGFX例程, 炫酷GUI

单片机源程序如下:
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : 电容触摸芯片GT811驱动程序
  5. *        文件名称 : bsp_ct811.c
  6. *        版    本 : V1.0
  7. *        说    明 : GT811触摸芯片驱动程序。

  8. *********************************************************************************************************
  9. */
  10. #include "gt811.h"
  11. #include "usart.h"
  12. #include "i2c.h"
  13. //#include "GUI.h"



  14. #define GT811_READ_XY_REG         0x721        /* 坐标寄存器 */
  15. #define GT811_CONFIG_REG        0x6A2        /* 配置参数寄存器 */

  16. /* GT811配置参数,一次性写入 */
  17. //const uint8_t s_GT811_CfgParams[]=
  18. uint8_t s_GT811_CfgParams[]=
  19. {
  20.         /*
  21.                 0x6A2  R/W  Sen_CH0    触摸屏 1 号感应线对应的 IC 感应线
  22.                 0x6A3  R/W  Sen_CH1    触摸屏 2 号感应线对应的 IC 感应线
  23.                 0x6A4  R/W  Sen_CH2    触摸屏 3 号感应线对应的 IC 感应线
  24.                 0x6A5  R/W  Sen_CH3    触摸屏 4 号感应线对应的 IC 感应线
  25.                 0x6A6  R/W  Sen_CH4    触摸屏 5 号感应线对应的 IC 感应线
  26.                 0x6A7  R/W  Sen_CH5    触摸屏 6 号感应线对应的 IC 感应线
  27.                 0x6A8  R/W  Sen_CH6    触摸屏 7 号感应线对应的 IC 感应线
  28.                 0x6A9  R/W  Sen_CH7    触摸屏 8 号感应线对应的 IC 感应线
  29.                 0x6AA  R/W  Sen_CH8    触摸屏 9 号感应线对应的 IC 感应线
  30.                 0x6AB  R/W  Sen_CH9    触摸屏 10 号感应线对应的 IC 感应线
  31.         */
  32.     0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,

  33.         /*
  34.         0x6AC  R/W  Dr0_Con  CHSELEF0  F1DELAY0
  35.         0x6AD  R/W  Dr0_Con  F2DELAY0  F3DELAY0
  36.        
  37.         0x6AE  R/W  Dr1_Con  CHSELEF1  F1DELAY1
  38.         0x6AF  R/W  Dr1_Con  F2DELAY1  F3DELAY1
  39.        
  40.         0x6B0  R/W  Dr2_Con  CHSELEF2  F1DELAY2
  41.         0x6B1  R/W  Dr2_Con  F2DELAY2  F3DELAY2
  42.        
  43.         0x6B2  R/W  Dr3_Con  CHSELEF3  F1DELAY3
  44.         0x6B3  R/W  Dr3_Con  F2DELAY3  F3DELAY3
  45.        
  46.         0x6B4  R/W  Dr4_Con  CHSELEF4  F1DELAY4
  47.         0x6B5  R/W  Dr4_Con  F2DELAY4  F3DELAY4
  48.        
  49.         0x6B6  R/W  Dr5_Con  CHSELEF5  F1DELAY5
  50.         0x6B7  R/W  Dr5_Con  F2DELAY5  F3DELAY5
  51.        
  52.         0x6B8  R/W  Dr6_Con  CHSELEF6  F1DELAY6
  53.         0x6B9  R/W  Dr6_Con  F2DELAY6  F3DELAY6
  54.        
  55.         0x6BA  R/W  Dr7_Con  CHSELEF7  F1DELAY7
  56.         0x6BB  R/W  Dr7_Con  F2DELAY7  F3DELAY7
  57.        
  58.         0x6BC  R/W  Dr8_Con  CHSELEF8  F1DELAY8
  59.         0x6BD  R/W  Dr8_Con  F2DELAY8  F3DELAY8
  60.        
  61.         0x6BE  R/W  Dr9_Con  CHSELEF9  F1DELAY9
  62.         0x6BF  R/W  Dr9_Con  F2DELAY9  F3DELAY9
  63.        
  64.         0x6C0  R/W  Dr10_Con  CHSELEF10  F1DELAY10
  65.         0x6C1  R/W  Dr10_Con  F2DELAY10  F3DELAY10
  66.        
  67.         0x6C2  R/W  Dr11_Con  CHSELEF11  F1DELAY11
  68.         0x6C3  R/W  Dr11_Con  F2DELAY11  F3DELAY11
  69.        
  70.         0x6C4  R/W  Dr12_Con  CHSELEF12  F1DELAY12
  71.         0x6C5  R/W  Dr12_Con  F2DELAY12  F3DELAY12
  72.        
  73.         0x6C6  R/W  Dr13_Con  CHSELEF13  F1DELAY13
  74.         0x6C7  R/W  Dr13_Con  F2DELAY13  F3DELAY13
  75.        
  76.         0x6C8  R/W  Dr14_Con  CHSELEF14  F1DELAY14
  77.         0x6C9  R/W  Dr14_Con  F2DELAY14  F3DELAY14
  78.        
  79.         0x6CA  R/W  Dr15_Con  CHSELEF15  F1DELAY15
  80.         0x6CB  R/W  Dr15_Con  F2DELAY15  F3DELAY15
  81.         */
  82.         0x05,0x55,0x15,0x55,0x25,0x55,0x35,0x55,0x45,0x55,0x55,0x55,0x65,0x55,0x75,0x55,
  83.         0x85,0x55,0x95,0x55,0xA5,0x55,0xB5,0x55,0xC5,0x55,0xD5,0x55,0xE5,0x55,0xF5,0x55,       
  84.        
  85.         /*
  86.         0x6CC  R/W  ADCCFG  芯片扫描控制参数
  87.         0x6CD  R/W  SCAN    芯片扫描控制参数
  88.         */
  89.         0x1B,0x03,
  90.        
  91.         /*
  92.         0x6CE  R/W  F1SET  驱动脉冲 1 频率
  93.         0x6CF  R/W  F2SET  驱动脉冲 2 频率
  94.         0x6D0  R/W  F3SET  驱动脉冲 3 频率
  95.         0x6D1  R/W  F1PNUM  驱动脉冲 1 个数
  96.         0x6D2  R/W  F2PNUM  驱动脉冲 2 个数
  97.         0x6D3  R/W  F3PNUM  驱动脉冲 3 个数
  98.         */
  99.         0x00,0x00,0x00,0x13,0x13,0x13,
  100.        
  101.         /* 0x6D4  R/W  TOTALROW  全部使用的驱动通道数(屏的驱动线+按键驱动线) */
  102.         0x0F,
  103.        
  104.         /*
  105.         0x6D5  R/W  TSROW  用在屏上的驱动线
  106.         0x6D6  R/W  TOTALCOL  用在屏上的感应线
  107.         */
  108.         0x0F,0x0A,
  109.        
  110.         /*
  111.         0x6D7  R/W  Sc_Touch  屏幕按键阈值
  112.         0x6D8  R/W  Sc_Leave  屏幕松键阈值
  113.         */
  114.         0x50,0x30,
  115.        
  116.         /*
  117.         0x6D9  R/W  Md_Switch  保留  DD2    R1  R0  INT    SITO    RT    ST
  118.         0x6DA  R/W  LPower_C  保留  Auto 无按键进低功耗时间,0-63 有效,以 s 为单位
  119.         */
  120.         0x05,0x03,
  121.        
  122.         /* 0x6DB  R/W  Refresh  触摸刷新速率控制参数(50Hz~100Hz):0-100 有效 */       
  123.         0x64,
  124.        
  125.         /* 0x6DC  R/W  Touch_N  保留  使能触摸点个数:1-5 有效 */
  126.         0x05,
  127.        
  128.         /*
  129.         0x6DD  R/W  X_Ou_Max_L X 坐标输出最大值  480
  130.         0x6DE  R/W  X_Ou_Max_H
  131.        
  132.         0x6DF  R/W  Y_Ou_Max_L  Y 坐标输出最大值  800
  133.         0x6E0  R/W  Y_Ou_Max_H
  134.         */
  135. #if 1
  136.         0x58,0x02,
  137.         0x00,0x04,
  138. #else
  139.         0xe0,0x01,
  140.         0x20,0x03,
  141. #endif

  142.         /*
  143.         0x6E1  R/W  X _Th  X 坐标输出门限:0-255,以 4 个原始坐标点为单位
  144.         0x6E2  R/W  Y_Th  Y 坐标输出门限:0-255,以 4 个原始坐标点为单位
  145.         */
  146.         0x00,  0x00,
  147.        
  148.         /*
  149.         0x6E3  R/W  X_Co_Sm  X 方向平滑控制变量,0-255 可配置,0 表示关
  150.         0x6E4  R/W  Y_Co_Sm  Y 方向平滑控制变量,0-255 可配置,0 表示关
  151.         0x6E5  R/W  X_Sp_Lim  X 方向平滑上限速度:0-255 可配置,0 表示关
  152.         0x6E6  R/W  Y_Sp_ Lim  Y 方向平滑上限速度:0-255 可配置,0 表示关
  153.         */
  154.         0x32,0x2C,0x34,0x2E,
  155.        
  156.         /*
  157.         0x6E7  R/W  X_Bor_Lim  Reserved  Reserved
  158.         0x6E8  R/W  Y_Bor_Lim  Reserved  Reserved
  159.         */
  160.         0x00,0x00,
  161.        
  162.         /* 0x6E9  R/W  Filter  丢弃数据帧数  坐标窗口滤波值,以 4 为基数 */
  163.         0x04,
  164.        
  165.         /* 0x6EA  R/W  Large_Tc  0-255 有效:单一触摸区包含结点数大于此数会判为大面积触摸 */
  166.         0x14,
  167.        
  168.         /* 0x6EB  R/W  Shake_Cu  Touch 事件建立去抖  手指个数从多到少去抖 */
  169.         0x22,
  170.        
  171.         /* 0x6EC  R/W  Noise_R  保留  白噪声削减量(低 nibble)有效 */
  172.         0x04,
  173.        
  174.         /* 0x6ED~0x6F1 R/W    保留 */
  175.         0x00,0x00,0x00,0x00,0x00,
  176.        
  177.        
  178.     0x20,0x14,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x30,
  179.     0x25,0x28,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  180. };

  181. #define GT811_WriteReg I2C1_Write
  182. #define GT811_ReadReg I2C1_Read

  183. GT811_T g_GT811;

  184. /*
  185. *********************************************************************************************************
  186. *        函 数 名: GT811_InitHard
  187. *        功能说明: 配置触摸芯片.  在调用该函数前,请先执行 bsp_touch.c 中的函数 bsp_DetectLcdType() 识别id
  188. *        形    参:  无
  189. *        返 回 值: 无
  190. *********************************************************************************************************
  191. */
  192. void GT811_Init(void)
  193. {
  194.         g_GT811.i2c_addr = GT811_I2C_ADDR1;
  195.        
  196.         GT811_WriteReg(g_GT811.i2c_addr, GT811_CONFIG_REG, (uint8_t *)s_GT811_CfgParams, sizeof(s_GT811_CfgParams));
  197.        
  198.         /* 根据模组类型重置分辨率寄存器 */
  199.         if (g_GT811.i2c_addr == GT811_I2C_ADDR1)
  200.         {
  201.                 const uint8_t tab[4] = {0xe0, 0x01, 0x20, 0x03};
  202.                 GT811_WriteReg(g_GT811.i2c_addr, 0x6DD, (uint8_t *)tab, 4);
  203.         }
  204.         else        /* GT811_I2C_ADDR3 */
  205.         {
  206.                 const uint8_t tab[4] = {0x58, 0x02, 0x00, 0x04};
  207.                 GT811_WriteReg(g_GT811.i2c_addr, 0x6DD, (uint8_t *)tab, 4);
  208.         }
  209. }

  210. /*
  211. *********************************************************************************************************
  212. *        函 数 名: GT811_ReadVersion
  213. *        功能说明: 获得GT811的芯片版本
  214. *        形    参: 无
  215. *        返 回 值: 16位版本
  216. *********************************************************************************************************
  217. */
  218. uint16_t GT811_ReadVersion(void)
  219. {
  220.         uint8_t buf[2];

  221.         GT811_ReadReg(g_GT811.i2c_addr, 0x717, buf, 2);

  222.         return ((uint16_t)buf[0] << 8) + buf[1];
  223. }

  224. /*
  225. *********************************************************************************************************
  226. *        函 数 名: GT811_OnePiontScan
  227. *        功能说明: 读取GT811触摸数据,这里仅读取一个触摸点。
  228. *        形    参: 无
  229. *        返 回 值: 无
  230. *********************************************************************************************************
  231. */
  232. bool GT811_ReadOnePiont(uint16_t *px, uint16_t *py)
  233. {
  234.         uint8_t buf[7] = {0}; /* 将其都初始化为 0 */
  235.         uint16_t x, y;
  236.         uint8_t res;
  237.        
  238.         /* 读取寄存器:0x721  R  TouchpointFlag  Sensor_ID  key  tp4  tp3  tp2  tp1  tp0 */
  239.         res = GT811_ReadReg(g_GT811.i2c_addr, GT811_READ_XY_REG, buf, 1);
  240.         if(res != 0)
  241.         {
  242.                 //uprintf("1.failed\r\n");
  243.                 return false;
  244.         }
  245.        
  246.         /* 判断是否按下,没有按下,直接退出 */
  247.         if ((buf[0] & 0x01) == 0)
  248.         {
  249.                 return false;
  250.         }
  251.        
  252.         /* 读取第一个触摸点0 */
  253.         res = GT811_ReadReg(g_GT811.i2c_addr, GT811_READ_XY_REG + 1, &buf[1], 6);
  254.         if(res != 0)
  255.         {
  256.                 //uprintf("2.failed\r\n");
  257.                 return false;
  258.         }
  259.        
  260.         /*
  261.         0x721  R  TouchpointFlag  Sensor_ID  key  tp4  tp3  tp2  tp1  tp0
  262.         0x722  R  Touchkeystate     0  0  0  0  key4  key3  key2  key1

  263.         0x723  R  Point0Xh  触摸点 0,X 坐标高 8 位
  264.         0x724  R  Point0Xl  触摸点 0,X 坐标低 8 位
  265.         0x725  R  Point0Yh  触摸点 0,Y 坐标高 8 位
  266.         0x726  R  Point0Yl  触摸点 0,Y 坐标低 8 位
  267.         0x727  R  Point0Pressure  触摸点 0,触摸压力
  268.         */
  269.         g_GT811.X0 = ((uint16_t)buf[2] << 8) + buf[3];
  270.         g_GT811.Y0 = ((uint16_t)buf[4] << 8) + buf[5];
  271.         g_GT811.P0 = buf[6];
  272.        
  273.         /* 检测按下 */
  274.         /* 坐标转换 :
  275.                 电容触摸板左下角是 (0,0);  右上角是 (479,799)
  276.                 需要转到LCD的像素坐标 (左上角是 (0,0), 右下角是 (799,479)
  277.         */
  278.         x = g_GT811.Y0;
  279.         y = 479 - g_GT811.X0;
  280.        
  281.         /*
  282.                 有时候I2C通信出问题,有触摸值,但是压力参数是0,通过这种方法可以将其排除。
  283.                 x     y   p
  284.                 0,    0,  0
  285.                 0,    0,  0
  286.            24,    0,  0
  287.                 0,    0,  0
  288.            11,  323,  0
  289.                 0,    0,  0
  290.                 0,    0,  0
  291.                 6,  235,  0
  292.            38,  230,  0
  293.                 0,    0,  0
  294. //        */
  295. //        if(g_GT811.P0 == 0)
  296. //        {
  297. //                uprintf("%5d,%5d,%3d\r\n",  g_GT811.X0, g_GT811.Y0, g_GT811.P0);
  298. //                return false;
  299. //        }

  300.         *px = x;
  301.         *py = y;
  302.        
  303.         return true;
  304. }

  305. /*
  306. *********************************************************************************************************
  307. *        函 数 名: GT811_ReadSensorID
  308. *        功能说明: 识别显示模块类别。读取GT811 SensorID引脚状态,有3个状态,悬空,接电源,接地。
  309. *        形    参: 无
  310. *        返 回 值: 显示模块类别, 0, 1, 2
  311. *********************************************************************************************************
  312. */
  313. uint8_t GT811_ReadSensorID(void)
  314. {
  315.         uint8_t value;
  316.        
  317.         /*         0x721  R  TouchpointFlag      Sensor_ID  key  tp4  tp3  tp2  tp1  tp0 */
  318.         GT811_ReadReg(g_GT811.i2c_addr, 0x721, &value, 1);
  319.        
  320.         return (value >> 6);
  321. }
复制代码

所有资料51hei提供下载:
GFX_DEMO.rar (4.65 MB, 下载次数: 69)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:267839 发表于 2019-3-11 13:53 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:113953 发表于 2019-4-10 11:35 | 只看该作者
赞           
回复

使用道具 举报

地板
ID:128321 发表于 2019-4-13 22:58 | 只看该作者
正需要呢,十分感谢你的分享,谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表