OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2374|回复: 0

mini电阻屏 ,屏幕校正 四点校正

[复制链接]

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2020-4-3 11:40:25 | 显示全部楼层 |阅读模式
请问这个  触屏和预设的相反的     这个代码怎么理解啊?
tp_dev>xfac=lcd/adc    这个xfac会大于2啊。
if(abs(tp_dev.xfac)>2||abs(tp_dev.yfac)>2)//触屏和预设的相反了.
                                        {
                                                cnt=0;
                                            TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);        //清除点4
                                                    TP_Drow_Touch_Point(20,20,RED);                                                                //画点1
                                                LCD_ShowString(40,26,lcddev.width,lcddev.height,16,"TP Need readjust!");
                                                tp_dev.touchtype=!tp_dev.touchtype;//修改触屏类型.
                                                if(tp_dev.touchtype)//X,Y方向与屏幕相反
                                                {
                                                        CMD_RDX=0X90;
                                                        CMD_RDY=0XD0;         
                                                }
                                                else                                   //X,Y方向与屏幕相同
                                                {
                                                        CMD_RDX=0XD0;
                                                        CMD_RDY=0X90;         
                                                }                            
                                                continue;
                                        }               

请问这个


//触摸屏校准代码
//得到四个校准参数
void TP_Adjust(void)
{                                                                 
        u16 pos_temp[4][2];//坐标缓存值
        u8  cnt=0;       
        u16 d1,d2;
        u32 tem1,tem2;
        float fac;        
        u16 outtime=0;           
        LCD_Clear(WHITE);        //清屏             
        POINT_COLOR=BLUE;        //蓝色
        LCD_ShowString(40,40,160,100,16,(u8*)TP_REMIND_MSG_TBL);//显示提示信息
        TP_Drow_Touch_Point(20,20,RED);//画点1
        tp_dev.sta=0;//消除触发信号
        tp_dev.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误         
        while(1)//如果连续10秒钟没有按下,则自动退出
        {
        READJ:
                //tp_dev.scan(1);//扫描物理坐标
                TP_Scan(1);  //
                if((tp_dev.sta&0xc0)==TP_CATH_PRES)//按键按下了一次(此时按键松开了.)
                {       
                        outtime=0;               
                        tp_dev.sta&=~(1<<6);        //标记按键已经被处理过了.
                        pos_temp[cnt][0]=tp_dev.x[0];
                        pos_temp[cnt][1]=tp_dev.y[0];
                        cnt++;          
                        switch(cnt)
                        {                          

                        //        1        2
                        //        3        4
                                case 1:                                                 
                                        TP_Drow_Touch_Point(20,20,WHITE);                                //清除点1
                                        TP_Drow_Touch_Point(lcddev.width-20,20,RED);        //画点2
                                        break;
                                case 2:
                                        TP_Drow_Touch_Point(lcddev.width-20,20,WHITE);        //清除点2
                                        TP_Drow_Touch_Point(20,lcddev.height-20,RED);        //画点3
                                        break;
                                case 3:
                                        TP_Drow_Touch_Point(20,lcddev.height-20,WHITE);                        //清除点3
                                        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,RED);        //画点4
                                        break;                                                                                                                                                                                                                                                         
                                case 4:         //全部四个点已经得到
                                        for(cnt=0;cnt<3;cnt++)//计算三组点的距离是否在允许范围内?
                                        {
                                                tem1=abs(pos_temp[TP_ADJDIS_TBL[cnt][0]][0]-pos_temp[TP_ADJDIS_TBL[cnt][1]][0]);
                                                //x1-x2/x1-x3/x2-x3
                                                tem2=abs(pos_temp[TP_ADJDIS_TBL[cnt][0]][1]-pos_temp[TP_ADJDIS_TBL[cnt][1]][1]);
                                                //y1-y2/y1-y3/y2-y3
                                                tem1*=tem1;
                                                tem2*=tem2;
                                                d1=sqrt(tem1+tem2);//得到两点之间的距离
                                               
                                                tem1=abs(pos_temp[TP_ADJDIS_TBL[cnt][2]][0]-pos_temp[TP_ADJDIS_TBL[cnt][3]][0]);
                                                //x3-x4/x2-x4/x1-x4
                                                tem2=abs(pos_temp[TP_ADJDIS_TBL[cnt][2]][1]-pos_temp[TP_ADJDIS_TBL[cnt][3]][1]);
                                                //y3-y4/y2-y4/y1-y4
                                                tem1*=tem1;
                                                tem2*=tem2;
                                                d2=sqrt(tem1+tem2);//得到两点之间的距离

                                                //        1        2
                                                //        3        4
                                                fac=(float)d1/d2;
                                                if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格
                                                {
                                                        cnt=0;
                                                        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);        //清除点4
                                                        TP_Drow_Touch_Point(20,20,RED);                                                                        //画点1
                                                        TP_Adj_Info_Show(        pos_temp[0][0],pos_temp[0][1],
                                                                                                pos_temp[1][0],pos_temp[1][1],
                                                                                                pos_temp[2][0],pos_temp[2][1],
                                                                                                pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据   


                                                        goto READJ;        //不合格,重新校准
                                                }
                                        }  
                                        //正确了
                                        //计算结果
                                        tp_dev.xfac=(float)(lcddev.width-40)/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac                 
                                        tp_dev.xoff=(  lcddev.width-tp_dev.xfac*(pos_temp[1][0]+pos_temp[0][0])  )/2;//得到xoff
                                        //楼主我觉得误差值xoff 、 yoff解释有误,个人认为如下: 相对于X轴:
                                        //第一个LCD点阵理论值与你实际触摸点的误差 x1_err = 20 - xfac*pos_temp[0][0];
                                        //第二个LCD点阵理论值与你实际触摸点的误差 x2_err = (lcddev.width-20) - xfac*pos_temp[1][0];
                                        //那么这两个误差值求和,再平均即补偿值:
                                        //xoff = (x1_err + x2_err)/2 = (lcddev.width - xfac * (pos_temp[1][0] + pos_temp[0][0]))/2;.
                                        // 得到 xoff Y轴同样如此。



                                        tp_dev.yfac=(float)(lcddev.height-40)/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
                                        tp_dev.yoff=(lcddev.height-tp_dev.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  


                               
                                        if(abs(tp_dev.xfac)>2||abs(tp_dev.yfac)>2)//触屏和预设的相反了.
                                        {
                                                cnt=0;
                                            TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);        //清除点4
                                                    TP_Drow_Touch_Point(20,20,RED);                                                                //画点1
                                                LCD_ShowString(40,26,lcddev.width,lcddev.height,16,"TP Need readjust!");
                                                tp_dev.touchtype=!tp_dev.touchtype;//修改触屏类型.
                                                if(tp_dev.touchtype)//X,Y方向与屏幕相反
                                                {
                                                        CMD_RDX=0X90;
                                                        CMD_RDY=0XD0;         
                                                }
                                                else                                   //X,Y方向与屏幕相同
                                                {
                                                        CMD_RDX=0XD0;
                                                        CMD_RDY=0X90;         
                                                }                            
                                                continue;
                                        }               
                                        POINT_COLOR=BLUE;
                                        LCD_Clear(WHITE);//清屏
                                        LCD_ShowString(35,110,lcddev.width,lcddev.height,16,"Touch Screen Adjust OK!");//校正完成
                                        delay_ms(1000);
                                        TP_Save_Adjdata();  
                                        LCD_Clear(WHITE);//清屏   
                                        return;//校正完成                                 
                        }
                }
                delay_ms(10);
                outtime++;
                if(outtime>1000)
                {
                        TP_Get_Adjdata();
                        break;
                 }
        }
}          


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 16:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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