触摸屏校准算法.docx
- 文档编号:27593399
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:13
- 大小:22.46KB
触摸屏校准算法.docx
《触摸屏校准算法.docx》由会员分享,可在线阅读,更多相关《触摸屏校准算法.docx(13页珍藏版)》请在冰豆网上搜索。
触摸屏校准算法
超牛2.8寸触摸屏校准算法~非常的准.跟LCD坐标对称
发布:
2009-7-3022:
48|作者:
AVR侠|来源:
PowerAVR电子DIY网
#include
#include"ads7843drv.h"
#include"stm32f10x_lib.h"
//====================================================================================
typedef structPOINT
{
unsignedshortx。
unsignedshorty。
}coordinate。
typedefstructMatrix{
longdouble An,
Bn,
Cn,
Dn,
En,
Fn,
Divider。
}matrix。
voidDelayus(intk>
{
intj。
for(j=k。
j>0。
j-->。
}
//====================================================================================
voidTP_Init(void>
{
//IODIR1=0x00。
// IODIR1=IODIR1|MASK_CS|MASK_DCLK|MASK_DIN。
GPIO_InitTypeDefGPIO_InitStructure。
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP。
//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz。
GPIO_Init(GPIOA,&GPIO_InitStructure>。
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD。
GPIO_Init(GPIOB,&GPIO_InitStructure>。
}
//====================================================================================
staticvoidWR_CMD(unsignedcharcmd>
{
unsignedcharbuf。
unsignedchari。
TP_CS(1>。
TP_DIN(0>。
TP_DCLK(0>。
TP_CS(0>。
for(i=0。
i<8。
i++>
{
buf=(cmd>>(7-i>>&0x1。
TP_DIN(buf>。
Delayus(5>。
TP_DCLK(1>。
Delayus(5>。
TP_DCLK(0>。
}
}
//====================================================================================
staticunsignedshortRD_AD(void>
{
unsignedshortbuf=0,temp。
unsignedchari。
TP_DIN(0>。
TP_DCLK(1>。
for(i=0。
i<12。
i++>
{
Delayus(5>。
TP_DCLK(0>。
Delayus(5>。
temp=(TP_DOUT>?
1:
0。
buf|=(temp<<(11-i>>。
Delayus(5>。
TP_DCLK(1>。
}
TP_CS(1>。
buf&=0x0fff。
return(buf>。
}
//====================================================================================
intRead_X(void>
{
inti。
WR_CMD(CHX>。
//while(TP_BUSY>。
Delayus(5>。
i=RD_AD(>。
returni。
}
//====================================================================================
intRead_Y(void>
{
inti。
WR_CMD(CHY>。
//while(TP_BUSY>。
Delayus(5>。
i=RD_AD(>。
returni。
}
//====================================================================================
voidTP_GetAdXY(int*x,int*y>
{
intadx,ady。
adx=Read_X(>。
ady=Read_Y(>。
*x=adx。
*y=ady。
}
voidTP_DrawPoint(u8x,u16y>
{
if(x>220&&y<12>
{
Lcd_Clear(0xffff>。
}else
{
DrawPixel(x,y,0xf800>。
//中心点
DrawPixel(x+1,y,0xf800>。
DrawPixel(x,y+1,0xf800>。
DrawPixel(x+1,y+1,0xf800>。
}
}
externintTP_X[1],TP_Y[1]。
#define VALUE3 //差值
coordinate*Read_Ads7846(void>
{
coordinate Screen。
intm0,m1,m2。
u8count=0。
u16databuffer[2][9]={{0},{0}}。
//数据组
u16temp[3]。
do //循环读数9次
{
TP_GetAdXY(TP_X,TP_Y>。
databuffer[0][count]=TP_X[0]。
//X
databuffer[1][count]=TP_Y[0]。
count++。
}
while(count<9>。
if(count==9>//一定要读到9次数据,否则丢弃
{
temp[0]=(databuffer[0][0]+databuffer[0][1]+databuffer[0][2]>/3。
temp[1]=(databuffer[0][3]+databuffer[0][4]+databuffer[0][5]>/3。
temp[2]=(databuffer[0][6]+databuffer[0][7]+databuffer[0][8]>/3。
m0=temp[0]-temp[1]。
m1=temp[1]-temp[2]。
m2=temp[2]-temp[0]。
m0=m0>0?
m0
-m0>。
m1=m1>0?
m1
-m1>。
m2=m2>0?
m2
-m2>。
if(m0>VALUE&&m1>VALUE&&m2>VALUE>return0。
if(m0
elseScreen.x=(temp[0]+temp[1]>/2。
}
elseif(m2
elseScreen.x=(temp[1]+temp[2]>/2。
temp[0]=(databuffer[1][0]+databuffer[1][1]+databuffer[1][2]>/3。
temp[1]=(databuffer[1][3]+databuffer[1][4]+databuffer[1][5]>/3。
temp[2]=(databuffer[1][6]+databuffer[1][7]+databuffer[1][8]>/3。
m0=temp[0]-temp[1]。
m1=temp[1]-temp[2]。
m2=temp[2]-temp[0]。
m0=m0>0?
m0
-m0>。
m1=m1>0?
m1
-m1>。
m2=m2>0?
m2
-m2>。
if(m0>VALUE&&m1>VALUE&&m2>VALUE>return0。
if(m0
elseScreen.y=(temp[0]+temp[1]>/2。
}
elseif(m2
elseScreen.y=(temp[1]+temp[2]>/2。
return&Screen。
}
return0。
}
//只有在LCD和触摸屏间的误差角度非常小时,才能运用上面公式
//3个采样点必须不太靠近触摸屏边缘,他们的间隔必须足够大->
//液晶屏上的采样点
coordinateScreenSample[3]= {
{712,911},
{3234,898},
{2318,3058}
}。
//LCD上对应的点
coordinateDisplaySample[3]= {
{45,45},
{45,270},
{190,190}
}。
/*
定义2个变量
matrixmatrix。
coordinate display。
setCalibrationMatrix(&DisplaySample[0],&ScreenSample[0],&matrix>。
//送入值得到参数
getDisplayPoint(&display,Read_Ads7846(>,&matrix>。
display.xdisplay.y 就是所的到的数字 */
unsignedcharsetCalibrationMatrix(coordinate*displayPtr,
coordinate*screenPtr,
matrix*matrixPtr>
{
unsignedchar retValue=0。
matrixPtr->Divider=((screenPtr[0].x-screenPtr[2].x>*(screenPtr[1].y-screenPtr[2].y>>-
((screenPtr[1].x-screenPtr[2].x>*(screenPtr[0].y-screenPtr[2].y>>。
if(matrixPtr->Divider==0>
{
retValue=1。
}
else
{
matrixPtr->An=((displayPtr[0].x-displayPtr[2].x>*(screenPtr[1].y-screenPtr[2].y>>-
((displayPtr[1].x-displayPtr[2].x>*(screenPtr[0].y-screenPtr[2].y>>。
matrixPtr->Bn=((screenPtr[0].x-screenPtr[2].x>*(displayPtr[1].x-displayPtr[2].x>>-
((displayPtr[0].x-displayPtr[2].x>*(screenPtr[1].x-screenPtr[2].x>>。
matrixPtr->Cn=(screenPtr[2].x*displayPtr[1].x-screenPtr[1].x*displayPtr[2].x>*screenPtr[0].y+
(screenPtr[0].x*displayPtr[2].x-screenPtr[2].x*displayPtr[0].x>*screenPtr[1].y+
(screenPtr[1].x*displayPtr[0].x-screenPtr[0].x*displayPtr[1].x>*screenPtr[2].y。
matrixPtr->Dn=((displayPtr[0].y-displayPtr[2].y>*(screenPtr[1].y-screenPtr[2].y>>-
((displayPtr[1].y-displayPtr[2].y>*(screenPtr[0].y-screenPtr[2].y>>。
matrixPtr->En=((screenPtr[0].x-screenPtr[2].x>*(displayPtr[1].y-displayPtr[2].y>>-
((displayPtr[0].y-displayPtr[2].y>*(screenPtr[1].x-screenPtr[2].x>>。
matrixPtr->Fn=(screenPtr[2].x*displayPtr[1].y-screenPtr[1].x*displayPtr[2].y>*screenPtr[0].y+
(screenPtr[0].x*displayPtr[2].y-screenPtr[2].x*displayPtr[0].y>*screenPtr[1].y+
(screenPtr[1].x*displayPtr[0].y-screenPtr[0].x*displayPtr[1].y>*screenPtr[2].y。
}
return(retValue>。
}
unsignedchargetDisplayPoint(coordinate*displayPtr,
coordinate*screenPtr,
matrix*matrixPtr>
{
unsignedchar retValue=0。
if(matrixPtr->Divider!
=0>
{
displayPtr->x=((matrixPtr->An*screenPtr->x>+
(matrixPtr->Bn*screenPtr->y>+
matrixPtr->Cn
>/matrixPtr->Divider。
displayPtr->y=((matrixPtr->Dn*screenPtr->x>+
(matrixPtr->En*screenPtr->y>+
matrixPtr->Fn
>/matrixPtr->Divider。
}
else
{
retValue=1。
}
return(retValue>。
}/*endofgetDisplayPoint(>*/b5E2RGbCAP
AVR侠(2009-7-3022:
51:
51>
调用的时候在主函数中加入
TP_Init(>。
setCalibrationMatrix(&DisplaySample[0],&ScreenSample[0],&mat>。
//送入值得到参数
while(1>
{
getDisplayPoint(&display,Read_Ads7846(>,&mat>。
TP_DrawPoint(display.x,display.y>。
}
就是初始化时候会有干扰...会自己打几个点p1EanqFDPw
AVR侠(2009-7-3023:
08:
31>
工程文件~~~~~~
STM32.rar
(2009-07-3023:
08:
31,Size:
2.67MB,Downloads:
359>DXDiTa9E3d
PowerAVR(2009-7-3023:
48:
26>
谢谢楼主的分享.
wxmtwfx(2009-7-3116:
30:
14>
工程无法运行
一直在BKPT 0XAB
我的CPU是103RE
otw518(2009-7-3117:
24:
52>
跟着大虾跑,爽呀!
AVR侠(2009-8-0112:
52:
47>
[i=s]本帖最后由AVR侠于2009-8-201:
04编辑
校准算法原理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触摸屏 校准 算法