(ADS7843) ve XPT2046 stm32f4 library

Başlatan Kaanx, 27 Nisan 2013, 17:30:17

Kaanx

Merhabalar (ADS7843) için yazılmıs bir kutuphaneyi xpt2046 için kullanabilir miyim ? eger hayır ise farkları nelerdir.

ads7843 touch panel libarry

touch.h

/*
 * touch.h
 *
 *  Created on: Apr 26, 2013
 *      Author: Kaan
 */

#ifndef __TOUCH_7846_H
#define __TOUCH_7846_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "stm32f4xx.h"
typedef struct
{
   u16 X0;
   u16 Y0;
   u16 X;
   u16 Y;
   u8  Key_Sta;
   u8  Key_LSta;

   float xfac;
   float yfac;
   short xoff;
   short yoff;
}Pen_Holder;
extern Pen_Holder Pen_Point;
#define TOUCH_CS_PORT    GPIOB
#define TOUCH_CS_PIN    GPIO_Pin_12

#define T_CS()   GPIO_ResetBits(TOUCH_CS_PORT, TOUCH_CS_PIN);
#define T_DCS()  GPIO_SetBits(TOUCH_CS_PORT, TOUCH_CS_PIN);

#define CMD_RDY 0X90  //0B10010000
#define CMD_RDX   0XD0  //0B11010000

#define PEN  GPIOD->IDR&(1<<6) //
#define NPEN !(0x0080&PEN)      //!PEN

unsigned char SPI_WriteByte(u8 num);
void SpiDelay(unsigned int DelayCnt);
u16 TPReadX(void);
u16 TPReadY(void);
u8 read_once(void);
u8 Read_Ads7846(void);

void EXTI9_5_IRQHandler(void);
void NVIC_TOUCHConfiguration(void);
void touch_init(void);
void LCD_ShowNum(uint8_t x,uint16_t y,uint16_t data);

void Touch_Adjust(void);
#ifdef __cplusplus
}
#endif

#endif



touch.c

#include "touch.h"
#include "tft_lcd.h"
#include "stm32f4xx_it.h"
#include <stdio.h>

Pen_Holder Pen_Point;


unsigned char flag=0;


unsigned char SPI_WriteByte(u8 num)
{
  unsigned char Data = 0;
  while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
  SPI_I2S_SendData(SPI2,num);
  while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
  Data = SPI_I2S_ReceiveData(SPI2);

  return Data;
}

void SpiDelay(unsigned int DelayCnt)
{
 unsigned int i;
 for(i=0;i<DelayCnt;i++);
}

u16 TPReadX(void)
{
   u16 x=0;
   T_CS();
   SpiDelay(10);
   SPI_WriteByte(0x90);
   SpiDelay(10);
   x=SPI_WriteByte(0xFF);
   x<<=8;
   x+=SPI_WriteByte(0x0);
   T_DCS();
   //SpiDelay(10);
   x=x>>4;
   x  = x&0xFFF; //fff
   return (x);
}


u16 TPReadY(void)
{
  u16 y=0;
  T_CS();
  SpiDelay(10);
  SPI_WriteByte(0xd0);
  SpiDelay(10);
  y=SPI_WriteByte(0x0);
  y<<=8;
  y+=SPI_WriteByte(0x0);
  T_DCS();
  y = y>>4;
  y = y&0xFFF;	 //fff
  return (y);
}


u8 read_once(void)
{
   Pen_Point.X=TPReadX();
   Pen_Point.Y=TPReadY();
   return 1;
}


void NVIC_TOUCHConfiguration(void)
{
  /*
	NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  //	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;  //ʹÓÃÍⲿÖжÏ10~15
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure); 	*/
}

void touch_init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStruct;
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;

  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_13|GPIO_Pin_14;
  GPIO_Init(GPIOB,&GPIO_InitStruct);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);      //sclk	10	 13
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);	//mıso	11	 14
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);	//mosı	12	 15

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  SPI_I2S_DeInit(SPI2);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low 	 SPI_CPOL_High
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //SPI_NSS_Hard	 //SPI_NSS_Soft
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 	//16
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2,&SPI_InitStructure);
  SPI_Cmd(SPI2,ENABLE);
  //CS
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12; // 3
  GPIO_Init(GPIOB,&GPIO_InitStruct);    // d
  T_DCS();
  //T_PEN
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
  GPIO_Init(GPIOD,&GPIO_InitStruct);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource6);
  EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


