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

📄 sys_tchscr.c.svn-base

📁 lwip协议在arm7+uCos系统上的移植
💻 SVN-BASE
字号:
/****************************************************************************
		Copyright (c) 深圳市民德电子科技有限公司  http://www.szminde.cn

  文件名称:sys_TchScr.c
  版本号:	1.0
  日期:	2005-05-25
  说明:	此文件包含对ES-TAD7100开发板上的触摸屏模块操作的函数
  调用列表:sys_LCD.c
  修改历史:--
****************************************************************************/

#include"44b.h"
#include "sys_TchScr.h"
#include "sys_LCD.h"

/*延时函数*/
extern void Delay(int time);

/*用于触摸屏返回坐标值与LCD坐标值对应校正的几个参数*/
float adjust_a=-0.088508,
	  adjust_b=345.499578533,
	  adjust_c=0.06582633,
	  adjust_d=-17.35294117647;


/****************************************************************************
  函数名称:Start7843()
  说明:	选通器件ADS7843,准备开始操作。
  调用函数:无
  输入参数:无
  输出参数:无
****************************************************************************/
void Start7843(void)
{
	rPDATC &=~ ADS7843_PIN_DCLK;	//DCLK=0;
	rPDATC |=  ADS7843_PIN_CS;   	//CS=1;
	rPDATC |=  ADS7843_PIN_DIN;    	//DIN=1;
	rPDATC |=  ADS7843_PIN_DCLK;  	//DCLK=1
	rPDATC &=~ ADS7843_PIN_CS;     	//CS=0;
}


/****************************************************************************
  函数名称:WriteCharTo7843()
  说明:	向器件ADS7843写一个字节的数据。
  调用函数:Delay()
  输入参数:num 要写的数据
  输出参数:无
****************************************************************************/
void WriteCharTo7843(U8 num) 
{
	U8 count=0; 
	U8 TempNum=0;
	U8 DIN=0;

	rPDATC&=~ADS7843_PIN_DCLK; // DCLK=0;

	for(count=0;count<8;count++)
	{ 
		TempNum = num;          
		TempNum >>= (7-count);
		DIN = TempNum&0x1;
		rPDATC &=~ ADS7843_PIN_DIN;
		rPDATC |= (DIN<<6);

		rPDATC &=~ ADS7843_PIN_DCLK;	// DCLK=0;上升沿有效  
		Delay(2);           
		rPDATC |= ADS7843_PIN_DCLK;		// DCLK=1;
		Delay(2);           
	}
}


/****************************************************************************
  函数名称:ReadCharFrom7843()
  说明:	从器件ADS7843读回数据。
  调用函数:Delay()
  输入参数:无
  输出参数:返回一个整型数据
****************************************************************************/
S32 ReadCharFrom7843(void)
{
	U8 count=0;
	U32 Num=0;
	U32 DOUT=0;

	for(count=0;count<12;count++)
	{
		Num<<=1;
		rPDATC|=ADS7843_PIN_DCLK;  //DCLK=1;     下降沿有效
			
		Delay(2);  
			      
		rPDATC&=~ADS7843_PIN_DCLK; //DCLK=0;
		Delay(2);
		DOUT=(rPDATC&0x80);   //ADS7843_PIN_DOUT
		if(DOUT) Num++;         
	}
	return(Num);
}


/****************************************************************************
  函数名称:TchScr_GetScrXY()
  说明:	从器件ADS7843读回触摸点在触摸屏上的X,Y坐标。
  调用函数:WriteCharTo7843()
  			ReadCharFrom7843()
  			Delay()
  输入参数:*x 用来存储x坐标的整型指针
  			*y 用来存储x坐标的整型指针
  输出参数:无
****************************************************************************/
void TchScr_GetScrXY(S32 *x, S32 *y)   
{
	S32 a=0,b=0;
	
	Start7843();
	Delay(2);
	WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标
	Delay(2);
	rPDATC&=~ADS7843_PIN_DCLK; 
	Delay(2);	
	a=ReadCharFrom7843();
	*x=a;
	
	Start7843();     	
    WriteCharTo7843(0xd0); //送控制字 11010000 即用差分方式读Y坐标
    Delay(2);
	rPDATC&=~ADS7843_PIN_DCLK;
	Delay(2);
	b=ReadCharFrom7843();
	*y=b;
			
	rPDATC|=ADS7843_PIN_CS;
		
}	


