📄 touchpanel.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 + -