u8 Read_Ads7846(void)
{
       u8 t,t1,count=0;
       u16 databuffer[2][10];
       u16 temp=0;

        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==0)
        {
          read_once();
       while(count<10)
       {
          {        if(read_once())
                  {
                       databuffer[0][count]=Pen_Point.X;
                       databuffer[1][count]=Pen_Point.Y;
                       count++;
                   }
               }
       }

       if(count==10)
       {
           do
               {
                       t1=0;
                       for(t=0;t<count-1;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
               {
                       t1=0;
                       for(t=0;t<count-1;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);

               Pen_Point.X=2047-((databuffer[0][3]+databuffer[0][4]+databuffer[0][5])/3);
               Pen_Point.Y=((databuffer[1][3]+databuffer[1][4]+databuffer[1][5])/3);
               flag=1;
               return 1;
       }
       flag=0;
        }
       return 0;

}
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line6) != RESET)
  {

   EXTI_ClearITPendingBit(EXTI_Line6);
   // Read_Ads7846();
  }
}

void Drow_Touch_Point(uint16_t x,uint16_t y)
{
	LCD_DrawUniLine(x-12,y,x+13,y);
	LCD_DrawUniLine(x,y-12,x,y+13);
	Pixel(x+1,y+1,BLUE);
	Pixel(x-1,y+1,BLUE);
	Pixel(x+1,y-1,BLUE);
	Pixel(x-1,y-1,BLUE);
	LCD_DrawCircle(x,y,6);
}
void Draw_Big_Point(uint16_t x,uint16_t y)
{
	Pixel(x,y,BLUE);
	Pixel(x+1,y,BLUE);
	Pixel(x,y+1,BLUE);
	Pixel(x+1,y+1,BLUE);
}
   void Convert_Pos(void)
{
               Read_Ads7846();
               Pen_Point.X0=(int)((Pen_Point.Y-103)/7.7);
               Pen_Point.Y0=(int)((Pen_Point.X-104)/5.56);
               if(Pen_Point.X0>240)
               {
                 Pen_Point.X0=240;
               }
               if(Pen_Point.Y0>320)
               {
                 Pen_Point.X0=320;
               }

}


