硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2289|回复: 5
收起左侧

[有问必答] 请教下都有那些状态可以确定FT5306上有触摸发生了?

[复制链接]

5

主题

21

回帖

36

积分

新手上路

积分
36
发表于 2018-2-5 10:50:22 | 显示全部楼层 |阅读模式
看了安富莱综合教程的例子,g_tFT5X06.Count = buf[2] & 0x07; 我判断0<g_tFT5X06.Count <=5,来判断有没触摸按下,本来这样判断是没问题的,后来发现有的触摸板装在板子上,初次上电g_tFT5X06.Count就有个随机的值,有时等于1有时等于2的,这时我的手触摸一次触摸屏,g_tFT5X06.Count的值就恢复位0了,我如果没触摸,程序运行几分钟后就会进入硬件错误.后来我准备用INT引脚来判断,if(FT5X06_PenInt() == 0)  //INT->PA2 ,又发现有按键按下时INT不是一直输出低电平的,不知道怎么搞了
QQ图片20180205103728.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-2-5 10:56:50 | 显示全部楼层
使用我给emWin做的这个即可,用不到g_tFT5X06.Count,
if(FT5X06_PenInt() == 0) 也可以删掉。就是查询就好了,这个基本不占用什么CPU利用率,非常低。


  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: FT5X06_OnePiontScan
  4. *        功能说明: FT5X06_OnePiontScan函数仅读取了电容触摸屏的一次触摸,在bsp_ts_ft5x06.h文件里面设置参数
  5. *             #define FT5X06_TOUCH_POINTS   1
  6. *             专门用于emWin。
  7. *        形    参: 无
  8. *        返 回 值: 无
  9. *********************************************************************************************************
  10. */
  11. extern GUI_PID_STATE State;
  12. void FT5X06_OnePiontScan(void)
  13. {
  14.         uint8_t buf[CFG_POINT_READ_BUF];
  15.         uint8_t i;
  16.         static uint8_t s_tp_down = 0;
  17.         uint16_t x, y;

  18.         if (g_tFT5X06.Enable == 0)
  19.         {
  20.                 return;
  21.         }
  22.         
  23.         if (FT5X06_PenInt() == 0)
  24.         {
  25.                 return;
  26.         }
  27.         
  28.         FT5X06_ReadReg(2, buf, 1);        
  29.     /* 判断是否有触摸数据 */        
  30.         if ((buf[0] & 0x07) == 0)
  31.         {
  32.                 if (s_tp_down == 1)
  33.                 {
  34.                         /* State.x和State.y的数值无需更新,State是全局变量,保存的就是最近一次的数值 */
  35.                         s_tp_down = 0;
  36.                         State.Pressed = 0;
  37.                         GUI_PID_StoreState(&State);        /* 释放 */
  38.                 }
  39.                 return;
  40.         }
  41.         
  42.         /* 有触摸,读取完整的数据,这里读取了一次 */
  43.         FT5X06_ReadReg(0, buf, CFG_POINT_READ_BUF);
  44.         for (i = 0; i < FT5X06_TOUCH_POINTS; i++)
  45.         {
  46.                 uint8_t pointid;
  47.                
  48.                 pointid = (buf[5 + 6*i]) >> 4;
  49.                 if (pointid >= 0x0f)
  50.                 {
  51.                         break;
  52.                 }
  53.                 else
  54.                 {
  55.                 g_tFT5X06.X[i] = (int16_t)(buf[3 + 6*i] & 0x0F)<<8 | (int16_t)buf[4 + 6*i];
  56.                 g_tFT5X06.Y[i] = (int16_t)(buf[5 + 6*i] & 0x0F)<<8 | (int16_t)buf[6 + 6*i];
  57.                 g_tFT5X06.Event[i] = buf[0x3 + 6*i] >> 6;
  58.                 g_tFT5X06.id[i] = (buf[5 + 6*i])>>4;
  59.             }
  60.     }

  61.         /* 检测按下 */
  62.         {
  63.                 if ((g_tFT5X06.ChipID == 0x55)||(g_tFT5X06.ChipID == 0xa3))       /* 4.3寸 480 * 272 */
  64.                 {
  65.                         x = g_tFT5X06.Y[0];
  66.                         y = g_tFT5X06.X[0];        
  67.                         
  68.                         /* 判断值域 */
  69.                         if (x > 479)
  70.                         {
  71.                                 x = 479;
  72.                         }
  73.                         
  74.                         if (y > 271)
  75.                         {
  76.                                 y = 271;
  77.                         }                        
  78.                 }
  79.                 else if (g_tFT5X06.ChipID == 0x0A)        /* 5.0寸 800 * 480 */
  80.                 {
  81.                         x = g_tFT5X06.X[0];
  82.                         y = g_tFT5X06.Y[0];        
  83.                         
  84.                         /* 判断值域 */
  85.                         if (x > 799)
  86.                         {
  87.                                 x = 799;
  88.                         }                        
  89.                         if (y > 479)
  90.                         {
  91.                                 y = 479;
  92.                         }                        
  93.                 }
  94.                 else        /* id == 0x06 表示7寸电容屏(FT芯片) */
  95.                 {
  96.                         x = g_tFT5X06.X[0];
  97.                         y = g_tFT5X06.Y[0];        
  98.                         
  99.                         /* 判断值域 */
  100.                         if (x > 799)
  101.                         {
  102.                                 x = 799;
  103.                         }                        
  104.                         if (y > 479)
  105.                         {
  106.                                 y = 479;
  107.                         }                        
  108.                 }
  109.         }
  110.         
  111.         if (s_tp_down == 0)
  112.         {
  113.                 s_tp_down = 1;
  114.                 State.x = x;
  115.                 State.y = y;
  116.                 State.Pressed = 1;
  117.                 GUI_PID_StoreState(&State);        
  118.         }
  119.         else
  120.         {
  121.                 State.x = x;
  122.                 State.y = y;
  123.                 State.Pressed = 1;
  124.                 GUI_PID_StoreState(&State);        
  125.         }

  126. #if 0
  127.         for (i = 0; i < CFG_POINT_READ_BUF; i++)
  128.         {
  129.                 printf("%02X ", buf[i]);
  130.         }
  131.         printf("\r\n");
  132. #endif

  133. #if 0  /* 打印5个坐标点数据 */        
  134.         printf("(%5d,%5d,%3d,%3d) ",  g_tFT5X06.X[0], g_tFT5X06.Y[0], g_tFT5X06.Event[0],  g_tFT5X06.id[0]);
  135.         printf("(%5d,%5d,%3d,%3d) ",  g_tFT5X06.X[1], g_tFT5X06.Y[1], g_tFT5X06.Event[1],  g_tFT5X06.id[1]);
  136.         printf("(%5d,%5d,%3d,%3d) ",  g_tFT5X06.X[2], g_tFT5X06.Y[2], g_tFT5X06.Event[2],  g_tFT5X06.id[2]);
  137.         printf("(%5d,%5d,%3d,%3d) ",  g_tFT5X06.X[3], g_tFT5X06.Y[3], g_tFT5X06.Event[3],  g_tFT5X06.id[3]);
  138.         printf("(%5d,%5d,%3d,%3d) ",  g_tFT5X06.X[4], g_tFT5X06.Y[4], g_tFT5X06.Event[4],  g_tFT5X06.id[4]);
  139.         printf("\r\n");
  140. #endif        
  141. }
复制代码


回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-2-5 11:25:29 | 显示全部楼层
本帖最后由 建伟 于 2018-2-5 11:28 编辑

好的,我试试,你这里增加了这个变量s_tp_down是为了判断触摸是否一直在按下的是吗?  你现在用State.Pressed = 0;这个变量判断是否有触摸按下的.懂了!g_tFT5X06.Count = buf[2] & 0x07;的值刚上电不正常你可碰到过,屏厂说静电导致的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-2-5 11:29:04 | 显示全部楼层
建伟 发表于 2018-2-5 11:25
好的,我试试,你这里增加了这个变量s_tp_down是为了判断触摸是否一直在按下的是吗?  你现在用State.Pressed  ...

松手检测。
回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-2-5 13:47:51 | 显示全部楼层
/* 检测按下 */ 下面那个花括号没判断条件的是吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-2-5 16:47:57 | 显示全部楼层
建伟 发表于 2018-2-5 13:47
/* 检测按下 */ 下面那个花括号没判断条件的是吗?

是的,封装了一下。你可以删掉的。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 02:44 , Processed in 0.212759 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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