硬汉嵌入式论坛

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

emwin 按键被莫名按下

[复制链接]

92

主题

89

回帖

365

积分

高级会员

积分
365
发表于 2019-11-26 13:16:11 | 显示全部楼层 |阅读模式
我们实现了一个打印按钮,每次点一次触发打印机打印,但是没次只按一次,去看到按钮被按下去好几次的效果 ,这个是怎么回事?
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-11-27 14:38:06 | 显示全部楼层
可以通过打印数据分析,执行打印了几次命令,如果执行了几次,可以做个软件防抖或者延时
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-11-28 08:36:06 | 显示全部楼层
触摸有抖动。
回复

使用道具 举报

92

主题

89

回帖

365

积分

高级会员

积分
365
 楼主| 发表于 2019-12-2 10:53:31 | 显示全部楼层
  1. #include "gt911.h"
  2. #include "touch.h"
  3. #include "ctiic.h"
  4. #include "tftlcd.h"
  5. #include "usart.h"
  6. #include "delay.h"
  7. #include "string.h"

  8. /*
  9. * @Description:GT911配置参数表
  10. * @                第一个字节为版本号(0X60),必须保证新的版本号大于等于GT911内部
  11. * @                flash原有版本号,才会更新配置.
  12. */
  13. const u8 GT911_CFG_TBL[]=                                                           //数组内容修改了
  14. {
  15. #if 1        /* 1024 * 600 */
  16.                 0x96,0x00,0x04,0x58,0x02,0x05,0x0D,0x00,0x01,0x0A,
  17.                 0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
  18.                 0x00,0x00,0x08,0x17,0x19,0x1C,0x14,0x87,0x29,0x0A,
  19.                 0x4E,0x50,0xEB,0x04,0x00,0x00,0x00,0x00,0x02,0x10,
  20.                 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  21.                 0x00,0x46,0x64,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
  22.                 0x9E,0x48,0x00,0x8D,0x4D,0x00,0x7F,0x53,0x00,0x73,
  23.                 0x59,0x00,0x67,0x60,0x00,0x67,0x00,0x00,0x00,0x00,
  24.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  26.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27.                 0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,
  28.                 0x12,0x14,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
  29.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30.                 0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x1D,
  31.                 0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0x28,0xFF,0xFF,
  32.                 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
  33.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  34.                 0x00,0x00,0x00,0x00,0x17,0x01
  35. #else

  36.   0x68,0x00,0x04,0x58,0x02,0x05,0x3D,0x00,0x01,0x48,         //0x68是自己定义的版本号
  37.   0x28,0x0D,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
  38.   0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0C,
  39.   0x30,0x38,0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D,
  40.   0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00,
  41.   0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
  42.   0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D,
  43.   0x33,0x00,0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00,
  44.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  46.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  47.   0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A,
  48.   0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00,
  49.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  50.   0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,
  51.   0x18,0x16,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04,
  52.   0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
  53.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54.   0x00,0x00,0x00,0x00,
  55. #endif
  56. };  

  57. /*
  58. * @Description: 发送GT911配置参数
  59. * @para:
  60. * @                mode:0,参数不保存到flash
  61. * @                mode:1,参数保存到flash
  62. * @return:
  63. */
  64. u8 GT911_Send_Cfg(u8 mode)
  65. {
  66.         u8 buf[2];
  67.         u8 i = 0;
  68.         buf[0] = 0;
  69.         buf[1] = mode;                                                                                                                //是否写入到GT911 FLASH?  即是否掉电保存

  70.         for(i = 0;i < sizeof(GT911_CFG_TBL);i++)
  71.         {
  72.                 buf[0] += GT911_CFG_TBL[i];                                                                                //计算校验和
  73.         }
  74.     buf[0] = (~buf[0]) + 1;
  75.    
  76.         GT911_WR_Reg(GT_CFGS_REG,(u8*)GT911_CFG_TBL,sizeof(GT911_CFG_TBL));        //发送寄存器配置
  77.         GT911_WR_Reg(GT_CHECK_REG,buf,2);                                                                        //写入校验和,和配置更新标记
  78.         return 0;
  79. }

  80. /*
  81. * @Description: 向GT911写入一次数据
  82. * @para:
  83. * @                reg:起始寄存器地址
  84. * @                buf:数据缓缓存区
  85. * @                len:写数据长度
  86. * @return:
  87. */
  88. u8 GT911_WR_Reg(u16 reg,u8 *buf,u8 len)
  89. {
  90.         u8 i;
  91.         u8 ret = 0;
  92.         CT_IIC_Start();         
  93.         CT_IIC_Send_Byte(GT911_CMD_WR);                //发送写命令          
  94.         CT_IIC_Wait_Ack();
  95.         CT_IIC_Send_Byte(reg>>8);                   //发送高8位地址
  96.         CT_IIC_Wait_Ack();                                                                                                              
  97.         CT_IIC_Send_Byte(reg&0XFF);                   //发送低8位地址
  98.         CT_IIC_Wait_Ack();  
  99.         for(i=0;i<len;i++)
  100.         {          
  101.             CT_IIC_Send_Byte(buf[i]);                //发数据
  102.                 ret=CT_IIC_Wait_Ack();
  103.                 if(ret)break;  
  104.         }
  105.     CT_IIC_Stop();                                                //产生一个停止条件            
  106.         return ret;
  107. }

  108. /*
  109. * @Description:向GT911读出一次数据
  110. * @para:
  111. * @                reg:起始寄存器地址
  112. * @                buf:数据缓缓存区
  113. * @                len:写数据长度
  114. * @return:
  115. */
  116. void GT911_RD_Reg(u16 reg,u8 *buf,u8 len)
  117. {
  118.         u8 i;
  119.         CT_IIC_Start();       
  120.         CT_IIC_Send_Byte(GT911_CMD_WR);           //发送写命令          
  121.         CT_IIC_Wait_Ack();
  122.         CT_IIC_Send_Byte(reg>>8);                   //发送高8位地址
  123.         CT_IIC_Wait_Ack();                                                                                                              
  124.         CT_IIC_Send_Byte(reg&0XFF);                   //发送低8位地址
  125.         CT_IIC_Wait_Ack();  
  126.         CT_IIC_Start();                     
  127.         CT_IIC_Send_Byte(GT911_CMD_RD);           //发送读命令                  
  128.         CT_IIC_Wait_Ack();          
  129.         for(i=0;i<len;i++)
  130.         {          
  131.             buf[i] = CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据          
  132.         }
  133.     CT_IIC_Stop();                                                //产生一个停止条件     
  134. }

  135. /*
  136. * @Description:初始化GT911触摸屏
  137. * @para:
  138. * @return:0,初始化成功;1,初始化失败
  139. */
  140. u8 GT911_Init(void)
  141. {
  142.         u8 temp[2];
  143.     GPIO_InitTypeDef GPIO_Initure;
  144.          
  145.         __HAL_RCC_GPIOA_CLK_ENABLE();                                //开启GPIOA时钟
  146.         __HAL_RCC_GPIOH_CLK_ENABLE();                                //开启GPIOH时钟
  147.                
  148.     //PH7 --> CT_INT
  149.     GPIO_Initure.Pin = GPIO_PIN_7;                                //PH7
  150.     GPIO_Initure.Mode = GPIO_MODE_INPUT;                //输入
  151.     GPIO_Initure.Pull = GPIO_PULLUP;                        //上拉
  152.     GPIO_Initure.Speed = GPIO_SPEED_HIGH;                //高速
  153.     HAL_GPIO_Init(GPIOH, &GPIO_Initure);                //初始化
  154.             
  155.     //PA4 --> CT_RST
  156.     GPIO_Initure.Pin = GPIO_PIN_4;                                //PA4
  157.     GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;        //推挽输出
  158.     HAL_GPIO_Init(GPIOA, &GPIO_Initure);                //初始化
  159.         
  160.         CT_IIC_Init();                                                      //初始化电容屏的I2C总线  
  161.         GT911_RST = 0;                                                                //复位
  162.         delay_ms(20);
  163.         GT911_RST = 1;                                                                //释放复位                    
  164.         delay_ms(50);  

  165.         temp[0] = 0;
  166.         GT911_RD_Reg(GT911_PID_REG,temp,4);                        //读取ID

  167. #ifdef DEBUG_MODE
  168.         printf("%s\r\n", temp);                                                //打印GT911的芯片ID
  169. #endif

  170.         if(strcmp((char *)temp, "911") == 0)                //ID: GT911
  171.         {
  172.                 temp[0] = 0X02;                       
  173.                 GT911_WR_Reg(GT911_CTRL_REG, temp, 1);        //软复位GT9147
  174.                 GT911_RD_Reg(GT911_CFGS_REG, temp, 1);        //读取GT_CFGS_REG寄存器
  175.                
  176. #ifdef DEBUG_MODE
  177.                 printf("GT911 config list version:%x\r\n", temp[0]);
  178. #endif
  179.                
  180.                 if(temp[0] < 0X68)                                                //默认版本比较低,需要更新flash配置
  181.                 {
  182. #ifdef DEBUG_MODE
  183.                         printf("Default Ver:%x\r\n", temp[0]);
  184. #endif
  185.                         GT911_Send_Cfg(1);                                        //更新并保存配置  //先屏蔽//   

  186.                         delay_ms(10);
  187.                         temp[0] = 0X00;         
  188.                         GT911_WR_Reg(GT911_CTRL_REG, temp, 1);//结束复位   
  189.                         return 0;
  190.                 }
  191.        
  192.         return 1;
  193.         }
  194. }

  195. /*
  196. * @Description:扫描触摸屏(采用查询方式)
  197. * @para:
  198. * @                mode:0,正常扫描.
  199. * @return:
  200. * @                0: 触屏无触摸;
  201. * @                1: 触屏有触摸
  202. */
  203. const u16 GT911_TPX_TBL[5]={GT911_TP1_REG,
  204.                                                         GT911_TP2_REG,
  205.                                                         GT911_TP3_REG,
  206.                                                         GT911_TP4_REG,
  207.                                                         GT911_TP5_REG};
  208. u8 GT911_Scan(u8 mode)
  209. {
  210.         u8 buf[4];
  211.         u8 i = 0;
  212.         u8 res = 0;
  213.         u8 temp;
  214.         static u8 t = 0;                                                                //控制查询间隔,从而降低CPU占用率   
  215.        
  216.         t++;
  217.         if((t%10)==0||t<10)                                                                //空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
  218.         {
  219.                 GT911_RD_Reg(GT911_GSTID_REG, &mode, 1);        //读取触摸点的状态  
  220.                
  221.                 if(mode&0X80&&((mode&0XF)<6))
  222.                 {
  223.                         temp=0;
  224.                         GT911_WR_Reg(GT_GSTID_REG,&temp,1);                //清标志
  225.                 }               

  226.                 if((mode&0XF)&&((mode&0XF)<6))
  227.                 {
  228.                         temp=0XFF<<(mode&0XF);                                        //将点的个数转换为1的位数,匹配tp_dev.sta定义
  229.                         tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
  230.                         for(i=0;i<5;i++)
  231.                         {
  232.                                 if(tp_dev.sta&(1<<i))                                //触摸有效?
  233.                                 {
  234.                                         GT911_RD_Reg(GT911_TPX_TBL[i],buf,4);                                //读取XY坐标值

  235.                                         if(tp_dev.touchtype&0X01)                                                       
  236.                                         {
  237.                                                 tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]);        //lcddev.width-
  238.                                                 tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  239.                                         }
  240.                                         else
  241.                                         {
  242.                                                 tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
  243.                                                 tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  244.                                         }
  245.                                         printf("touch\n");
  246.                                 }                       
  247.                         }
  248.                         res=1;

  249.                         if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)                        //非法数据(坐标超出了)
  250.                         {
  251.                                 if((mode&0XF)>1)                                        //有其他点有数据,则复第二个触点的数据到第一个触点.
  252.                                 {
  253.                                         tp_dev.x[0]=tp_dev.x[1];
  254.                                         tp_dev.y[0]=tp_dev.y[1];
  255.                                         t=0;                                                        //触发一次,则会最少连续监测10次,从而提高命中率
  256.                                 }
  257.                                 else                                                                //非法数据,则忽略此次数据(还原原来的)  
  258.                                 {
  259.                                         tp_dev.x[0]=tp_dev.x[4];
  260.                                         tp_dev.y[0]=tp_dev.y[4];
  261.                                         mode=0X80;               
  262.                                         tp_dev.sta = temp;                                //恢复tp_dev.sta
  263.                                 }
  264.                         }
  265.                         else
  266.                         {
  267.                                 t=0;                                                                //触发一次,则会最少连续监测10次,从而提高命中率
  268.                         }
  269.                 }
  270.         }
  271.        
  272.         if((mode&0X8F)==0X80)                                                        //无触摸点按下
  273.         {
  274.                 if(tp_dev.sta&TP_PRES_DOWN)                                        //之前是被按下的
  275.                 {
  276.                         tp_dev.sta&=~(1<<7);                                        //标记按键松开
  277.                 }
  278.                 else                                                                                //之前就没有被按下
  279.                 {
  280.                         tp_dev.x[0]=0xffff;
  281.                         tp_dev.y[0]=0xffff;
  282.                         tp_dev.sta&=0XE0;                                                //清除点有效标记       
  283.                 }         
  284.         }        
  285.         if(t>240)
  286.         {
  287.                 t=10;                                                                                //重新从10开始计数
  288.                 //printf("运行到SCAN\r\n");
  289.         }
  290.         return res;
  291. }
复制代码


问题:printf("touch\n");当触摸了打印按键之后,按理来说只有触摸打印按钮的过程中才会被执行,但是当我松开按键之后,这行也会不定期的打印,大神给点知道意见呗,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-12-2 12:34:54 | 显示全部楼层
wen 发表于 2019-12-2 10:53
问题:printf("touch\n");当触摸了打印按键之后,按理来说只有触摸打印按钮的过程中才会被执行,但是当 ...

驱动没做好。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 22:46 , Processed in 0.264480 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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