void Touch_Adjust(void)
{
	uint16_t pos_temp[4][2];
	uint8_t  cnt=0;
	uint16_t d1,d2;
	uint32_t tem1,tem2;
	float fac;
	cnt=0;
	LCD_SetTextColor(BLUE);
	LCD_SetTextColor(WHITE);
	LCD_Clear(WHITE);
	Drow_Touch_Point(20,20);
	Pen_Point.xfac=0;
	while(1)
	{
                if(1==1)
		//if(Pen_Point.Key_Sta==Key_Down)
		{
			if(Read_Ads7846())
			{
				pos_temp[cnt][0]=Pen_Point.X;
				pos_temp[cnt][1]=Pen_Point.Y;
				cnt++;
                                Delay(0xFFFF);
			}
			switch(cnt)
			{
				case 1:
					LCD_Clear(WHITE);
					Drow_Touch_Point(210,20);
					break;
				case 2:
					LCD_Clear(WHITE);
					Drow_Touch_Point(20,300);
					break;
				case 3:
					LCD_Clear(WHITE);
					Drow_Touch_Point(210,300);
					break;
				case 4:
					tem1=abs(pos_temp[0][0]-pos_temp[1][0]);
					tem2=abs(pos_temp[0][1]-pos_temp[1][1]);
					tem1*=tem1;
					tem2*=tem2;
					d1=sqrt(tem1+tem2);

					tem1=abs(pos_temp[2][0]-pos_temp[3][0]);
					tem2=abs(pos_temp[2][1]-pos_temp[3][1]);
					tem1*=tem1;
					tem2*=tem2;
					d2=sqrt(tem1+tem2);
					fac=(float)d1/d2;
					if(fac<0.75||fac>1.25||d1==0||d2==0)
					{
						cnt=0;
						LCD_Clear(WHITE);
						Drow_Touch_Point(20,20);
						continue;
					}
					tem1=abs(pos_temp[0][0]-pos_temp[2][0]);
					tem2=abs(pos_temp[0][1]-pos_temp[2][1]);
					tem1*=tem1;
					tem2*=tem2;
					d1=sqrt(tem1+tem2);

					tem1=abs(pos_temp[1][0]-pos_temp[3][0]);
					tem2=abs(pos_temp[1][1]-pos_temp[3][1]);
					tem1*=tem1;
					tem2*=tem2;
					d2=sqrt(tem1+tem2);
					fac=(float)d1/d2;
					if(fac<0.75||fac>1.25)
					{
						cnt=0;
						LCD_Clear(WHITE);
						Drow_Touch_Point(20,20);
						continue;
					}
					tem1=abs(pos_temp[1][0]-pos_temp[2][0]);
					tem2=abs(pos_temp[1][1]-pos_temp[2][1]);
					tem1*=tem1;
					tem2*=tem2;
					d1=sqrt(tem1+tem2);

					tem1=abs(pos_temp[0][0]-pos_temp[3][0]);
					tem2=abs(pos_temp[0][1]-pos_temp[3][1]);
					tem1*=tem1;
					tem2*=tem2;
					d2=sqrt(tem1+tem2);
					fac=(float)d1/d2;
					if(fac<0.75||fac>1.25)
					{
						cnt=0;
						LCD_Clear(WHITE);
						Drow_Touch_Point(20,20);
						continue;
					}
					Pen_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);
					Pen_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;

					Pen_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);
					Pen_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;
					LCD_Clear(WHITE);
					return ;


			}
		}
	}
}


ADS7843 için bu kutuphane XPT2046 ıcın kullanılabilir mi ????

M_B

Alıntı Yap
ADS7843 için bu kutuphane XPT2046 ıcın kullanılabilir mi ?
evet kullanabilirsin.  Bir biriyle uyumludur.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kaanx

IRQ-> pd6
MISO->pb14
MOSI->pb15
DCLK->pb13
CS->pb12   

LCD touch ıcın bu baglantıları gercekleştirdim fakat benım lcd ımde artı olarak sd kart yuvasıda var acaba bunlarla mı karıştı dıye dusunuyorum Diot hocam örnek kod gönderdı touch ıcın resim ekrana gelıyor fakat dokunmatık çalısmıyor herhangi bir değişim söz konusu degıl ekranda

LCD min fotografı pin baglantıları arkasında uzerınde modullerı görebilirsiniz hocam.

http://p1304.hizliresim.com/18/w/mkdvj.jpg



ne yapmam gerek hocam  yardımcı olursanız cok mutlu olurum.

pisayisi

touchpoint için sdcard arabirimine ayrılan çıkışları kullanmışsın gibi görünüyor. Bu lcd nin ayna simetrisi düşünüldüğünde aşağıdaki gibi bir çıkışa sahip olduğunu görceksin TP ile başlayan pinler touchpoint pinlerine aittir; kendi uygulamanda onları kullanman lazım...

[IMG]http://imageshack.us/a/img51/1076/lcdssd1289.jpg[/img]
Murat

Kaanx

hocam Bende RESET->NRST baglı ve resimleri ekrana basabılıyorum renkler random cızgı vs gelıyor ekrana

Hocam buradaki şmeya göre

Dclk->pb13
MISO bacagı pb15 idi şemaya göre ->Dout->pb15
MOSİ bacagı pb14 idi semaya göre Din->pb14
cs->pb12
IRQ->PD6

Yani sadece MOSI ve MISO bacaklarını Dout ve Dın pınlerıyle degıstırsem kutuphaneye hiç dokunmasam diyorum cunku hazır bir kutuphane oldugu ıcın üzerinde oynamaktan korkuyorum acıkcası. Aynı işi yapmış olur muyum. ?

