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

📄 touch.c

📁 ucos_ii在mini2440上的移植KEIL编译环境
💻 C
字号:
#include <stdio.h>
#include "touch.h"
#include "../timeer/timeer.h"

#define GUI_TOUCH_XSIZE LCD_WIDTH
#define GUI_TOUCH_YSIZE LCD_HEIGHT

#define GUI_TOUCH_AD_LEFT (1185)
#define GUI_TOUCH_AD_RIGHT (99)
#define GUI_TOUCH_AD_TOP (168)
#define GUI_TOUCH_AD_BOTTOM (1120)

#define STATE_PEN_DOWN (1)
#define STATE_PEN_UP (2)

static int s_nPenState = STATE_PEN_UP;
static int timerID = -1;
static int xynum = 0;
static int cx = 0;
static int cy = 0;


findxy_t chfindxy[20]={0};

int TOUCH_AD2X(int nAdxValue)
{
	int nTempVal = 0;
	
	nTempVal = (nAdxValue - GUI_TOUCH_AD_LEFT) * (GUI_TOUCH_XSIZE -1);
	nTempVal = nTempVal / (GUI_TOUCH_AD_RIGHT - GUI_TOUCH_AD_LEFT);
		
	return nTempVal;
}

int TOUCH_AD2Y(int nAdyValue)
{
	int nTempVal = 0;
	
	nTempVal = (nAdyValue - GUI_TOUCH_AD_TOP) * (GUI_TOUCH_YSIZE -1);
	nTempVal = nTempVal / (GUI_TOUCH_AD_BOTTOM - GUI_TOUCH_AD_TOP);
		
	return nTempVal;
}

void TOUCH_WaitPenUp()
{
	ADCCON = (1<<14)+(9<<6);
	ADCTSC = 0x1d3;
	ADCUPDN = 0;
}

void TOUCH_WaitPenDown()
{
	ADCCON = (1<<14)+(9<<6);
	ADCTSC = 0xd3;
	ADCUPDN = 0;
}

void TOUCH_findXY()
{
	int nIndex = 0;
	int nX = 0;
	int nY = 0;
	int nXCount = 0;
	int nYCount = 0;

	int nXMin = 2000;
	int nXMax = -1;
	int nYMin = 2000;
	int nYMax = -1;


	for(nIndex =0 ; nIndex < 5; nIndex++)
	{
		nX = chfindxy[nIndex].x;
		nY = chfindxy[nIndex].y;

		//记录最小值
		if(nX < nXMin)
			nXMin = nX;
		if(nY < nYMin)
			nYMin = nY;

		//记录最大值
		if(nX < nXMax)
			nXMax = nX;
		if(nY < nYMax)
			nYMax = nY;

		//统计采样值
		nXCount += nX;
		nYCount += nY;
	}

	nX = (nXCount - nXMin -nXMax) / 3;
	nY = (nYCount - nYMin -nYMax) / 3;
	cx = nX;
	cy = nY;
	//LCD_PutPixel(nY,nX,RGB(0,0,0));
}

