亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? touchpanel.c

?? uCOSII_lwip_lpc1768
?? C
字號:
/****************************************Copyright (c)****************************************************
**                                      
**                                 http://www.powermcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               TouchPanel.c
** Descriptions:            The TouchPanel application function
**
**--------------------------------------------------------------------------------------------------------
** Created by:              AVRman
** Created date:            2010-11-7
** Version:                 v1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             
** Modified date:           
** Version:                 
** Descriptions:            
**
*********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include <includes.h>


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

/* DisplaySample LCD坐標上對應的ads7843采樣AD值 如:LCD 坐標45,45 應該的X Y采樣ADC分別為3388,920 */	
Coordinate ScreenSample[3];/* LCD上的坐標 */Coordinate DisplaySample[3] =   {                                            { 120,50 },											{ 30, 200},                                            { 290,190}	                            } ;

/* Private define ------------------------------------------------------------*/
#define THRESHOLD 2   /* 差值門限 */


/*******************************************************************************
* Function Name  : LPC17xx_SPI_SetSpeed
* Description    : Set clock speed to desired value
* Input          : - speed: speed
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
void LPC17xx_SPI_SetSpeed (uint8_t speed)
{
	speed &= 0xFE;
	if ( speed < 2  ) {
		speed = 2 ;
	}
	LPC_SSP1->CPSR = speed;
}

/*******************************************************************************
* Function Name  : ADS7843_SPI_Init
* Description    : ADS7843 SPI 初始化
* Input          : None
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
static void ADS7843_SPI_Init(void) 
{ 
	volatile uint32_t dummy;

	/* Initialize and enable the SSP1 Interface module. */
	LPC_SC->PCONP |= (1 << 10);          /* Enable power to SSPI1 block  */

	/* P0.7 SCK, P0.8 MISO, P0.9 MOSI are SSP pins. */
	LPC_PINCON->PINSEL0 &= ~((3UL<<14) | (3UL<<16) | (3UL<<18)) ; /* P0.7,P0.8,P0.9 cleared */
	LPC_PINCON->PINSEL0 |=  (2UL<<14) | (2UL<<16) | (2UL<<18);    /* P0.7 SCK1,P0.8 MISO1,P0.9 MOSI1 */

	/* PCLK_SSP1=CCLK */
	LPC_SC->PCLKSEL0 &= ~(3<<20);               /* PCLKSP0 = CCLK/4 (18MHz) */
	LPC_SC->PCLKSEL0 |=  (1<<20);               /* PCLKSP0 = CCLK   (72MHz) */

	LPC_SSP1->CR0  = 0x0007;                    /* 8Bit, CPOL=0, CPHA=0         */
	LPC_SSP1->CR1  = 0x0002;                    /* SSP1 enable, master          */

	LPC17xx_SPI_SetSpeed ( SPI_SPEED_2MHz );

	/* wait for busy gone */
	while( LPC_SSP1->SR & ( 1 << SSPSR_BSY ) );

	/* drain SPI RX FIFO */
	while( LPC_SSP1->SR & ( 1 << SSPSR_RNE ) )
	{
		dummy = LPC_SSP1->DR;
	}
} 

/*******************************************************************************
* Function Name  : TP_Init
* Description    : ADS7843端口初始化
* Input          : None
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
void TP_Init(void) 
{ 
  LPC_GPIO0->FIODIR |=  (1<<6);   /* P0.6 CS is output */
  LPC_GPIO2->FIODIR |=  (0<<13);  /* P2.13 TP_INT is input */
  TP_CS(1); 
  ADS7843_SPI_Init(); 
} 

/*******************************************************************************
* Function Name  : DelayUS
* Description    : 延時1us
* Input          : - cnt: 延時值
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
static void DelayUS(uint16_t cnt)
{
  uint16_t i;
  for(i = 0;i<cnt;i++)
  {
     uint8_t us = 12; /* 設置值為12,大約延1微秒 */    
     while (us--)     /* 延1微秒	*/
     {
       ;   
     }
  }
}


/*******************************************************************************
* Function Name  : WR_CMD
* Description    : 向 ADS7843寫數據
* Input          : - cmd: 傳輸的數據
* Output         : None
* Return         : None
* Attention		 : None
*******************************************************************************/
static uint8_t WR_CMD (uint8_t cmd)  
{ 
  uint8_t byte_r;

  while (LPC_SSP1->SR & (1 << SSPSR_BSY) ); 	     /* Wait for transfer to finish */
  LPC_SSP1->DR = cmd;
  while (LPC_SSP1->SR & (1 << SSPSR_BSY) ); 	     /* Wait for transfer to finish */
  while( !( LPC_SSP1->SR & ( 1 << SSPSR_RNE ) ) );	 /* Wait untill the Rx FIFO is not empty */
  byte_r = LPC_SSP1->DR;

  return byte_r;                                     /* Return received value */
} 