Kaanx

Dclk->pb13
MISO bacagı pb15 idi şemaya göre ->Dout->pb15
MOSİ bacagı pb14 idi semaya göre Din->pb14
cs->pb12
IRQ->PD6


bu değisimi yapsam uygun olur mu ? yukarıdakı semaya göre kullandıgım kutuphane yukarıda ve yaptıgım baglantılarda orada yazıyor.

diot

Kaan sana verdiğim bağlantılarda senin lcd nin  TP_   ile başlayan bacakları kullanacaksın SD_ ile başlayan bacaklar  sd kart yuvasına ait.

TP_DCLK     
TP_CS         
TP_DIN     
TP_BUSY
TP_DOUT     
TP_PENIRQ 

Kütüphane elindeki kitte çalışır.

Kaanx

IN  -    PB14  //touch pad
OUT  -    PB15  //   touch pad
SCK    -    PB13  // touch pad
TP_CS -  PB12   // touch pad cs
PEN(INT) - PD6  // touch pad

baglantılarını yaptım hocam sizin göndermıs oldugun 1.bin dosyasını attım fakat çalışmıyor hala

Kaanx

VERİLEN KUTUPHANE LCD RESMİ VE ŞEMATİKTE KULLANILACAK PİNLERE GÖRE ŞÖYLE BİR DEĞİŞİM YAPTIM FAKAT HALA SONUC ALAMADIM FİRKİ OLAN VAR MI (PİSAYİSİ HOCAMIN VERDIGI SEMATİKTEN HANGİ PİNLERİ KULLANACAGIMI GÖRDUM VE KUTUPHANEMDE HANGİ PİNLER BUNLARA BAGLANMIS BAKARAK DEĞİŞİM YAPTIM ORTAYA CIKAN PİN ŞEMASI)

IN  -    PB14  //touch pad
OUT  -    PB15  //   touch pad
SCK    -    PB13  // touch pad
TP_CS -  PB12   // touch pad cs
PEN(INT) - PD6  // touch pad

YARDIMCI OLUR MUSUNUZ ?

M_B

@Kaanx;
son durum nedir nerde kaldın.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

diot

@M_B  , kaan o işi halletti. data in out uçlarını ters bağlamış. şu an çalışıyor.

Kaanx

@M_B ,@diot

Hocam sağolun sorunu hallettik cok sukur sizlerin sayesınde allah razı olsun .

respected

#12
Kaanx hocam;
Aynı lcd ile çalışıyorum. Touch pad kısmını çalıştırdım. Kalibrasyon noktaları çıktıktan sonra pek bir değişiklik olmuyor.  Bununla ilgili nasıl örnekler yaptınız. Ekrandaki bir değeri artırma gibi bir şey yaptınız mı? Yada çizgi çizme gibi bir şey.

Kaanx

Kalibrasyon ayar çizgilerini de yaptım boyama olarak da calısmalar yaptım hocam hepsini toplayıp makale halinde yayınlamayı planlıyorum fakat malum bu aralar pek zamanım yok. Element 14 deki örnege göre yaptıgım boyama çalısması burada hocam inceleyebilirsiniz.

#include "stm32f4xx.h"
#include "delay.h"
#include "tft_lcd.h"
#include "touch.h"
//#include "Julija.h"

extern u8 gImage_sil[];
void tft_yaz(void);
extern unsigned int xxx,yyy;
extern unsigned char flag;


char stringas[8];
int xold,yold;


