OpenEdv-开源电子网

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

EMWIN触摸位置和鼠标显示差太多

[复制链接]

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2019-4-1
在线时间
33 小时
发表于 2021-3-14 17:15:18 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 う落丶枼 于 2021-3-14 17:21 编辑

我这手指点击的位置和鼠标显示的位置差的太多,我也不知道怎么回事。我把原子的例程修改了一下,屏幕反过来显示了,又把触摸方向改了,结果就变成这样子了。有没有人知道怎么回事???
D%JNH(FJ[[7PSVW{XO}VOXK.png
int  GUI_TOUCH_X_MeasureX(void)
{
        int32_t xvalue;
        if((lcddev.id == 0X5510) || (lcddev.id == 0X1963)) //电容屏的触摸值获取(使用NT5510和SSD1963芯片的4.3寸和7寸屏都是电容屏)
        {
                tp_dev.scan(0);
                xvalue=tp_dev.x[0];
                return xvalue;
        }else                                //电阻屏
        {
                return 4095 - TP_Read_XOY(0X90);  //CMD_RDX=0XD0
        }
}

int  GUI_TOUCH_X_MeasureY(void)
{
        int32_t yvalue;
        if((lcddev.id == 0X5510) || (lcddev.id == 0X1963))//电容屏的触摸值获取(使用NT5510和SSD1963芯片的4.3寸和7寸屏都是电容屏)
        {
                tp_dev.scan(0);
                yvalue = tp_dev.y[0];
                return yvalue;
        }else                                //电阻屏
        {
                return 4095 - TP_Read_XOY(0XD0);  //CMD_RDX=0XD0
        }
}









最佳答案

查看完整内容[请看2#楼]

电阻屏?要校准的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2019-11-27
在线时间
87 小时
发表于 2021-3-14 17:15:19 | 显示全部楼层
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2019-4-1
在线时间
33 小时
 楼主| 发表于 2021-3-14 17:16:13 | 显示全部楼层
期待大神给我说一下
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2019-4-1
在线时间
33 小时
 楼主| 发表于 2021-3-17 21:43:21 | 显示全部楼层
Cheng0717 发表于 2021-3-14 17:15
电阻屏?要校准的

//触摸屏校准代码
//得到四个校准参数
void TP_Adjust(void)
{
        u16 pos_temp[4][2];//坐标缓存值
        u8  cnt=0;       
        u16 d1,d2;
        u32 tem1,tem2;
        double fac;        
        u16 outtime=0;
        cnt=0;                               
        POINT_COLOR=BLUE;
        BACK_COLOR =WHITE;
        LCD_Clear(WHITE);//清屏   
        POINT_COLOR=RED;//红色
        LCD_Clear(WHITE);//清屏           
        POINT_COLOR=BLACK;
        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秒钟没有按下,则自动退出
        {
                tp_dev.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)
                        {                          
                                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:         //全部四个点已经得到
                                //对边相等
                                        tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
                                        tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,2的距离
                                       
                                        tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
                                        tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到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);//显示数据   
                                                continue;
                                        }
                                        tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
                                        tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,3的距离
                                       
                                        tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
                                        tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到2,4的距离
                                        fac=(float)d1/d2;
                                        if(fac<0.95||fac>1.05)//不合格
                                        {
                                                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);//显示数据   
                                                continue;
                                        }//正确了
                                                                  
                                        //对角线相等
                                        tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
                                        tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,4的距离
       
                                        tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
                                        tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到2,3的距离
                                        fac=(float)d1/d2;
                                        if(fac<0.95||fac>1.05)//不合格
                                        {
                                                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);//显示数据   
                                                continue;
                                        }//正确了
                                        //计算结果
                                        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
                                                  
                                        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;
                 }
        }
}
是使用这个校准的吗?
//主函数
int main(void)
{
        delay_init();                      //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                              //LED端口初始化
        KEY_Init();                                     //按键初始化
        TFTLCD_Init();                          //LCD初始化       
        TP_Init();                                    //触摸屏初始化
        FSMC_SRAM_Init();                  //初始化SRAM
        TIM3_Int_Init(999,71);  //1KHZ 定时器1ms
        TIM6_Int_Init(999,719);        //10ms中断
       
        TP_Adjust();
       
        my_mem_init(SRAMIN);                 //初始化内部内存池
        my_mem_init(SRAMEX);    //初始化外部内存池
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE); //使能CRC时钟,否则STemWin不能使用
        GUI_Init();
       
        GUI_CURSOR_Show();      //显示鼠标
        while(1)
        {
                EMWIN_Framewin_self();
                while(KEY_Scan(0) != 1);
        }
}
我用这个校准完了以后还是不行呀
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2019-4-1
在线时间
33 小时
 楼主| 发表于 2021-3-17 21:45:51 | 显示全部楼层
Cheng0717 发表于 2021-3-14 17:15
电阻屏?要校准的

是电阻屏,原子的2.8寸电阻屏
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2019-4-1
在线时间
33 小时
 楼主| 发表于 2021-3-17 22:09:02 | 显示全部楼层
我用例程也只有下半部分对的准确,越向上滑箭头的垂直高度就差的越多,水平的都一直对齐的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 08:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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