⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touchstreen.c

📁 STM32+Grlib
💻 C
📖 第 1 页 / 共 2 页
字号:
				break;	 
			} 	
		 }				
	}
						                       	//清屏   
											 	//用于第二个触摸屏校正的提示	
	for(ucI=0; ucI<20; ucI++)						//在竖屏模式下,左上角显示第二个校正点点击区域
	{							

	PixelDraw (0,199,109+ucI,0xffff);

	PixelDraw (0,189+ucI,119,0xffff);
	}
	USART_OUT(USART1,"push the second Point"); 		   
	while (1)                   					//等待点击第二个触摸校正点
	{    						   
		if(PEN==0)
		{	 								//点击第二个校正点 等待触摸检测电平变低
			Delay(34000);					    //延时340ms 消除抖动
			if(PEN==0)
			{							    //检测触摸中断线是否可靠点击
				while(PEN==0)
				{					    //点击未松开,持续读取触摸坐标
				    Delay(1);
				    //读取触摸坐标
					Get_Coordinat(&strPoint2);//获得第二个校正点的X,Y
					TouchCorrectionStruct->fXe=strPoint2.uiX;
					TouchCorrectionStruct->fYe=strPoint2.uiY;    
					Delay(34000);			   //延时340ms 消除抖动					
				}
				break;	 
			} 	
		 }				
	}
  /* 根据第一个校正点和第二个校正点的数据计算出屏幕上一个像素对应的触摸X,Y变化值,为保持精度,此值是浮点数 */

	TouchCorrectionStruct->fXe = (TouchCorrectionStruct->fXe - TouchCorrectionStruct->uiXs) / 200;
	TouchCorrectionStruct->fYe = (TouchCorrectionStruct->fYe - TouchCorrectionStruct->uiYs) / 120;

	USART_OUT(USART1,"calibrate completed "); 		   



}
void Get_Conv_Coordinate(TOUCH_CorrectionTypeDef TouchCorrectionStruct,PointTypeDef *pstrPoint)
{
	PointTypeDef strPoint;
	//获取坐标
	Get_Coordinat(&strPoint);
	//坐标变换
	if(strPoint.uiX > TouchCorrectionStruct.uiXs)
		pstrPoint->uiX = (strPoint.uiX - TouchCorrectionStruct.uiXs) / TouchCorrectionStruct.fXe;
	else
		pstrPoint->uiX = 0;

	if(strPoint.uiY > TouchCorrectionStruct.uiYs)
		pstrPoint->uiY = (strPoint.uiY - TouchCorrectionStruct.uiYs) / TouchCorrectionStruct.fYe; 
	else
		pstrPoint->uiY = 0;
}


/**************************填充矫正矩阵参数***************************************/