/*******************************************************************************
* Function Name  : RD_AD
* Description    : 讀取ADC值
* Input          : None
* Output         : None
* Return         : ADS7843返回二字節數據
* Attention		 : None
*******************************************************************************/
static int RD_AD(void)  
{ 
  unsigned short buf,temp; 

  temp = WR_CMD(0x00);
  buf = temp<<8; 
  DelayUS(1); 
  temp = WR_CMD(0x00);;
  buf |= temp; 
  buf>>=3; 
  buf&=0xfff; 
  return buf; 
} 


/*******************************************************************************
* Function Name  : Read_X
* Description    : 讀取ADS7843通道X+的ADC值 
* Input          : None
* Output         : None
* Return         : ADS7843返回通道X+的ADC值
* 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    : 讀取ADS7843通道Y+的ADC值
* Input          : None
* Output         : None
* Return         : ADS7843返回通道Y+的ADC值
* 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    : 讀取ADS7843 通道X+ 通道Y+的ADC值
* Input          : None
* Output         : None
* Return         : ADS7843返回 通道X+ 通道Y+的ADC值 
* 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  : Read_Ads7846
* Description    : 得到濾波之后的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}};  /* 坐標X和Y進行多次采樣 */
  do					       /* 循環采樣9次 */
  {		   
    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為觸摸屏中斷引腳,當用戶點擊觸摸屏時TP_INT_IN會被置低 */
  if(count==9)   /* 成功采樣9次,進行濾波 */ 
  {  
    /* 為減少運算量,分別分3組取平均值 */
    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;
	/* 計算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);
	/* 判斷絕對差值是否都超過差值門限,如果這3個絕對差值都超過門限值,則判定這次采樣點為野點,拋棄采樣點,差值門限取為2 */
	if( m0>THRESHOLD  &&  m1>THRESHOLD  &&  m2>THRESHOLD ) return 0;
	/* 計算它們的平均值,同時賦值給screen */ 
	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;

	/* 同上 計算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; 
}
	 
/* 下面是觸摸屏到液晶屏坐標變換的轉換函數 */
/* 只有在LCD和觸摸屏間的誤差角度非常小時,才能運用下面公式 */


/*******************************************************************************
* Function Name  : setCalibrationMatrix
* Description    : 計算出 K A B C D E F
* Input          : None
* Output         : None
* Return         : 返回1表示成功 0失敗
* Attention		 : None
*******************************************************************************/uint8_t setCalibrationMatrix( Coordinate * displayPtr,                          Coordinate * screenPtr,                          Matrix * matrixPtr){  uint8_t retTHRESHOLD = 0 ;  /* 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 = 1;  }  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    : 通過 K A B C D E F 把通道X Y的值轉換為液晶屏坐標
* Input          : None
* Output         : None
* Return         : 返回1表示成功 0失敗
* Attention		 : None
*******************************************************************************/
uint8_t getDisplayPoint(Coordinate * displayPtr,                     Coordinate * screenPtr,                     Matrix * matrixPtr ){  uint8_t retTHRESHOLD = 0 ;  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 = 1;  }  return(retTHRESHOLD);} 

/*********************************************************************************************************
      END FILE
*********************************************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女国产一区二区三区| 夜夜嗨av一区二区三区中文字幕 | 亚洲成人av在线电影| 欧美天天综合网| 日韩中文字幕一区二区三区| 日韩亚洲欧美综合| 韩国欧美国产1区| 国产精品午夜久久| 在线观看欧美黄色| 久久国内精品自在自线400部| 欧美精品一区二区三区在线| 国产成人三级在线观看| 亚洲天堂2014| 欧美一区二区不卡视频| 国产激情视频一区二区在线观看| 国产精品丝袜在线| 欧美性大战久久久久久久| 免费美女久久99| 国产精品毛片大码女人| 欧美揉bbbbb揉bbbbb| 日日骚欧美日韩| 亚洲国产精品精华液2区45| 在线观看国产91| 国产麻豆精品久久一二三| 亚洲精品免费在线观看| 日韩欧美色电影| 99精品在线观看视频| 日本va欧美va瓶| 1024成人网| 2020国产精品| 欧美日韩精品一区二区三区| 国产精品538一区二区在线| 亚洲一二三区视频在线观看| 精品国产99国产精品| 91极品视觉盛宴| 国产精品系列在线播放| 亚洲高清免费一级二级三级| 国产无一区二区| 欧美久久久久中文字幕| 成人激情黄色小说| 毛片av一区二区| 亚洲午夜激情av| 国产精品久久久久四虎| 精品国产乱码久久久久久夜甘婷婷| 91小宝寻花一区二区三区| 国内精品伊人久久久久av一坑 | 56国语精品自产拍在线观看| 成人综合在线观看| 久热成人在线视频| 亚洲r级在线视频| 亚洲欧美国产77777| 中文字幕第一区综合| 日韩三级.com| 欧美男男青年gay1069videost | 国产激情视频一区二区三区欧美 | 久久久久久久久久久久电影| 717成人午夜免费福利电影| 91视频精品在这里| 成人午夜看片网址| 国产精品一二二区| 裸体歌舞表演一区二区| 日韩精品91亚洲二区在线观看| 伊人性伊人情综合网| 亚洲国产激情av| 国产欧美日韩在线看| 久久精品视频一区二区| 国产亚洲人成网站| 久久这里只精品最新地址| 日韩女同互慰一区二区| 日韩午夜精品视频| 精品卡一卡二卡三卡四在线| 日韩美女主播在线视频一区二区三区 | 99国产精品国产精品毛片| 国产91清纯白嫩初高中在线观看 | 欧美无人高清视频在线观看| 欧美在线免费播放| 欧美吻胸吃奶大尺度电影| 欧美三区在线观看| 欧美日本在线播放| 欧美日韩国产综合久久| 欧美久久高跟鞋激| 91精品国产综合久久久久久久久久| 欧美日韩成人一区二区| 欧美精品乱码久久久久久| 欧美日韩一卡二卡三卡 | 136国产福利精品导航| 亚洲男人电影天堂| 一区二区三区波多野结衣在线观看 | 精品理论电影在线观看| 久久综合久久99| 国产精品乱人伦| 亚洲日本中文字幕区| 亚洲一本大道在线| 青青青伊人色综合久久| 国产一区二区三区| 91免费观看在线| 欧美高清视频一二三区 | 久久精品欧美日韩| 亚洲欧洲成人精品av97| 亚洲午夜电影在线观看| 久久精品久久精品| 成人免费av在线| 欧美伊人精品成人久久综合97| 717成人午夜免费福利电影| 久久先锋影音av| 亚洲天堂免费在线观看视频| 首页综合国产亚洲丝袜| 国产老妇另类xxxxx| 99久久99久久免费精品蜜臀| 欧美日韩一区二区欧美激情| 久久久久久久一区| 亚洲综合色婷婷| 精品一区二区三区视频| 91麻豆国产香蕉久久精品| 91精品国产色综合久久| 国产精品不卡视频| 日韩高清中文字幕一区| 成人黄色综合网站| 欧美一区二区在线播放| 国产精品麻豆欧美日韩ww| 日韩成人午夜电影| 一本色道久久综合亚洲91 | 国产99久久久国产精品免费看| 91亚洲精华国产精华精华液| 精品国免费一区二区三区| 亚洲美女区一区| 国产盗摄一区二区| 欧美一区二区三区在线看| 亚洲视频资源在线| 国产一区二区免费看| 51久久夜色精品国产麻豆| 中文字幕日本乱码精品影院| 国产一区视频网站| 欧美一级片在线看| 亚洲国产精品人人做人人爽| www.久久久久久久久| 久久婷婷色综合| 日本在线不卡视频| 在线视频欧美区| 国产精品久久久久婷婷| 韩国av一区二区三区| 91精品欧美综合在线观看最新| 亚洲免费资源在线播放| 国产成人精品免费看| 久久只精品国产| 久久成人18免费观看| 91精品国产综合久久精品图片| 亚洲免费在线视频一区 二区| 风间由美一区二区av101| 精品日韩成人av| 美女久久久精品| 日韩欧美一级在线播放| 天天影视网天天综合色在线播放| 色婷婷国产精品综合在线观看| 中文字幕一区二区三区乱码在线| 国产精品99久久久久久宅男| 久久久国产综合精品女国产盗摄| 久久99精品视频| 久久综合一区二区| 韩国成人福利片在线播放| 26uuu另类欧美| 狠狠色伊人亚洲综合成人| 欧美xxxxxxxxx| 激情av综合网| 国产欧美日韩视频在线观看| 国产精品一线二线三线| 久久久午夜电影| 国产精品18久久久久久久久久久久| 久久免费看少妇高潮| 国产一区欧美日韩| 中文乱码免费一区二区| 99在线精品视频| 亚洲狠狠丁香婷婷综合久久久| 91亚洲精品一区二区乱码| 亚洲欧美一区二区久久 | 色综合久久88色综合天天6| 亚洲精品成人在线| 91国产免费观看| 午夜伊人狠狠久久| 欧美成人免费网站| 国产精品1区2区| 亚洲色图欧美激情| 欧美日韩午夜在线视频| 男人的天堂久久精品| 久久午夜免费电影| 99r国产精品| 午夜视频一区二区| 精品国产免费视频| 不卡高清视频专区| 亚洲成av人片在www色猫咪| 欧美大片免费久久精品三p| 国产盗摄精品一区二区三区在线| 中文字幕亚洲成人| 欧美丰满少妇xxxxx高潮对白| 国产又粗又猛又爽又黄91精品| 中文字幕一区二区三区视频| 欧美精品 国产精品| 国产激情91久久精品导航| 亚洲激情图片qvod| 日韩视频在线一区二区|