新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2018-7-9
- 在线时间
- 23 小时
|
stm32 f429 核心板+gt911 触摸屏
jlink 更新程序启动之后(没有动触摸屏那块代码),偶尔会遇到触摸不灵,表现为:红色代码部分不打印。
短时间的断电重启,无法恢复正常。
有两种方法可以恢复:
1.把核心板拔下来,让他凉会儿,再插上,可以恢复正常。
2.断电等好久,才能恢复。
请教大佬,这是个什么情况??
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&0X80)&&(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)) //触摸有效?
{
PowdownAndLogoutStart();//重新开启自动关机和注销功能
GT911_RD_Reg(GT911_TPX_TBL,buf,4); //读取XY坐标值
if(tp_dev.touchtype&0X01)//横屏
{
tp_dev.x=(((u16)(buf[1]&0X0F)<<8)+buf[0]); //lcddev.width-
tp_dev.y=((u16)(buf[3]&0X0F)<<8)+buf[2];
}
else
{
tp_dev.y=((u16)(buf[1]&0X0F)<<8)+buf[0];
tp_dev.x=((u16)(buf[3]&0X0F)<<8)+buf[2];
}
printf("touch [%d,%d]\n",tp_dev.x,tp_dev.y);
}
}
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开始计数
}
return res;
}
|
|