int main(void)
{

	//float x1,y1	;
	//	float x2,y2;
  Delay(0x3FFFFF);
  LCD_Init();
  Delay(0x3FFFFF);
  touch_init();
  LCD_Clear(BLACK);
  //LCD_SetTextColor(BLUE);

  tft_yaz();

  Read_Ads7846();
                Pen_Point.X0=(int)((Pen_Point.Y-103)/7.7);
                Pen_Point.Y0=(int)((Pen_Point.X-104)/5.56);
                if(Pen_Point.X0>240)
                {
                  Pen_Point.X0=240;
                }
                if(Pen_Point.Y0>320)
                {
                  Pen_Point.X0=320;
                }

while(1)
 {
	DON:

	 Convert_Pos();

	 if ((Pen_Point.X0>180) && (Pen_Point.X0<210) && ( Pen_Point.Y0>304) && ( Pen_Point.Y0<320))
		{
							LCD_Clear(LCD_COLOR_MAGENTA);
							LCD_SetBackColor(GREEN);
									  LCD_SetTextColor(CYAN);
							          LCD_StringLine(215,300,"SIL");
							          LCD_StringLine(172,300,"YENI");
							goto DON ;
							}



	  if((Pen_Point.X0>220) && (Pen_Point.X0<239) && (Pen_Point.Y0>304)&&(Pen_Point.Y0<320))
	  {

		  LCD_Clear(RED);
		  LCD_BackLight(100);

		  LCD_SetBackColor(GREEN);
		  LCD_SetTextColor(CYAN);
          LCD_StringLine(215,300,"SIL");
          LCD_StringLine(172,300,"YENI");


         goto DON;
	  }
	  if ((Pen_Point.X0>0) && (Pen_Point.Y0>0))
	 		 						{
		  Pixel(Pen_Point.X0,Pen_Point.Y0,YELLOW);
		    Pixel(Pen_Point.X0,Pen_Point.Y0+1,YELLOW);
		    Pixel(Pen_Point.X0+1,Pen_Point.Y0,YELLOW);
		    Pixel(Pen_Point.X0+1,Pen_Point.Y0+1,YELLOW);
	 		 						}

  }
 }


void tft_yaz(void)
{
	LCD_SetTextColor(GREEN);

	  LCD_SetBackColor(LCD_COLOR_BLUE);
	  LCD_BackLight(100);
	  LCD_StringLine(100,30, "Kaan");
	  LCD_StringLine(85,45, "Kandemir");
	  LCD_StringLine(30,80,"NAMIK KEMAL UNIVERSITESI");
	  LCD_StringLine(15,100,"CORLU MUHENDISLIK FAKULTESI");
	  LCD_StringLine(8,120,"ELEKTRONIK VE HABERLESME MUH.");
	  LCD_StringLine(15,170,"**3.2' TFT LCD UYGULAMASI**");
	  LCD_StringLine(45,190,"SSD1289 VE XPT2046 ");

}



uint16_t EVAL_AUDIO_GetSampleCallBack(void)
{
    return 0; // ses çipini kullanıyorsanız tek sample veriyi burada return ile döndürün.
}
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size)
{
    return; // ses çipini kullanıyorsanız  burada çipe veri aktarımı DMA sona ermiş
}



respected

Hocam dokunmatik kalibrasyonda ekranın neresine dokunursam tepki veriyor. Bu  ekran nokta ayarlaması ile ilgili bir sorun mu acaba?
ToucPanel.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 "systick.h"
#include "ssd1963.h"

/* Private variables ---------------------------------------------------------*/
Matrix matrix ;
Coordinate  display ;


Coordinate ScreenSample[3];

Coordinate DisplaySample[3] =   {
                                            { 45, 45 },
											{ 270, 90},
                                            { 100,190}
	                            } ;

/* Private define ------------------------------------------------------------*/
#define THRESHOLD 2
#define RGB565CONVERT(red, green, blue) (int) (((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3))

#ifndef USE_Delay
static void delay(__IO uint32_t nCount);
#endif /* USE_Delay*/

/*******************************************************************************
* Function Name  : ADS7843_SPI_Init
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* Attention		 : None
// *******************************************************************************/
// static void ADS7843_SPI_Init(void) 
// { 
//   SPI_InitTypeDef  SPI_InitStructure;
//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
//   /* DISABLE SPI2 */ 
//   SPI_Cmd(SPI2, DISABLE); 
//   /* SPI2 Config -------------------------------------------------------------*/ 
//   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
//   SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
//   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
//   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 
//   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
//   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
//   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; 
//   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
//   SPI_InitStructure.SPI_CRCPolynomial = 7; 
//   SPI_Init(SPI2, &SPI_InitStructure); 
//   /* Enable SPI2 */ 
//   SPI_Cmd(SPI2, ENABLE); 
// } 

