Selamlar,
STM32F4 Discovery ile SSD1963 çipli bir ekran sürüyorum. Dokunmatik çipi XPT2046, ADS7846 ile uyumlu. Dokunmatik kütüphanesi 3.2" lik xpt2046 kullanan ekranda doğru çalışırken 7" de dokunulan nokta hatalı bulunuyor. ekranın çok ufak bir kısmında doğru koordinat bulunabiliyor.
Kalibrasyon matrix'i hesaplanırken ekranda 3 referans noktasına dokunuluyor ve normalizasyon yapılıyor, nette dolanan standart kodlar.
Gördüğüm kadarıyla belirlenen 3 referans noktası değiştiğinde dokumatik hassasiyeti düzelmeye başlıyor. 800x480 çözünürlükteki bir ekranda hangi noktaları seçmeliyim ki doğru çalışsın ?
kodlar aşağıda :
touchpanel.c
/*********************************************************************************************************
*
* File : TouchPanel.c
* Hardware Environment:
* Build Environment : RealView MDK-ARM Version: 4.20
* Version : V1.0
* By :
*
* (c) Copyright 2005-2011, WaveShare
* http://www.waveshare.net
* All Rights Reserved
*
*********************************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "TouchPanel.h"
#include "Tpconfig.h"
#include "ssd1963.h"
/* Private variables ---------------------------------------------------------*/
Matrix matrix ;
Coordinate display ;
// Coordinate ScreenSample[3];
// Coordinate DisplaySample[3] = { { 45, 45 }, { 270, 90}, { 100,190} } ;
// Coordinate DisplaySample[3] = {{ 100, 50 }, { 700, 150}, { 400,400} } ;
Coordinate ScreenSample[3];
Coordinate DisplaySample[3] = { { 50, 50 },
{ 100, 100},
{ 200,200} } ;
// Coordinate DisplaySample[3] = { { 50, 45 },
// { 700, 200},
// { 400,420} } ;
/* Private define ------------------------------------------------------------*/
#define THRESHOLD 2
/*******************************************************************************
* Function Name : ADS7843_SPI_Init
* Description :
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
static void ADS7843_SPI_Init(void)
{
SPI_InitTypeDef SPI_InitStruct;
RCC_APB1PeriphClockCmd(Open_RCC_SPI,ENABLE);
SPI_I2S_DeInit(Open_SPI);
/* Open_SPI Config -------------------------------------------------------------*/
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(Open_SPI, &SPI_InitStruct);
SPI_Cmd(Open_SPI, ENABLE);
}
/*******************************************************************************
* Function Name : TP_Init
* Description :
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void TP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(Open_SPI_SCK_GPIO_CLK | Open_SPI_MISO_GPIO_CLK | Open_SPI_MOSI_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open_TP_CS_CLK | Open_TP_IRQ_CLK,ENABLE);
Open_SPI_CLK_INIT(Open_RCC_SPI,ENABLE);
GPIO_PinAFConfig(Open_SPI_SCK_GPIO_PORT, Open_SPI_SCK_SOURCE, Open_GPIO_AF_SPI);
GPIO_PinAFConfig(Open_SPI_MISO_GPIO_PORT, Open_SPI_MISO_SOURCE, Open_GPIO_AF_SPI);
GPIO_PinAFConfig(Open_SPI_MOSI_GPIO_PORT, Open_SPI_MOSI_SOURCE, Open_GPIO_AF_SPI);
GPIO_InitStructure.GPIO_Pin = Open_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open_SPI_MISO_PIN;
GPIO_Init(Open_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open_SPI_MOSI_PIN;
GPIO_Init(Open_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/* TP_CS */
GPIO_InitStructure.GPIO_Pin = Open_TP_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open_TP_CS_PORT, &GPIO_InitStructure);
/*TP_IRQ */
GPIO_InitStructure.GPIO_Pin = Open_TP_IRQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open_TP_IRQ_PORT, &GPIO_InitStructure);
TP_CS(1);
ADS7843_SPI_Init();
}
/*******************************************************************************
* Function Name : DelayUS
* Description :
* Input : - cnt:
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
static void DelayUS(vu32 cnt)
{
uint16_t i;
for(i = 0;i<cnt;i++)
{
uint8_t us = 12;
while (us--)
{
;
}
}
}
/*******************************************************************************
* Function Name : WR_CMD
* Description :
* Input : - cmd:
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
static void WR_CMD (uint8_t cmd)
{
/* Wait for SPI3 Tx buffer empty */
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_TXE) == RESET);
/* Send SPI3 data */
SPI_I2S_SendData(Open_SPI,cmd);
/* Wait for SPI3 data reception */
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Read Open_SPI received data */
SPI_I2S_ReceiveData(Open_SPI);
}
/*******************************************************************************
* Function Name : RD_AD
* Description :
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
static int RD_AD(void)
{
unsigned short buf,temp;
/* Wait for Open_SPI Tx buffer empty */
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_TXE) == RESET);
/* Send Open_SPI data */
SPI_I2S_SendData(Open_SPI,0x0000);
/* Wait for SPI3 data reception */
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Read Open_SPI received data */
temp=SPI_I2S_ReceiveData(Open_SPI);
buf=temp<<8;
DelayUS(1);
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_TXE) == RESET);
/* Send Open_SPI data */
SPI_I2S_SendData(Open_SPI,0x0000);
/* Wait for Open_SPI data reception */
while (SPI_I2S_GetFlagStatus(Open_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Read Open_SPI received data */
temp=SPI_I2S_ReceiveData(Open_SPI);
buf |= temp;
buf>>=3;
buf&=0xfff;
return buf;
}
/*******************************************************************************
* Function Name : Read_X
* Description : Read ADS7843 ADC X
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
int Read_X(void)
{
int i;
TP_CS(0);
DelayUS(1);
WR_CMD(CHX);
DelayUS(1);
i=RD_AD();
TP_CS(1);
return i;
}
/*******************************************************************************
* Function Name : Read_Y
* Description : Read ADS7843 ADC Y
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
int Read_Y(void)
{
int i;
TP_CS(0);
DelayUS(1);
WR_CMD(CHY);
DelayUS(1);
i=RD_AD();
TP_CS(1);
return i;
}
/*******************************************************************************
* Function Name : TP_GetAdXY
* Description : Read ADS7843
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
void TP_GetAdXY(int *x,int *y)
{
int adx,ady;
adx=Read_X();
DelayUS(1);
ady=Read_Y();
*x=adx;
*y=ady;
}
/*******************************************************************************
* Function Name : TP_DrawPoint
* Description :
* Input : - Xpos: Row Coordinate
* - Ypos: Line Coordinate
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void TP_DrawPoint(uint16_t Xpos,uint16_t Ypos)
{
SSD1963_LCD_DrawPoint(Xpos,Ypos); /* Center point */
SSD1963_LCD_DrawPoint(Xpos+1,Ypos);
SSD1963_LCD_DrawPoint(Xpos,Ypos+1);
SSD1963_LCD_DrawPoint(Xpos+1,Ypos+1);
}
/*******************************************************************************
* Function Name : DrawCross
* Description :
* Input : - Xpos: Row Coordinate
* - Ypos: Line Coordinate
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void DrawCross(uint16_t Xpos,uint16_t Ypos)
{
SSD1963_LCD_DrawLine(Xpos-15,Ypos,Xpos-2,Ypos);
SSD1963_LCD_DrawLine(Xpos+2,Ypos,Xpos+15,Ypos);
SSD1963_LCD_DrawLine(Xpos,Ypos-15,Xpos,Ypos-2);
SSD1963_LCD_DrawLine(Xpos,Ypos+2,Xpos,Ypos+15);
SSD1963_LCD_DrawLine(Xpos-15,Ypos+15,Xpos-7,Ypos+15);
SSD1963_LCD_DrawLine(Xpos-15,Ypos+7,Xpos-15,Ypos+15);
SSD1963_LCD_DrawLine(Xpos-15,Ypos-15,Xpos-7,Ypos-15);
SSD1963_LCD_DrawLine(Xpos-15,Ypos-7,Xpos-15,Ypos-15);
SSD1963_LCD_DrawLine(Xpos+7,Ypos+15,Xpos+15,Ypos+15);
SSD1963_LCD_DrawLine(Xpos+15,Ypos+7,Xpos+15,Ypos+15);
SSD1963_LCD_DrawLine(Xpos+7,Ypos-15,Xpos+15,Ypos-15);
SSD1963_LCD_DrawLine(Xpos+15,Ypos-15,Xpos+15,Ypos-7);
}
/*******************************************************************************
* Function Name : Read_Ads7846
* Description : Get TouchPanel X Y
* Input : None
* Output : None
* Return : Coordinate *
* Attention : None
*******************************************************************************/
Coordinate *Read_Ads7846(void)
{
static Coordinate screen;
int m0,m1,m2,TP_X[1],TP_Y[1],temp[3];
uint8_t count=0;
int buffer[2][9]={{0},{0}};
do
{
TP_GetAdXY(TP_X,TP_Y);
buffer[0][count]=TP_X[0];
buffer[1][count]=TP_Y[0];
count++;
}
while(!TP_INT_IN&& count<9); /* TP_INT_IN */
if(count==9) /* Average X Y */
{
/* Average X */
temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;
temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;
temp[2]=(buffer[0][6]+buffer[0][7]+buffer[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>THRESHOLD && m1>THRESHOLD && m2>THRESHOLD ) return 0;
if(m0<m1)
{
if(m2<m0)
screen.x=(temp[0]+temp[2])/2;
else
screen.x=(temp[0]+temp[1])/2;
}
else if(m2<m1)
screen.x=(temp[0]+temp[2])/2;
else
screen.x=(temp[1]+temp[2])/2;
/* Average Y */
temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;
temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;
temp[2]=(buffer[1][6]+buffer[1][7]+buffer[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>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD) return 0;
if(m0<m1)
{
if(m2<m0)
screen.y=(temp[0]+temp[2])/2;
else
screen.y=(temp[0]+temp[1])/2;
}
else if(m2<m1)
screen.y=(temp[0]+temp[2])/2;
else
screen.y=(temp[1]+temp[2])/2;
return &screen;
}
return 0;
}
/*******************************************************************************
* Function Name : setCalibrationMatrix
* Description : Calculate K A B C D E F
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
FunctionalState setCalibrationMatrix( Coordinate * displayPtr,
Coordinate * screenPtr,
Matrix * matrixPtr)
{
FunctionalState retTHRESHOLD = ENABLE ;
/* K£½(X0£X2) (Y1£Y2)£(X1£X2) (Y0£Y2) */
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 )
{
retTHRESHOLD = DISABLE;
}
else
{
/* A£½((XD0£XD2) (Y1£Y2)£(XD1£XD2) (Y0£Y2))£¯K */
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)) ;
/* B£½((X0£X2) (XD1£XD2)£(XD0£XD2) (X1£X2))£¯K */
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)) ;
/* C£½(Y0(X2XD1£X1XD2)+Y1(X0XD2£X2XD0)+Y2(X1XD0£X0XD1))£¯K */
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 ;
/* D£½((YD0£YD2) (Y1£Y2)£(YD1£YD2) (Y0£Y2))£¯K */
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)) ;
/* E£½((X0£X2) (YD1£YD2)£(YD0£YD2) (X1£X2))£¯K */
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)) ;
/* F£½(Y0(X2YD1£X1YD2)+Y1(X0YD2£X2YD0)+Y2(X1YD0£X0YD1))£¯K */
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( retTHRESHOLD ) ;
}
/*******************************************************************************
* Function Name : getDisplayPoint
* Description : Touch panel X Y to display X Y
* Input : None
* Output : None
* Return :
* Attention : None
*******************************************************************************/
FunctionalState getDisplayPoint(Coordinate * displayPtr,
Coordinate * screenPtr,
Matrix * matrixPtr )
{
FunctionalState retTHRESHOLD =ENABLE ;
if( matrixPtr->Divider != 0 )
{
/* XD = AX+BY+C */
displayPtr->x = ( (matrixPtr->An * screenPtr->x) +
(matrixPtr->Bn * screenPtr->y) +
matrixPtr->Cn
) / matrixPtr->Divider ;
/* YD = DX+EY+F */
displayPtr->y = ( (matrixPtr->Dn * screenPtr->x) +
(matrixPtr->En * screenPtr->y) +
matrixPtr->Fn
) / matrixPtr->Divider ;
}
else
{
retTHRESHOLD = DISABLE;
}
return(retTHRESHOLD);
}
/*******************************************************************************
* Function Name : delay_ms
* Description : Delay Time
* Input : - cnt: Delay Time
* Output : None
* Return : None
* Return : None
* Attention : None
*******************************************************************************/
static void delay_ms(uint16_t ms)
{
uint16_t i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 0xffff; j++ );
}
}
/*******************************************************************************
* Function Name : TouchPanel_Calibrate
* Description :
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void TouchPanel_Calibrate(void)
{
uint8_t i;
Coordinate * Ptr;
int8_t temp[20]={0};
for(i=0;i<3;i++)
{
SSD1963_LCD_Clear(BLACK);
SSD1963_LCD_ShowString(44,10,"Touch crosshair to calibrate");
delay_ms(300);
DrawCross(DisplaySample[i].x,DisplaySample[i].y);
do
{
Ptr=Read_Ads7846();
}
while( Ptr == (void*)0 );
ScreenSample[i].x= Ptr->x; ScreenSample[i].y= Ptr->y;
// sprintf(temp,"X:%4d,Y:%4d",ScreenSample[i].x,ScreenSample[i].y);
// SSD1963_LCD_ShowString(10,80,(uint8_t*)temp);
}
setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix );
SSD1963_LCD_Clear(BLACK);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
touchpanel.h
/*********************************************************************************************************
*
* File : TouchPanel.h
* Hardware Environment:
* Build Environment : RealView MDK-ARM Version: 4.20
* Version : V1.0
* By :
*
* (c) Copyright 2005-2011, WaveShare
* http://www.waveshare.net
* All Rights Reserved
*
*********************************************************************************************************/
#ifndef _TOUCHPANEL_H_
#define _TOUCHPANEL_H_
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
/* Private typedef -----------------------------------------------------------*/
typedef struct POINT
{
uint16_t x;
uint16_t y;
}Coordinate;
typedef struct Matrix
{
long double An,
Bn,
Cn,
Dn,
En,
Fn,
Divider ;
} Matrix ;
/* Private variables ---------------------------------------------------------*/
extern Coordinate ScreenSample[3];
extern Coordinate DisplaySample[3];
extern Matrix matrix ;
extern Coordinate display ;
/* Private define ------------------------------------------------------------*/
#define CHX 0x90
#define CHY 0xd0
/* Private function prototypes -----------------------------------------------*/
void TP_Init(void);
Coordinate *Read_Ads7846(void);
void TouchPanel_Calibrate(void);
void DrawCross(uint16_t Xpos,uint16_t Ypos);
void TP_DrawPoint(uint16_t Xpos,uint16_t Ypos);
FunctionalState setCalibrationMatrix( Coordinate * displayPtr,Coordinate * screenPtr,Matrix * matrixPtr);
FunctionalState getDisplayPoint(Coordinate * displayPtr,Coordinate * screenPtr,Matrix * matrixPtr );
#endif
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
tpconfig.h
#ifndef _CONFIG_H
#define _CONFIG_H
#include <stdio.h>
#include "stm32f4xx.h"
/**
* @brief Definition for TouchPanel
*/
/* Configure TouchPanel pins: TP_CS-> PC4 and TP_IRQ-> PC5 */
#define Open_TP_CS_PIN GPIO_Pin_4
#define Open_TP_CS_PORT GPIOC
#define Open_TP_CS_CLK RCC_AHB1Periph_GPIOC
#define Open_TP_IRQ_PIN GPIO_Pin_5
#define Open_TP_IRQ_PORT GPIOC
#define Open_TP_IRQ_CLK RCC_AHB1Periph_GPIOC
#define TP_CS(x) x ? GPIO_SetBits(Open_TP_CS_PORT,Open_TP_CS_PIN): GPIO_ResetBits(Open_TP_CS_PORT,Open_TP_CS_PIN)
#define TP_INT_IN GPIO_ReadInputDataBit(Open_TP_IRQ_PORT,Open_TP_IRQ_PIN)
/**
* @brief Definition for TouchPanel SPI
*/
/* Configure TouchPanel pins: TP_CLK-> PB13 and TP_MISO-> PB14 and TP_MOSI-> PB15 */
#define Open_RCC_SPI RCC_APB1Periph_SPI2
#define Open_GPIO_AF_SPI GPIO_AF_SPI2
#define Open_SPI SPI2
#define Open_SPI_CLK_INIT RCC_APB1PeriphClockCmd
#define Open_SPI_IRQn SPI2_IRQn
#define Open_SPI_IRQHANDLER SPI2_IRQHandler
#define Open_SPI_SCK_PIN GPIO_Pin_13
#define Open_SPI_SCK_GPIO_PORT GPIOB
#define Open_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOB
#define Open_SPI_SCK_SOURCE GPIO_PinSource13
#define Open_SPI_MISO_PIN GPIO_Pin_14
#define Open_SPI_MISO_GPIO_PORT GPIOB
#define Open_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOB
#define Open_SPI_MISO_SOURCE GPIO_PinSource14
#define Open_SPI_MOSI_PIN GPIO_Pin_15
#define Open_SPI_MOSI_GPIO_PORT GPIOB
#define Open_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOB
#define Open_SPI_MOSI_SOURCE GPIO_PinSource15
#endif /*_CONFIG_H*/
merhaba;
bende zamanında bu 3lü ile çok uğraşmıştım ve en güzel sonucu aşağıdaki gibi almıştım. bastığın noktalar ya çok doğru ya oldukça yakın çıkıyordu
X1Y1 = 400,432
X2Y2 = 80,240
X3Y3 = 720,42
#define LCD_MAXX 800 // Pixel in X-Richtung
#define LCD_MAXY 480 // Pixel in Y-Richtung
#define UB_TOUCH_KAL_XP1 400 // 50% von MAXX
#define UB_TOUCH_KAL_YP1 432 // 90% von MAXY
#define UB_TOUCH_KAL_XP2 80 // 10% von MAXX
#define UB_TOUCH_KAL_YP2 240 // 50% von MAXY
#define UB_TOUCH_KAL_XP3 720 // 90% von MAXX
#define UB_TOUCH_KAL_YP3 42 // 10% von MAXY
cevap için teşekkür ederim ama bende çalışmadı. sonunda şu değerlerle dokunmatiği çalıştırmayı başardım :
Coordinate DisplaySample[3] = {
{ 100, 100},
{ 700,240},
{ 400,410}
};