新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2018-7-9
- 在线时间
- 23 小时
|
本帖最后由 憧憬明天 于 2020-2-25 16:26 编辑
emwin+gt911
各位大佬,正点的触摸屏驱动是不是有些问题哈:
1.我长按一个键不松开,会进入如下分支
case WM_NOTIFICATION_RELEASED:
break;
2.没有任何按键操作,某个键会被emwin 识别成按下。
3.按键-->松开处理完之后若干时间,这个键又会被按下,重复次数随机
关键代码如下- <div>void GUI_TOUCH_X_ActivateX(void)
- {
- }</div><div>
- void GUI_TOUCH_X_ActivateY(void)
- {
- }
- </div><div>int GUI_TOUCH_X_MeasureX(void)
- </div>{
- int32_t xvalue;
- if((lcddev.id == 0X5510)||(lcddev.id == 0X1963)||(lcddev.id==0X7084)||(lcddev.id==0X4342)||(lcddev.id==0X7016)) //电容屏的触摸值获取
- {
- tp_dev.scan(0);
- xvalue=lcddev.width - tp_dev.x[0];
- return xvalue;
- }else //电阻屏
- {
- return TP_Read_XOY(0XD0); //CMD_RDX=0XD0
- }
- }
- int GUI_TOUCH_X_MeasureY(void)
- {
- int32_t yvalue;
-
- if((lcddev.id == 0X5510)||(lcddev.id == 0X1963)||(lcddev.id==0X7084)||(lcddev.id==0X4342)||(lcddev.id==0X7016))//电容屏的触摸值获取
- {
- tp_dev.scan(0);
- yvalue = tp_dev.y[0];
- return yvalue;
- }else //电阻屏
- {
- return TP_Read_XOY(0X90); //CMD_RDX=0XD0
- }
- }
- u8 GT911_Scan(u8 mode)
- {
- u8 buf[4];
- u8 i = 0;
- u8 res = 0;
- u8 temp;
- static u8 t = 0; //控制查询间隔,从而降低CPU占用率
-
- t++;
- if((t%10)==0||t<10) //空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
- {
- GT911_RD_Reg(GT911_GSTID_REG, &mode, 1); //读取触摸点的状态
-
- if(mode&0X80&&((mode&0XF)<6))
- {
- temp=0;
- GT911_WR_Reg(GT_GSTID_REG,&temp,1); //清标志
- }
- if((mode&0XF)&&((mode&0XF)<6))
- {
- temp=0XFF<<(mode&0XF); //将点的个数转换为1的位数,匹配tp_dev.sta定义
- tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
- for(i=0;i<5;i++)
- {
- if(tp_dev.sta&(1<<i)) //触摸有效?
- {
- GT911_RD_Reg(GT911_TPX_TBL[i],buf,4); //读取XY坐标值
- if(tp_dev.touchtype&0X01)//横屏
- {
- tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]); //lcddev.width-
- tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- else
- {
- tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
- tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- }
- }
- res=1;
- // if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height) //非法数据(坐标超出了)
- if(tp_dev.x[0]>600||tp_dev.y[0]>1024) //非法数据(坐标超出了)
- {
- if((mode&0XF)>1) //有其他点有数据,则复第二个触点的数据到第一个触点.
- {
- tp_dev.x[0]=tp_dev.x[1];
- tp_dev.y[0]=tp_dev.y[1];
- t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }
- else //非法数据,则忽略此次数据(还原原来的)
- {
- tp_dev.x[0]=tp_dev.x[4];
- tp_dev.y[0]=tp_dev.y[4];
- mode=0X80;
- tp_dev.sta = temp; //恢复tp_dev.sta
- }
- }
- else
- {
- t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }
- }
- }
-
- if((mode&0X8F)==0X80) //无触摸点按下
- {
- if(tp_dev.sta&TP_PRES_DOWN) //之前是被按下的
- {
- tp_dev.sta&=~(1<<7); //标记按键松开
- }
- else //之前就没有被按下
- {
- tp_dev.x[0]=0xffff;
- tp_dev.y[0]=0xffff;
- tp_dev.sta&=0XE0; //清除点有效标记
- }
- }
- if(t>240)
- {
- t=10; //重新从10开始计数
- //printf("运行到SCAN\r\n");
- }
- return res;
- }
复制代码
|
|