|
发表于 2020-2-27 07:54:37
|
显示全部楼层
本帖最后由 舞指飞扬 于 2020-2-27 09:00 编辑
//下面的代码段 允许在无13.bin情形下,完成比13bin更复杂的触控功能定义
if(task1_flag==1)//多任务中 本任务可执行一次标记
{
task1_flag=0;
read_dgusii_vp( 0x0016,(u8 *)datavp,4);//读取0016变量按压状态
//D7:0x5A 表示触摸屏数据已经更新。 其他=触摸屏坐标未更新
//用户读取数据后可以写入≠0x5A 作标记, 只要不触摸, 标记不再更新。
//D6:触摸屏状态 0x00=松开 0x01=第一次按压0x02=抬起 0x03=按压中
//D5-D4=触摸屏按压的坐标位置 X 坐标
//D3-D2=触摸屏按压的坐标位置 Y 坐标
//D1-D0=0x0000
|
if(datavp[0]>>8==0x5a)
{
LocalX=datavp[1];//记录触摸坐标x
LocalY=datavp[2];];//记录触摸坐标y
datavp[0] =0x00ff;write_dgusii_vp(0x0016, (u8*)&datavp[0] ,1); //清除坐标更新标记
datavp[4] =0x0030;
datavp[5] =0x0004;
//if (LocalX+33>480)datavp[1]=480-33;//对处于屏幕边框附件的控件进行坐标补偿,提升体验,以480*272为例
//if LocalY]+33>272)datavp[2]=272-33;//对处于屏幕边框附件的控件进行坐标补偿,提升体验,以480*272为例
datavp[6] =datavp[1];
datavp[7] =datavp[2];
for (j=1;j<3;j++)//处理多个方块区域
{
temp= isInMatrix( LocalAX[j],LocalAY[j], 16, 16, LocalX,LocalY );//判断触控点是否在区域LocalAX[j],LocalAY[j] 半轴16, 16,范围内,可做成圆形判断或其他异形,LocalAX[j],LocalAY[j] 要预定义
if ((temp==0) && ( inflag[j] ==1 ))//表示划出
inflag[j]=0;//更新状态
}else if((temp==1) && ( inflag[j] ==0 )) //划入或点击
{ read_dgusii_vp( VPA[j],(u8*)&datavp[0],1);
//datavp[0]=1-datavp[0];//反转状态,示例点击的即时间操作,可替换成其他动作
// write_dgusii_vp( VPA[j] , (u8*)&datavp[0] ,1);//可替换成其他动作,记录按键被按压,请求主程序处理
inflag[j]=1;//更新状态
}
else
{
inflag[j]=temp;//
}
}
}
}
void Timer0_Rountine(void) interrupt 1
{
TL0 = 00; TH0= 00;
task1_flag=1;//触控检测每秒判断300次,此时间通常比任务运行最长时间要长,否则若任务中不反向检测代码运行时间,系统任务紊乱
}
u8 isInMatrix( u16 xM_16,u16 yM_16, u16 Rx_16, u16 Ry_16, u16 x,u16 y )
{
if (x< xM_16-Rx_16 ) return 0;
if (x> xM_16+Rx_16 ) return 0;
if (y< yM_16-Ry_16 ) return 0;
if (y> yM_16+Ry_16 ) return 0;
return 1;
}
|
|