void TOUCH_GetXY()
{
	int nIndex = 0;
	int nX = 0;
	int nY = 0;
	int nXCount = 0;
	int nYCount = 0;

	int nXMin = 2000;
	int nXMax = -1;
	int nYMin = 2000;
	int nYMax = -1;

	char xch[20] = {0};
	char ych[20] = {0};



	for(nIndex =0 ; nIndex < 6; nIndex++)
	{
		//开始采样
		ADCTSC = ((1<<3)|(1<<2));
		ADCCON |= 0x1;
		//等待采样结束
		while(ADCCON & 0x1);
		while(!(ADCCON & 0x8000));
		//获取采样值
		nX = (ADCDAT0 & 0x3FF);
		nY = (ADCDAT1 & 0x3FF);

		//记录最小值
		if(nX < nXMin)
			nXMin = nX;
		if(nY < nYMin)
			nYMin = nY;

		//记录最大值
		if(nX < nXMax)
			nXMax = nX;
		if(nY < nYMax)
			nYMax = nY;

		//统计采样值
		nXCount += nX;
		nYCount += nY;
	}

	nX = (nXCount - nXMin -nXMax) / 4;
	nY = (nYCount - nYMin -nYMax) / 4;
	
	/*坐标电压打印*/
	sprintf(xch,"%d",nX);
	sprintf(ych,"%d",nY);
	
	LCD_DrawText(70,40,xch,4,RGB(255,255,255),RGB(0,0,0));
	LCD_DrawText(100,40,ych,4,RGB(255,255,255),RGB(0,0,0));	
	
	/*边沿修正*/
	if(nX > GUI_TOUCH_AD_LEFT)
		nX = GUI_TOUCH_AD_LEFT;
	if(nX < GUI_TOUCH_AD_RIGHT)
		nX = GUI_TOUCH_AD_RIGHT;
	if(nY < GUI_TOUCH_AD_TOP)
		nY = GUI_TOUCH_AD_TOP;
	if(nY > GUI_TOUCH_AD_BOTTOM)
		nY = GUI_TOUCH_AD_BOTTOM;
	
	//将电压转换为坐标	坐标获得后做相应的处理
	nX = TOUCH_AD2X(nX);
	nY = TOUCH_AD2Y(nY);
	
	/*X调整*/
	if(nX<230 && nX>189)
		nX+=3;
	else if(nX<=54 && nX>5)
		nX+=3;
	else if(nX<=189 && nX>54)
		nX+=3;
	else if(nX<=5 && nX>0)
		nX+=3;
	//Y调整
	if(nY<=240 && nY>170)
		nY-=3;

	/*坐标打印*/
	memset(xch,0,sizeof(xch));
	memset(ych,0,sizeof(ych));
	sprintf(xch,"%d",nX);
	sprintf(ych,"%d",nY);
	
	LCD_DrawText(70,80,xch,3,RGB(255,255,255),RGB(0,0,0));
	LCD_DrawText(100,80,ych,3,RGB(255,255,255),RGB(0,0,0));
	
	//去掉第一次与最后一次	
	if(xynum > 1 && xynum <= 6)
	{
		chfindxy[xynum].x=nX;
		chfindxy[xynum].y=nY;
		chfindxy[xynum].num=xynum;
	}
	xynum++;
	//发现第一点
	if(xynum == 6)
	{	
		TOUCH_findXY();
		//xynum=0;
		//memset(chfindxy,0,sizeof(chfindxy));	
	}
	else if(xynum > 6)
	{
		if(abs(nX-cx) >= 0 && abs(nX-cx) <= 7 && abs(nY-cy) >= 0 && abs(nY-cy) <= 7)
		{
			cx = nX;
			cy = nY;	
		}
	}
	
	//等待中断提起
	TOUCH_WaitPenUp();
					 
}

void TOUCH_Timer()
{
	if(s_nPenState == STATE_PEN_DOWN)
	{
		TOUCH_GetXY(); 	
	}
}

void TOUCH_Start()
{
	s_nPenState = STATE_PEN_DOWN;
	
	TIMER_TS_Start(timerID);
	//等待抬起
	TOUCH_WaitPenUp();	
}

void TOUCH_Stop()
{
	s_nPenState = STATE_PEN_UP;
	//等待按下
	TOUCH_WaitPenDown();
	TIMER_TS_Stop(timerID);
	
	xynum=0;
	memset(chfindxy,0,sizeof(chfindxy));
	cx=0;
	cy=0;
	
}

void TOUCH_IRQEntry()
{
	if(SUBSRCPND & BIT_SUB_TC)
	{
		if(ADCUPDN & STATE_PEN_DOWN)
		{
			TOUCH_Start();//按下开始采样
		}
		else if(ADCUPDN & STATE_PEN_UP)
		{
			TOUCH_Stop();//抬起结束采样	
		}
		SUBSRCPND |= BIT_SUB_TC;
	}
}

void TOUCH_Init()
{
	xynum=0;
	cx=0;
	cy=0;



	memset(chfindxy,0,sizeof(chfindxy));
	IRQ_SetMask(INT_TYPE_INT_ADC,0); //开启一级中断
	//IRQ_SetMask(INT_TYPE_INT_ADC_S,0);
	IRQ_SetMask(INT_TYPE_INT_TC,0);

	//INTMSK &= ~BIT_ADC;
	//INTSUBMSK &= ~BIT_SUB_TC;

	ADCDLY = 30000;

	ADCCON = (1 << 14) + (9 << 6);
	ADCTSC = 0xd3; //中断等待模式

	IRQ_Install(INT_TYPE_INT_TC,TOUCH_IRQEntry);
	//创建软定时
	timerID = TIMER_TS_Create(10,1,TOUCH_Timer);	
}

⌨️ 快捷键说明

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