/****************************************************************************
  函数名称:LCD_Touch()
  说明:	将从器件ADS7843读回触摸点在触摸屏上的X,Y坐标转换为对应LCD的坐标。
  调用函数:TchScr_GetScrXY()
  			Delay()
  输入参数:*x 用来存储x坐标的整型指针
  			*y 用来存储x坐标的整型指针
  输出参数:无
****************************************************************************/
void LCD_Touch(int* x,int* y)
{
	int TchScrAction=TCHSCR_ACTION_UP; 
	
	while(TchScrAction==TCHSCR_ACTION_UP)			//未压下状态位
	{
		if(!((rPDATC&ADS7843_PIN_PEN)>>4))			//得到压下中断信号
		{
			Delay(30); 
			if(!((rPDATC&ADS7843_PIN_PEN)>>4))
			{
				TchScr_GetScrXY(x, y);
				*x=adjust_a*(*x)+adjust_b;
				if((*x)<0)(*x)=0;
				if((*x)>=320)(*x)=319;
				*y=adjust_c*(*y)+adjust_d;
				if((*y)<0)(*y)=0;
				if((*y)>=240)(*y)=239;
				TchScrAction=TCHSCR_ACTION_DOWN;	//设置压下状态
			}
		}
	}
	while(TchScrAction==TCHSCR_ACTION_DOWN)			//已压下状态位
	{
		if((rPDATC&ADS7843_PIN_PEN)>>4)				//中断信号已经消失
		{
			Delay(30);
			if((rPDATC&ADS7843_PIN_PEN)>>4) 
			{
				TchScrAction=TCHSCR_ACTION_UP;		//设置未压状态位
			}
		}
	}
			
}
	
	
/****************************************************************************
  函数名称:TchScr_Adjust()
  说明:	校正在触摸屏上的坐标和LCD坐标的对应关系。
  调用函数:TchScr_GetScrXY()
  			LCD_Cls()
			ClearScr()
			LCD_Printf()
			DrawLine()
			Delay()
  输入参数:无
  输出参数:无
****************************************************************************/			             
void TchScr_Adjust(void)
{
	S32 x_1=0,y_1=0,x_2=0,y_2=0,x_3=0,y_3=0,x_4=0,y_4=0;
	S32 TchScrAction=TCHSCR_ACTION_UP;
	
	TchScr_GetScrXY(&x_1, &y_1);
	
	x_1=0;y_1=0;
	LCD_Cls();
	ClearScr();
	LCD_Printf("        Please click the cross.");
	Delay(3000);
	DrawLine(39,27,39,31,15);
	DrawLine(37,29,41,29,15);
	while(0==x_1&&0==y_1)
	{
		if(TchScrAction==TCHSCR_ACTION_UP)			//未压下状态位
		{
			if(!((rPDATC&ADS7843_PIN_PEN)>>4))		//得到压下中断信号
			{
				Delay(30); 
				if(!((rPDATC&ADS7843_PIN_PEN)>>4))	//两次检测防干扰
				{
					TchScr_GetScrXY(&x_1, &y_1);
					TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
				}
			}
		}
	}
	while(TchScrAction==TCHSCR_ACTION_DOWN)			//已压下状态位
	{
		if((rPDATC&ADS7843_PIN_PEN)>>4)				//中断信号已经消失
		{
			Delay(30);
			if((rPDATC&ADS7843_PIN_PEN)>>4)			//两次检测防干扰
			{
				TchScrAction=TCHSCR_ACTION_UP;		//设置未压状态位
			}
		}
	}
	
	Delay(3000);
	x_2=0;y_2=0;
	ClearScr();
	LCD_Printf("        Please click the cross.");
	DrawLine(279,27,279,31,15);
	DrawLine(277,29,281,29,15);
	while(0==x_2&&0==y_2)
	{
		if(TchScrAction==TCHSCR_ACTION_UP)			//未压下状态位
		{
			if(!((rPDATC&ADS7843_PIN_PEN)>>4))		//得到压下中断信号
			{
				Delay(30); 
				if(!((rPDATC&ADS7843_PIN_PEN)>>4))	//两次检测防干扰
				{
					TchScr_GetScrXY(&x_2, &y_2);
					TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
				}
			}
		}
	}
	while(TchScrAction==TCHSCR_ACTION_DOWN)			//已压下状态位
	{
		if((rPDATC&ADS7843_PIN_PEN)>>4)				//中断信号已经消失
		{
			Delay(30);
			if((rPDATC&ADS7843_PIN_PEN)>>4) 		//两次检测防干扰
			{
				TchScrAction=TCHSCR_ACTION_UP;		//设置未压状态位
			}
		}
	}
	
	Delay(3000);
	x_4=0;y_4=0;
	ClearScr();
	LCD_Printf("        Please click the cross.");
	DrawLine(279,207,279,211,15);
	DrawLine(277,209,281,209,15);
	while(0==x_4&&0==y_4)
	{
		if(TchScrAction==TCHSCR_ACTION_UP)			//未压下状态位
		{
			if(!((rPDATC&ADS7843_PIN_PEN)>>4))		//得到压下中断信号
			{
				Delay(30); 
				if(!((rPDATC&ADS7843_PIN_PEN)>>4))	//两次检测防干扰
				{
					TchScr_GetScrXY(&x_4, &y_4);
					TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
				}
			}
		}
	}
	while(TchScrAction==TCHSCR_ACTION_DOWN)			//已压下状态位
	{
		if((rPDATC&ADS7843_PIN_PEN)>>4)				//中断信号已经消失
		{
			Delay(30);
			if((rPDATC&ADS7843_PIN_PEN)>>4) 		//两次检测防干扰
			{
				TchScrAction=TCHSCR_ACTION_UP;		//设置未压状态位
			}
		}
	}
	
	Delay(3000);
	x_3=0;y_3=0;
	ClearScr();
	LCD_Printf("        Please click the cross.");
	DrawLine(39,207,39,211,15);
	DrawLine(37,209,41,209,15);
	while(0==x_3&&0==y_3)
	{
		if(TchScrAction==TCHSCR_ACTION_UP)			//未压下状态位
		{
			if(!((rPDATC&ADS7843_PIN_PEN)>>4))		//得到压下中断信号
			{
				Delay(30); 
				if(!((rPDATC&ADS7843_PIN_PEN)>>4))	//两次检测防干扰
				{
					TchScr_GetScrXY(&x_3, &y_3);
					TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
				}
			}
		}
	}
	while(TchScrAction==TCHSCR_ACTION_DOWN)			//已压下状态位
	{
		if((rPDATC&ADS7843_PIN_PEN)>>4) 			//中断信号已经消失
		{
			Delay(30);
			if((rPDATC&ADS7843_PIN_PEN)>>4) 		//两次检测防干扰
			{
				TchScrAction=TCHSCR_ACTION_UP;		//设置未压状态位
			}
		}
	}

	//上述几个点在LCD上的大概位置如下:
	//////////////////////////////////////////////////////////////
	//(x_1,y_1)                                        (x_2,y_2)//
	//                                                          //
	//                                                          //
	//(x_3,y_3)                                        (x_4,y_4)//
	//////////////////////////////////////////////////////////////
	x_1=(x_1+x_3)/2;
	x_2=(x_2+x_4)/2;
	y_1=(y_1+y_2)/2;
	y_2=(y_3+y_4)/2;
	adjust_a=(float)(240.0/(x_2-x_1));
	adjust_b=(float)(279-adjust_a*x_2);
	adjust_c=(float)(180.0/(y_2-y_1));
	adjust_d=(float)(209-adjust_c*y_2);
}
	
	
	
	
	
	
	
	
		
		

⌨️ 快捷键说明

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