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

📄 touchpanel.c

📁 GPRS模组资料包含DEMO
💻 C
字号:
//====================================================================================
//文 件 名:TouchPanel.c
//功能描述: 触摸屏驱动程序
//维护记录:
//			2007.06.17		V1.0	by wangtao <wangtao@sunnorth.com.cn>
//====================================================================================
#include "SPCE3200_Register.h"
#include "SPCE3200_Constant.h"
#include ".\TouchPanel\TouchPanel.h"

short LeftBound = TOUCH_DEFAULT_LB;							// 左边缘对应的AD转换值(16bit)
short RightBound = TOUCH_DEFAULT_RB;						// 右边缘对应的AD转换值(16bit)
short TopBound = TOUCH_DEFAULT_TB;							// 上边缘对应的AD转换值(16bit)
short BottomBound = TOUCH_DEFAULT_BB;						// 下边缘对应的AD转换值(16bit)

unsigned int TempADCx;
unsigned int TempADCy;
short ADC_Counter;
short Debounce_Counter;
short DebounceX;
short DebounceY;
short ResultX;
short ResultY;

//=============================================================
//语法格式:void Touch_Init(void)
//实现功能:触摸屏驱动初始化,初始化变量、ADC、IO等,并开启ADC中断
//参数:	无
//返回值:	无
//=============================================================
void Touch_Init(void)
{
	TempADCx = 0;
	TempADCy = 0;
	ADC_Counter = 0;
	Debounce_Counter = 0;
	DebounceX = -1;
	DebounceY = -1;
	ResultX = -1;
	ResultY = -1;
		
	*P_ADC_CLK_CONF = 0x0000;
	*P_ADC_CLK_CONF = C_ADC_CLK_EN | C_ADC_RST_DIS;
	*P_CLK_PLLAU_CONF |= C_PLLA_CLK_EN;
	*P_GPIO_CLK_CONF = C_GPIO_CLK_EN | C_GPIO_RST_DIS;
	*P_INT_CLK_CONF = C_INT_RST_DIS;
	
	*P_ADC_MIC_CTRL1 |= C_ADC_MODE_ADC;
	*P_ADC_MIC_CTRL2 |= C_ADC_CTRL_EN;
	*P_ADC_MIC_CTRL2 &= ~C_ADC_AUTO_MODE;
	*P_ADC_INT_STATUS = C_ADC_MANUAL_INTEN | C_ADC_MANUAL_FLAG;

	*P_ADC_GPIO_SETUP |= ((TOUCH_X1<<24)|(TOUCH_Y2<<24));
	*P_ADC_GPIO_SETUP &= ~(TOUCH_X2<<24)|(TOUCH_Y1<<24);
	*P_ADC_GPIO_SETUP |= (TOUCH_X1<<16)|(TOUCH_X2<<16)|(TOUCH_Y1<<16)|(TOUCH_Y2<<16);
	*P_ADC_GPIO_SETUP &= ~(TOUCH_X2|TOUCH_Y1);
	*P_ADC_GPIO_SETUP |= (TOUCH_X1|TOUCH_Y2);
		
	*P_ADC_GPIO_SETUP &= ~((TOUCH_Y1<<8)|(TOUCH_Y2<<8));
	*P_ADC_GPIO_SETUP |= (TOUCH_X1<<8)|(TOUCH_X2<<8);
	*P_ADC_AINPUT_CTRL &= ~(TOUCH_X1|TOUCH_X2);					// x1输出1,x2输出0
	*P_ADC_AINPUT_CTRL |= (TOUCH_Y1|TOUCH_Y2);					// y1和y2设置为ADC输入
	*P_ADC_MIC_CTRL1 &= ~0x000F;
	*P_ADC_MIC_CTRL1 |= TOUCH_Y1_BIT;

	*P_ADC_INT_STATUS |= C_ADC_MANUAL_START;
	*P_INT_MASK_CTRL1 &= ~C_INT_ADC_DIS;
}

//=============================================================
//语法格式:void Touch_SetBound(unsigned short left, unsigned short right, unsigned short top, unsigned short bottom);
//实现功能:设置四个边缘对应的AD转换值,用于触摸屏校准
//参数:	left:	左边缘对应的AD转换值(16bit)
//			right:	右边缘对应的AD转换值(16bit)
//			top:	上边缘对应的AD转换值(16bit)
//			bottom:	下边缘对应的AD转换值(16bit)
//返回值:	无
//=============================================================
void Touch_SetBound(unsigned short left, unsigned short right, unsigned short top, unsigned short bottom)
{
	LeftBound = left;
	RightBound = right;
	TopBound = top;
	BottomBound = bottom;
}

