*
This commit is contained in:
@@ -0,0 +1,481 @@
|
||||
/*********************************************************************************************************
|
||||
*
|
||||
* 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/TouchPanel.h"
|
||||
#include "TouchPanel/config.h"
|
||||
#include "GLCD/GLCD.h"
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
Matrix matrix ;
|
||||
Coordinate display ;
|
||||
|
||||
|
||||
Coordinate ScreenSample[3];
|
||||
|
||||
Coordinate DisplaySample[3] = {
|
||||
{ 30, 45 },
|
||||
{ 250, 70},
|
||||
{ 160,210}
|
||||
};
|
||||
|
||||
/* 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)
|
||||
{
|
||||
LCD_SetPoint(Xpos,Ypos,Blue); /* Center point */
|
||||
LCD_SetPoint(Xpos+1,Ypos,Blue);
|
||||
LCD_SetPoint(Xpos,Ypos+1,Blue);
|
||||
LCD_SetPoint(Xpos+1,Ypos+1,Blue);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* 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_DrawLine(Xpos-15,Ypos,Xpos-2,Ypos,0xffff);
|
||||
LCD_DrawLine(Xpos+2,Ypos,Xpos+15,Ypos,0xffff);
|
||||
LCD_DrawLine(Xpos,Ypos-15,Xpos,Ypos-2,0xffff);
|
||||
LCD_DrawLine(Xpos,Ypos+2,Xpos,Ypos+15,0xffff);
|
||||
|
||||
LCD_DrawLine(Xpos-15,Ypos+15,Xpos-7,Ypos+15,RGB565CONVERT(184,158,131));
|
||||
LCD_DrawLine(Xpos-15,Ypos+7,Xpos-15,Ypos+15,RGB565CONVERT(184,158,131));
|
||||
|
||||
LCD_DrawLine(Xpos-15,Ypos-15,Xpos-7,Ypos-15,RGB565CONVERT(184,158,131));
|
||||
LCD_DrawLine(Xpos-15,Ypos-7,Xpos-15,Ypos-15,RGB565CONVERT(184,158,131));
|
||||
|
||||
LCD_DrawLine(Xpos+7,Ypos+15,Xpos+15,Ypos+15,RGB565CONVERT(184,158,131));
|
||||
LCD_DrawLine(Xpos+15,Ypos+7,Xpos+15,Ypos+15,RGB565CONVERT(184,158,131));
|
||||
|
||||
LCD_DrawLine(Xpos+7,Ypos-15,Xpos+15,Ypos-15,RGB565CONVERT(184,158,131));
|
||||
LCD_DrawLine(Xpos+15,Ypos-15,Xpos+15,Ypos-7,RGB565CONVERT(184,158,131));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
||||
@@ -0,0 +1,66 @@
|
||||
/*********************************************************************************************************
|
||||
*
|
||||
* 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
|
||||
*********************************************************************************************************/
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
#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 */
|
||||
/**
|
||||
* @brief Definition for TouchPanel
|
||||
*/
|
||||
/* Configure TouchPanel pins: TP_CS-> PC4 and TP_IRQ-> PC5 */
|
||||
|
||||
|
||||
#define Open_TP_CS_PIN GPIO_Pin_0
|
||||
#define Open_TP_CS_PORT GPIOI
|
||||
#define Open_TP_CS_CLK RCC_AHB1Periph_GPIOI
|
||||
|
||||
#define Open_TP_IRQ_PIN GPIO_Pin_6
|
||||
#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_1
|
||||
#define Open_SPI_SCK_GPIO_PORT GPIOI
|
||||
#define Open_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOI
|
||||
#define Open_SPI_SCK_SOURCE GPIO_PinSource1
|
||||
|
||||
#define Open_SPI_MISO_PIN GPIO_Pin_2
|
||||
#define Open_SPI_MISO_GPIO_PORT GPIOI
|
||||
#define Open_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOI
|
||||
#define Open_SPI_MISO_SOURCE GPIO_PinSource2
|
||||
|
||||
#define Open_SPI_MOSI_PIN GPIO_Pin_3
|
||||
#define Open_SPI_MOSI_GPIO_PORT GPIOI
|
||||
#define Open_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOI
|
||||
#define Open_SPI_MOSI_SOURCE GPIO_PinSource3
|
||||
|
||||
#endif /*_CONFIG_H*/
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/*********************************************************************************************************
|
||||
*
|
||||
* File : systick.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 "systick.h"
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
static uint8_t delay_fac_us = 0;
|
||||
static uint16_t delay_fac_ms = 0;
|
||||
static FlagStatus Status;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : delay_init
|
||||
* Description :
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention :
|
||||
*******************************************************************************/
|
||||
void delay_init(void)
|
||||
{
|
||||
RCC_ClocksTypeDef RCC_ClocksStatus;
|
||||
|
||||
RCC_GetClocksFreq(&RCC_ClocksStatus);
|
||||
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
|
||||
SysTick_ITConfig(DISABLE);
|
||||
delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;
|
||||
delay_fac_ms = RCC_ClocksStatus.HCLK_Frequency / 8000;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : delay_us
|
||||
* Description :
|
||||
* Input : - Nus:
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention :
|
||||
*******************************************************************************/
|
||||
void delay_us(u32 Nus)
|
||||
{
|
||||
SysTick_SetReload(delay_fac_us * Nus);
|
||||
SysTick_CounterCmd(SysTick_Counter_Clear);
|
||||
SysTick_CounterCmd(SysTick_Counter_Enable);
|
||||
do
|
||||
{
|
||||
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
|
||||
}while (Status != SET);
|
||||
SysTick_CounterCmd(SysTick_Counter_Disable);
|
||||
SysTick_CounterCmd(SysTick_Counter_Clear);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : delay_ms
|
||||
* Description :
|
||||
* Input : - nms:
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention :
|
||||
*******************************************************************************/
|
||||
void _delay_ms(uint16_t nms)
|
||||
{
|
||||
uint32_t temp = delay_fac_ms * nms;
|
||||
|
||||
if (temp > 0x00ffffff)
|
||||
{
|
||||
temp = 0x00ffffff;
|
||||
}
|
||||
SysTick_SetReload(temp);
|
||||
SysTick_CounterCmd(SysTick_Counter_Clear);
|
||||
SysTick_CounterCmd(SysTick_Counter_Enable);
|
||||
do
|
||||
{
|
||||
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
|
||||
}while (Status != SET);
|
||||
SysTick_CounterCmd(SysTick_Counter_Disable);
|
||||
SysTick_CounterCmd(SysTick_Counter_Clear);
|
||||
}
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*********************************************************************************************************
|
||||
*
|
||||
* File : syhstick.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 __SYSTICK_H
|
||||
#define __SYSTICK_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
void delay_init(void);
|
||||
void delay_ms(uint16_t nms);
|
||||
void delay_us(uint32_t nus);
|
||||
|
||||
#endif
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user