//************************************************************************
//
//
//
//
//
/*
#if 0
void Set_TS_MATRIX(MATRIX *MATRIX)
{
	
	POINT iPoint;
	unsigned char ucI;

	POINT TS_Sample[3];  //触摸屏矫正采样点

	POINT DpyS_Sample[3];//显示屏矫正采样点


	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第一个校正点点击区域
		
		PixelDraw (0,19,14+ucI,0xffff);
		
		PixelDraw (0,ucI+14,19,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{	
								   		//检测触摸中断线是否可靠点击
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   
				    Delay(1);
					Get_Coordinat(&iPoint);//读取触摸坐标					   	
					Delay(34000);			   //延时340ms 消除抖动		
				}
				TS_Sample[0].x = iPoint.x;
				TS_Sample[0].y = iPoint.y;
				DpyS_Sample[0].x = 19;
				DpyS_Sample[0].y = 19;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}
	
	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第二个校正点点击区域
		
		PixelDraw (0,219,194+ucI,0xffff);
		
		PixelDraw (0,214+ucI,199,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{							   		//检测触摸中断线是否可靠点击
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   
				    Delay(1);					
					Get_Coordinat(&iPoint);//读取触摸坐标					   	
					Delay(34000);			   //延时340ms 消除抖动		
				}
				TS_Sample[1].x = iPoint.x;
				TS_Sample[1].y = iPoint.y;
				DpyS_Sample[1].x = 219;
				DpyS_Sample[1].y = 199;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}
	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第二个校正点点击区域
		
		PixelDraw (0,119,374+ucI,0xffff);
		
		PixelDraw (0,114+ucI,379,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{							   		//检测触摸中断线是否可靠点击
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   
				    Delay(1);					
					Get_Coordinat(&iPoint);//读取触摸坐标					   	
					Delay(34000);			   //延时340ms 消除抖动		
				}
				TS_Sample[2].x = iPoint.x;
				TS_Sample[2].y = iPoint.y;
				DpyS_Sample[2].x = 119;
				DpyS_Sample[2].y = 379;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}

	setCalibrationMatrix(TS_Sample, DpyS_Sample, MATRIX);



}
#endif

void Set_TS_MATRIX(MATRIX *MATRIX)
{
	
	POINT iPoint;
	unsigned char ucI;

	POINT TS_Sample[3];  //触摸屏矫正采样点

	POINT DpyS_Sample[3];//显示屏矫正采样点


	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第一个校正点点击区域
		
		PixelDraw (0,19,14+ucI,0xffff);
		
		PixelDraw (0,ucI+14,19,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{	
								   		//检测触摸中断线是否可靠点击
				Delay(34000);			   //延时340ms 消除抖动
				Get_Coordinat(&iPoint);//读取触摸坐标					   	
				Delay(1);
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   
		
				}
				TS_Sample[0].x = iPoint.x;
				TS_Sample[0].y = iPoint.y;
				DpyS_Sample[0].x = 19;
				DpyS_Sample[0].y = 19;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}
	
	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第二个校正点点击区域
		
		PixelDraw (0,219,194+ucI,0xffff);
		
		PixelDraw (0,214+ucI,199,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{							   		//检测触摸中断线是否可靠点击
				Delay(34000);				
				Delay(1);					
				Get_Coordinat(&iPoint);//读取触摸坐标					   	
			   //延时340ms 消除抖动
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   
		
				}
				TS_Sample[1].x = iPoint.x;
				TS_Sample[1].y = iPoint.y;
				DpyS_Sample[1].x = 219;
				DpyS_Sample[1].y = 199;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}
	for(ucI=0; ucI<=10; ucI++)
	{						   //在竖屏模式下,左上角显示第二个校正点点击区域
		
		PixelDraw (0,119,374+ucI,0xffff);
		
		PixelDraw (0,114+ucI,379,0xffff);
  	} 	
	while (1)                   				   //等待点击第一个触摸校正点
	{    						   
		 if(PEN==0)					   			//点击第一个校正点 等待触摸检测电平变低
		 {							   
			Delay(34000);					   	//延时340ms 消除抖动
			if(PEN==0)
			{							   		//检测触摸中断线是否可靠点击
				Delay(34000);			   //延时340ms 消除抖动						
				Get_Coordinat(&iPoint);//读取触摸坐标					   	
				Delay(1);
				while(PEN==0)		   			//点击未松开,持续读取触摸坐标
				{					   	
				}
				TS_Sample[2].x = iPoint.x;
				TS_Sample[2].y = iPoint.y;
				DpyS_Sample[2].x = 119;
				DpyS_Sample[2].y = 379;
			
			USART_SendData( USART1,(unsigned int)(iPoint.x >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.x ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
			USART_SendData( USART1,(unsigned int)(iPoint.y >>8));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			USART_SendData( USART1,(unsigned int)(iPoint.y ));
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
			
				break;	 
			} 	
		 }				
	}

	setCalibrationMatrix(TS_Sample, DpyS_Sample, MATRIX);

}
 */


//外部中断引脚的配置 PB6
void TS_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;				 //触摸检测引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	g_ucPenUpDownState = Up;	//初始化状态变	
}

//外部中断寄存器配置

void TS_NVIC_Configuration(void)
{
  	NVIC_InitTypeDef NVIC_InitStructure;
  	EXTI_InitTypeDef EXTI_InitStructure;
  /* Configure one bit for preemption priority */
  /* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数   在这里是1, 7 */    
  	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;				 //外部中断6
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	     //抢占优先级 0
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			 //子优先级0  
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能
  	NVIC_Init(&NVIC_InitStructure);

  //用于配置AFIO外部中断配置寄存器AFIO_EXTICR1,用于选择EXTI2外部中断的输入源是PB5。
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);     //外部中断配置AFIO--ETXI6

  	EXTI_InitStructure.EXTI_Line = EXTI_Line6;						//PB6 作为触摸屏按下状态 检测状态
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			    //中断模式
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;		    //双边沿触发
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);
	
}
/*************中断服务函数实体*************/

void TouchScreenFeedBack(void)
{
	Delay(34000);								 //延时去抖,开节摆时钟大约300ms
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == Down)  	//触摸笔按下
	{
		//g_ucPenUpDownState = Down;
		GPIO_ResetBits(GPIOD, GPIO_Pin_6);    				//测试双边沿触发
		Get_Conv_Coordinate(g_strTouchCorrectionStruct,&g_strDpy_Point);//获取笔的坐标
		g_pfnTSHandler(WIDGET_MSG_PTR_DOWN, g_strDpy_Point.uiX, g_strDpy_Point.uiY);
											  			

	}
	else
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == Up)	 	//触摸笔撤离
		{
			 //g_ucPenUpDownState = Up;
			 GPIO_SetBits(GPIOD, GPIO_Pin_6);    	//测试双边沿触发
			 g_pfnTSHandler(WIDGET_MSG_PTR_UP, g_strDpy_Point.uiX, g_strDpy_Point.uiY);						
		}
	//WidgetMessageQueueProcess();

}
//********************触摸屏返回消息---发送消息函数  安装函数

void TouchScreenCallbackSet(long (*pfnCallback)(unsigned long ulMessage, long lX,long lY))
{
    //
    // Save the pointer to the callback function.
    //
    g_pfnTSHandler = pfnCallback;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -