您的位置 首页 系统

STM32_Touch 总结

移植了奋斗的触摸屏程序,有一些地方还是没有搞懂,这个先把已经做好的记录下来。首先是触摸屏校准值,这个在后面有专门的校准函数,但是上…

移植了斗争的接触屏程序,有一些当地仍是没有搞懂,这个先把现已做好的记录下来。

首先是接触屏校准值,这个在后边有专门的校准函数,可是上电选用现已有的校准值进行操作。

C言语:Codee#18707
/*==================================================================
* Function : Touch_CalibrationValueAssignment
* Description : 接触屏校准系数 赋初值
* Input Para : None
* Output Para : void
* Return Value : None
==================================================================*/
voidTouch_CalibrationValueAssignment(void)
{
T_Adjust_X2=14.475;T_Adjust_Y2=10.7625;// 校准初始值
T_Adjust_Xs=3759;T_Adjust_Ys=3823;
// T_Adjust_Xe=2086;T_Adjust_Ye=2138; // 本比如不是有必要的,需要看电阻式接触屏的算法操控
}

然后是读取Xpt2046的接触屏值,运用的是stm32的硬件SPI进行读取

C言语:Codee#18708
/*==================================================================
* Function : TFT_Touch_Read_Once
* Description : TFT液晶接触屏 读取一次X,Y值,读到的X,Y坐标值有必要都大于100,读数约束在100~3800之间.
* Input Para : None
* Output Para : void
* Return Value : 成功回来1,不成功回来0
==================================================================*/
u8TFT_Touch_Read_Once(void)
{
unsignedinta,b;
TCS_SET(0);
Delay_Ms(1);// delay_us(5);
SPI1_SendByte(CMD_RDY);
Delay_Ms(1);//delay_us(5);
a=SPI1_ReadByte(0);
a=a<<8;
a|=SPI1_ReadByte(0);
Delay_Ms(1);//delay_us(5);
TCS_SET(1);
a>>=3;
T_1s_Y=a;// 取得Y轴一次测量值
//——————————-
Delay_Ms(1);//delay_us(15);
TCS_SET(0);
Delay_Ms(1);//delay_us(5);
SPI1_SendByte(CMD_RDX);
Delay_Ms(1);//delay_us(5);
b=SPI1_ReadByte(0);
b=b<<8;
b|=SPI1_ReadByte(0);
Delay_Ms(1);//delay_us(5);
b>>=3;
T_1s_X=b;// 取得X轴一次测量值

TCS_SET(1);
if(b>100&&a>100&&b<4000&&a<4000)return1;//读数成功(规模约束)
elsereturn0;//读数失利
}

然后是屡次读取,而且把读取到的值和TFT的份额进行匹配,在代码里能够看到,先是读取了10次并摆放好,在差错规模答应的情况下取平均值作为读取的数值,终究依据校准值把读取值批改成和TFT匹配的坐标值。

