OpenEdv-开源电子网

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

mini 板触摸屏实验

[复制链接]

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2013-8-1 14:46:50 | 显示全部楼层 |阅读模式
//触摸屏校准代码
//得到四个校准参数
void Touch_Adjust(void)
{  
signed short pos_temp[4][2];//坐标缓存值
u8  cnt=0;
u16 d1,d2;
u32 tem1,tem2;
float fac;   
cnt=0;
POINT_COLOR=BLUE;
BACK_COLOR =WHITE;
LCD_Clear(WHITE);//清屏   
POINT_COLOR=RED;//红色 
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);//画点1 
Pen_Point.Key_Sta=Key_Up;//消除触发信号 
Pen_Point.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误
// Pen_Point.yfac=0; 
while(1)
{
if(Pen_Point.Key_Sta==Key_Down)//按键按下了
{
if(Read_TP_Once())//得到单次按键值
{     
pos_temp[cnt][0]=Pen_Point.X;
pos_temp[cnt][1]=Pen_Point.Y;
cnt++;
}  
switch(cnt)
{   
case 1:
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(220,20);//画点2
break;
case 2:
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,300);//画点3
break;
case 3:
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(220,300);//画点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的距离,sqrt是开平方根函数
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;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
ADJ_INFO_SHOW("ver fac is:");   
LCD_ShowNum(40+24,40,pos_temp[0][0],4,16); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,16); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,16); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,16); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,16); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,16); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,16); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,16); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,16);//显示数值,该数值必须在95~105范围之内.
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;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
ADJ_INFO_SHOW("hor fac is:");   
LCD_ShowNum(40+24,40,pos_temp[0][0],4,16); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,16); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,16); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,16); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,16); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,16); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,16); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,16); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,16);//显示数值,该数值必须在95~105范围之内.
  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;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
ADJ_INFO_SHOW("dia fac is:");   
LCD_ShowNum(40+24,40,pos_temp[0][0],4,16); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,16); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,16); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,16); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,16); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,16); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,16); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,16); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,16);//显示数值,该数值必须在95~105范围之内.
continue;
}//正确了
//计算结果
Pen_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac  
Pen_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff
 
Pen_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
Pen_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  

if(abs(Pen_Point.xfac)>2||abs(Pen_Point.yfac)>2)//触屏和预设的相反了.
{
cnt=0;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
LCD_ShowString(35,110,"TP Need readjust!");
Pen_Point.touchtype=!Pen_Point.touchtype;//修改触屏类型.
if(Pen_Point.touchtype)//X,Y方向与屏幕相反
{
CMD_RDX=0X90;
CMD_RDY=0XD0;  
}else   //X,Y方向与屏幕相同
{
CMD_RDX=0XD0;
CMD_RDY=0X90;  
}
delay_ms(500);
continue;
}
POINT_COLOR=BLUE;
LCD_Clear(WHITE);//清屏
LCD_ShowString(35,110,"Touch Screen Adjust OK!");//校正完成
delay_ms(500);
LCD_Clear(WHITE);//清屏   
return;//校正完成  
}
}
}
上面
红色字体描述的东西不是很懂额,这个fac是在0.95~1.05之间呢    
天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-1 21:52:57 | 显示全部楼层
回复【楼主位】xly0907:
---------------------------------
fac是d1/d2的比值。
d1,d2理论上应该相等才对,那么理论上fac的最佳值是1.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
 楼主| 发表于 2013-8-2 13:00:47 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哦 ,明白了  谢谢
天道酬勤
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
 楼主| 发表于 2013-8-8 14:54:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,还有一个问题哦
//保存校准参数     
void Save_Adjdata(void)
{
s32 temp;  
//保存校正结果!       
temp=Pen_Point.xfac*100000000;//保存x校正因素      
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE,temp,4);   
temp=Pen_Point.yfac*100000000;//保存y校正因素    
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+4,temp,4);
//保存x偏移量
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+8,Pen_Point.xoff,2);     
//保存y偏移量
AT24CXX_WriteLenByte(SAVE_ADDR_BASE+10,Pen_Point.yoff,2);
//保存触屏类型
AT24CXX_WriteOneByte(SAVE_ADDR_BASE+12,Pen_Point.touchtype);
temp=0X0A;//标记校准过了
AT24CXX_WriteOneByte(SAVE_ADDR_BASE+13,temp);  
}
在这个保存校验参数的函数里面为什么    xfac和yfac要乘以100000000呢?
天道酬勤
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 14:57:05 | 显示全部楼层
回复【4楼】xly0907:
---------------------------------
转换为整型啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2013-10-31 12:17:51 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥 这里是怎么知道要乘以100000000转换成整形,乘以10000000就不行了呢?是不是之前大致知道它有几位小数的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-31 14:34:59 | 显示全部楼层
取这么多精度,足够用了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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