//=============================================================
//语法格式:void Touch_ADC_ISR(void);
//实现功能:ADC中断服务子程序
//参数:	无
//返回值:	无
//=============================================================
void Touch_ADC_ISR(void)
{
	short TempX, TempY;

	if(ADC_Counter<16)											// X方向采集16次
	{
		TempADCx += (*P_ADC_MANUAL_DATA>>16);
		ADC_Counter += 1;
		if(ADC_Counter==16)										// 改变为Y方向
		{
			*P_ADC_GPIO_SETUP &= ~((TOUCH_X1<<8)|(TOUCH_X2<<8));
			*P_ADC_GPIO_SETUP |= (TOUCH_Y1<<8)|(TOUCH_Y2<<8);
			*P_ADC_AINPUT_CTRL &= ~(TOUCH_Y1|TOUCH_Y2);			// y2输出1,y1输出0
			*P_ADC_AINPUT_CTRL |= (TOUCH_X1|TOUCH_X2);			// x2设置为ADC输入
			*P_ADC_MIC_CTRL1 &= ~0x000F;
			*P_ADC_MIC_CTRL1 |= TOUCH_X2_BIT;
		}
	}
	else if(ADC_Counter<24)										// 舍去8次转换值
	{
		ADC_Counter += 1;
	}
	else if(ADC_Counter<40)										// Y方向采集16次
	{
		TempADCy +=(*P_ADC_MANUAL_DATA>>16);
		ADC_Counter += 1;
		if(ADC_Counter == 40)
		{
			*P_ADC_GPIO_SETUP &= ~((TOUCH_Y1<<8)|(TOUCH_Y2<<8));
			*P_ADC_GPIO_SETUP |= (TOUCH_X1<<8)|(TOUCH_X2<<8);
			*P_ADC_AINPUT_CTRL &= ~(TOUCH_X1|TOUCH_X2);			// x1输出1,x2输出0
			*P_ADC_AINPUT_CTRL |= (TOUCH_Y1|TOUCH_Y2);			// y1设置为ADC输入
			*P_ADC_MIC_CTRL1 &= ~0x000F;
			*P_ADC_MIC_CTRL1 |= TOUCH_Y1_BIT;
			
			TempADCx >>= 4;										// 取16次采样结果的平均值
			TempADCy >>= 4;
			
			if( TempADCx<TOUCH_DEFAULT_LB						// 如果采样结果在四个边缘之外
				|| TempADCx>TOUCH_DEFAULT_RB
				|| TempADCy<TOUCH_DEFAULT_TB
				|| TempADCy>TOUCH_DEFAULT_BB
			)
			{
				if(DebounceX==-1 && DebounceY==-1)				// 去抖动
				{
					Debounce_Counter += 1;
					if(Debounce_Counter==TOUCH_DEBOUNCE_TIME)
					{
						ResultX = -1;
						ResultY = -1;
						Debounce_Counter = 0;
					}
				}	
				DebounceX = -1;									
				DebounceY = -1;
				TempX = TempY = -1;								// 无效坐标
			}
			else												// 采样结果在四个边缘内
			{
				TempX = TOUCH_WIDTH * (TempADCx - TOUCH_DEFAULT_LB) / (TOUCH_DEFAULT_RB - TOUCH_DEFAULT_LB);
				TempY = TOUCH_HEIGHT * (TempADCy - TOUCH_DEFAULT_TB) / (TOUCH_DEFAULT_BB - TOUCH_DEFAULT_TB);
			}

			if(TempX != -1)										// 更新坐标
			{
				if( TempX-DebounceX<TOUCH_DEBOUNCE_PIXEL		// 去抖动,待坐标稳定后才保存结果
					&& TempX-DebounceX>-TOUCH_DEBOUNCE_PIXEL
					&& TempY-DebounceY<TOUCH_DEBOUNCE_PIXEL
					&& TempY-DebounceY>-TOUCH_DEBOUNCE_PIXEL
				)
				{
					Debounce_Counter += 1;
					if(Debounce_Counter==TOUCH_DEBOUNCE_TIME)
					{
						ResultX = (TempX + DebounceX)>>1;		// 保存坐标
						ResultY = (TempY + DebounceY)>>1;
						DebounceX = ResultX;
						DebounceY = ResultY;
						Debounce_Counter = 0;
					}
				}
				else
				{
					DebounceX = TempX;
					DebounceY = TempY;
					Debounce_Counter = 0;
				}
			}
			TempADCx = 0;
			TempADCy = 0;
		}
	}
	else													// 舍去8次转换值
	{
		ADC_Counter += 1;
		if(ADC_Counter==64)
			ADC_Counter = 0;
	}

	*P_ADC_INT_STATUS |= C_ADC_MANUAL_FLAG;						// 清中断
	*P_ADC_INT_STATUS |= C_ADC_MANUAL_START;
}

//=============================================================
//语法格式:void Touch_ADC_ISR(void);
//实现功能:ADC中断服务子程序
//参数:	无
//返回值:	无
//=============================================================
short Touch_Get(short *x, short *y)
{
	*x = ResultX;
	*y = ResultY;
	if(ResultX == -1)
		return -1;
	else
		return 0;
}

⌨️ 快捷键说明

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