C言语:Codee#18709
/*==================================================================
* Function : Read_Tsc2046
* Description : 取得终究的校准X,Y的坐标
* Input Para : None
* Output Para : void
* Return Value : None
==================================================================*/
voidRead_Tsc2046(void)
{
floatX1,Y1;
u16x1,x2,y1,y2;
u8t,t1,count=0;
u16databuffer[2][10];//数据组
u16temp=0;
do//循环读数10次
{
if(TFT_Touch_Read_Once())//读数成功
{
databuffer[0][count]=T_1s_X;
databuffer[1][count]=T_1s_Y;
count++;
}
t=PEN;
}while(!t&&count<10);// 确保按键有必要按下而且要接连采样10次
if(count==10)//必定要读到10次数据,不然丢掉
{
do//将数据X升序摆放
{
t1=0;
for(t=0;t{
if(databuffer[0][t]>databuffer[0][t+1])//升序摆放
{
temp=databuffer[0][t+1];
databuffer[0][t+1]=databuffer[0][t];
databuffer[0][t]=temp;
t1=1;
}
}
}while(t1);
do//将数据Y升序摆放
{
t1=0;
for(t=0;t{
if(databuffer[1][t]>databuffer[1][t+1])//升序摆放
{
temp=databuffer[1][t+1];
databuffer[1][t+1]=databuffer[1][t];
databuffer[1][t]=temp;
t1=1;
}
}
}while(t1);
x1=databuffer[0][3];x2=databuffer[0][4];
y1=databuffer[1][3];y2=databuffer[1][4];
if(((x1>x2)&&(x1>x2+30))||((x2>x1)&&(x2>x1+30))||((y1>y2)&&(y1>y2+30))||((y2>y1)&&(y2>y1+30)));
else
{
X1=(databuffer[0][3]+databuffer[0][4])/2;//假如颤动值不超越规模则取两个中心值来求均值
Y1=(databuffer[1][3]+databuffer[1][4])/2;

if(X1<=4096&&Y1<=4096)//个人的屏依据初始参数修正. 正常
{
if(TFT_Get_Calibration_EN)// 把读取的数据直接运用,在校准TFT时分用
{
T_Fixed_X=X1;
T_Fixed_Y=Y1;
}
else// 把读取的数据转换成和TFT的坐标份额相同的坐标点(即240*320),方便运用.
{
if(X1>=T_Adjust_Xs)
{X1=0;}
else
{X1=T_Adjust_Xs-X1;}
//if(Y1>=Ys)Y1-=Ys;
//else Y1=0;
if(Y1<=T_Adjust_Ys)
{Y1=T_Adjust_Ys-Y1;}
else
{Y1=0;}
//X2=Xs-Xe; X2=X2/240;
//Y2=Ye-Ys; Y2=Y2/320;
T_Fixed_X=X1/T_Adjust_X2;
T_Fixed_Y=Y1/T_Adjust_Y2;
}
}
}
}
}

终究是接触校准的代码

C言语:Codee#18710
/*==================================================================
* Function : Get_Calibration_Value
* Description : 获取校准值,经过接触从头找到校准值
* Input Para : None
* Output Para : void
* Return Value : None
#####本代码仅仅获取校准值,并没有将校准值运用,后续程序能够上电从EEPROM里读取校准值,然后在本函数里获取新值后改写EEPEOM.
==================================================================*/
voidGet_Calibration_Value(void)
{
floatX2,Y2 ;// 校准值暂时变量,假如不供给暂时变量,会导致获取第二点失利,认为校准值是大局的,必定要在终究修正
unsignedintXs,Ys,Xe,Ye;

TFT_Get_Calibration_EN=1;// 进入接触屏校准状况

//===================================================== 捕捉第一点,屏幕左上角原点(0,0)点
Clear_WindowWithColor(WHITE);// 清屏
TFT_WriteMixedString(H5,ZL5,RED,0,RED,”请按下第一点”);

Display_RectangleWithColor(0,10,0,2,RED);// 画十字线
Display_RectangleWithColor(0,2,0,10,RED);

while(1)// 进入辨认第一点
{
if(Touch_EN)// 有键按下
{
Delay_Ms(50);
if(PEN==0)
{
Read_Tsc2046();
Xs=T_Fixed_X;
Ys=T_Fixed_Y;
Clear_TouchPoint();
break;
}
else
{Touch_EN=0;}
}
}

//====================================================== 捕捉第二点,屏幕中心点(120,160)点
Clear_WindowWithColor(WHITE);// 清屏
TFT_WriteMixedString(H5,ZL5,RED,0,RED,”请按下第二点”);

Display_RectangleWithColor(110,130,159,161,RED);// 画十字线
Display_RectangleWithColor(119,121,150,170,RED);

while(1)
{
if(Touch_EN)
{
Delay_Ms(260);// 这个延时要比上一个要长,避免按一次,把两次都辨认了
if(PEN==0)
{
Read_Tsc2046();
Xe=T_Fixed_X;
Ye=T_Fixed_Y;
Clear_TouchPoint();
break;
}
else
{Touch_EN=0;}
}
}

//====================================================== 经过两点组成方程求得校准值
X2=Xs-Xe;X2=X2/120;
Y2=Ys-Ye;Y2=Y2/160;

//====================================================== 终究赋值大局变量,改动校准值
T_Adjust_X2=X2;T_Adjust_Y2=Y2;
T_Adjust_Xs=Xs;T_Adjust_Ys=Ys;
T_Adjust_Xe=Xe;T_Adjust_Ye=Ye;

TFT_Get_Calibration_EN=0;// 退出接触屏校准状况

TFT_WriteMixedString(H15,ZL4,BLUE,1,YELLOW,”TFT-Touch 校准结束”);
}


这里有两个问题没有搞清楚:

1,读取值 ,校准值 ,匹配值 的核算联系;

2,校准值 的核算方程,原理看datasheet到是理解些,详细核算不是很清楚。

后边还计划自己做4.3寸和7寸的TFT,这个仍是要搞理解的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/252225.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部