/*******************************************************************************
* Function Name  : TP_Init
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
void TP_Init(void) 
{ 
	SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStruct;
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);

  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
  GPIO_Init(GPIOC,&GPIO_InitStruct);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2);      //miso 2
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2);	//mosi	3
	
	 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_14;
  GPIO_Init(GPIOB,&GPIO_InitStruct);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2);      //sck 10
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); // NSS(CS) 14

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  SPI_I2S_DeInit(SPI2);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low 	 SPI_CPOL_High
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //SPI_NSS_Hard	 //SPI_NSS_Soft
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 	//16
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2,&SPI_InitStructure);
  SPI_Cmd(SPI2,ENABLE);
  //CS
//   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
//   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
//   GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
//   GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
//   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12; // 3
//   GPIO_Init(GPIOB,&GPIO_InitStruct);    // d
//   T_DCS();
  //T_PEN
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
  GPIO_Init(GPIOA,&GPIO_InitStruct);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource6);
  EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
//   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 SPI2 Tx buffer empty */ 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
  /* Send SPI2 data */ 
  SPI_I2S_SendData(SPI2,cmd); 
  /* Wait for SPI2 data reception */ 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); 
  /* Read SPI2 received data */ 
  SPI_I2S_ReceiveData(SPI2); 
} 



/*******************************************************************************
* Function Name  : RD_AD
* Description    : 
* Input          : None
* Output         : None
* Return         : 
* Attention		 : None
*******************************************************************************/
static int RD_AD(void)  
{ 
  unsigned short buf,temp; 
  /* Wait for SPI2 Tx buffer empty */ 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
  /* Send SPI2 data */ 
  SPI_I2S_SendData(SPI2,0x0000); 
  /* Wait for SPI2 data reception */ 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); 
  /* Read SPI2 received data */ 
  temp=SPI_I2S_ReceiveData(SPI2); 
  buf=temp<<8; 
  DelayUS(1); 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
  /* Send SPI2 data */ 
  SPI_I2S_SendData(SPI2,0x0000); 
  /* Wait for SPI2 data reception */ 
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); 
  /* Read SPI2 received data */ 
  temp=SPI_I2S_ReceiveData(SPI2); 
  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)
{
  LCD_SetTextColor(WHITE);
	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)
{
  LCD_SetTextColor(BLUE);
	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);
  
	LCD_SetTextColor(RGB565CONVERT(200,158,131));
  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  : TouchPanel_Calibrate
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
void TouchPanel_Calibrate(void)
{
  uint8_t i;
  Coordinate * Ptr;

  for(i=0;i<3;i++)
  {
   TFT_CLEAR(GBLUE);
	  SSD1963_LCD_ShowString(200,200,"Dokunmatik Ekran Kalibrasyonu");
   delay(200);
   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;
  }
  setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix );
  TFT_CLEAR(GBLUE);
} 
#ifndef USE_Delay
/**
  * @brief  Inserts a delay time.
  * @param  nCount: specifies the delay time length.
  * @retval None
  */
static void delay(__IO uint32_t nCount)
{
  __IO uint32_t index = 0; 
  for(index = (100000 * nCount); index != 0; index--)
  {
  }
}
#endif /* USE_Delay*/
/*********************************************************************************************************
      END FILE
*********************************************************************************************************/


ToucPanel.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

#define TOUCH_CS_PORT    GPIOB
#define TOUCH_CS_PIN    GPIO_Pin_14

// #define T_CS()   GPIO_ResetBits(TOUCH_CS_PORT, TOUCH_CS_PIN);
#define T_DCS()  GPIO_SetBits(TOUCH_CS_PORT, TOUCH_CS_PIN);

#define TP_CS(x)	x ? GPIO_SetBits(GPIOB,GPIO_Pin_14): GPIO_ResetBits(GPIOA,GPIO_Pin_14)

#define TP_INT_IN   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)

/* 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
*********************************************************************************************************/