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

📄 touch7843_44b0.c

📁 AD7843在ADS1.2环境下的一个驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	Rect.x1 = LCD_XSIZE-50;
	Rect.y1 = LCD_YSIZE-50;
	
	Lcd_Clr(DC,bluecolor);
	ellipse (Rect.x0, Rect.y0, 3, 3,redcolor);
	VGA_X = 80;
	VGA_Y = 150;
    Lcd_printf(DC,0x0ff,ncolor," 请长按左上角的小圆,直到小圆消失");
	
	do
	{	
		do
		{
			memset( CHX_AD,0,sizeof(CHX_AD)/4 );
			memset( CHY_AD,0,sizeof(CHY_AD)/4 );
			if(!DPen)
			{
				for(i=0;i<2000000;i++){}
				
				if(!DPen)
				{
					for(i=0;i<sizeof(CHX_AD)/4;i++)
					{
						CHX_AD[i] = ReadAD7843_X();				//读ADS7843坐标数据,连续读5个
						CHY_AD[i] = ReadAD7843_Y();
					}
				
					DataSort( CHX_AD,sizeof(CHX_AD)/4 );		//排序,CHX_AD[0]最小
					DataSort( CHY_AD,sizeof(CHY_AD)/4 );
				}
			}
		}while((CHX_AD[4]-CHX_AD[0] > 1) || (CHY_AD[4]-CHY_AD[0] > 1) || CHX_AD[0]>128 || CHY_AD[0]<128 );
		
		Phys_x0 = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
		Phys_y0 = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;		
		
		Lcd_Clr(DC,bluecolor);
		ellipse (Rect.x1, Rect.y1, 3, 3,redcolor);
		VGA_X = 80;
		VGA_Y = 150;
        Lcd_printf(DC,0x0ff,ncolor," 请长按右下角的小圆,直到小圆消失");
		do
		{
			memset( CHX_AD,0,sizeof(CHX_AD)/4 );
			memset( CHY_AD,0,sizeof(CHY_AD)/4 );		
			if(!DPen)
			{
				for(i=0;i<2000000;i++){}
				
				if(!DPen)
				{
					for(i=0;i<sizeof(CHX_AD)/4;i++)
					{
						CHX_AD[i] = ReadAD7843_X();				//读ADS7843坐标数据,连续读5个
						CHY_AD[i] = ReadAD7843_Y();
					}
				
					DataSort( CHX_AD,sizeof(CHX_AD)/4 );		//排序,CHX_AD[0]最小
					DataSort( CHY_AD,sizeof(CHY_AD)/4 );
				}
			}
		}while((CHX_AD[4]-CHX_AD[0] > 1) || (CHY_AD[4]-CHY_AD[0] > 1) || CHX_AD[0]<128 || CHY_AD[0]>128 );
		
		Phys_x1 = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
		Phys_y1 = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;
		
		i = WQ_TOUCH_Calibrate(0, Rect.x0, Rect.x1, Phys_x0, Phys_x1);	//x
		i = WQ_TOUCH_Calibrate(1, Rect.y0, Rect.y1, Phys_y0, Phys_y1);	//y
				
	}while (i);
	Lcd_Clr(DC,bluecolor);
	VGA_X = 170;
	VGA_Y = 150;
	Lcd_printf(DC,0x0ff,ncolor,"触摸屏校准完成。");
}

/**************************************************************************/
/********************* 触摸屏坐标处理函数 *********************************/
/**************************************************************************/

static void WQ_TOUCH_StoreState(int x,int y)
{
	if ((x >= 0) && (y >= 0)) 
	{
		ellipse (x, y, 3, 3, redcolor);
	} 
	else 
	{
	}
}


/**************************************************************************/
/********************* 触摸屏事件处理函数 *********************************/
/**************************************************************************/

void WQ_TOUCH_Handle(void) 
{
	int CHX_AD[5],CHY_AD[5];
	int Temp_X=0,Temp_Y=0;
	int i,j;
	/* calculate Min / Max values */
	if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) 
	{
		xMin = xyMinMax[GUI_COORD_X].Min;
		xMax = xyMinMax[GUI_COORD_X].Max;
	} 
	else 
	{
		xMax = xyMinMax[GUI_COORD_X].Min;
		xMin = xyMinMax[GUI_COORD_X].Max;
	}
	if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) 
	{
		yMin = xyMinMax[GUI_COORD_Y].Min;
		yMax = xyMinMax[GUI_COORD_Y].Max;
	} 
	else 
	{
		yMax = xyMinMax[GUI_COORD_Y].Min;
		yMin = xyMinMax[GUI_COORD_Y].Max;
	}
	
	for(j=0;j<3;j++)								//最多有三次读触摸屏;
	{
		memset( CHX_AD,0,sizeof(CHX_AD)/4 );
		memset( CHY_AD,0,sizeof(CHY_AD)/4 );
	
		for(i=0;i<sizeof(CHX_AD)/4;i++)
		{
			CHX_AD[i] = ReadAD7843_X();				//读ADS7843坐标数据,连续读5个
			CHY_AD[i] = ReadAD7843_Y();
		}
	
		DataSort( CHX_AD,sizeof(CHX_AD)/4 );		//排序,CHX_AD[0]最小
		DataSort( CHY_AD,sizeof(CHY_AD)/4 );
		
		if(((CHX_AD[4] - CHX_AD[0]) < 3) && ((CHY_AD[4] - CHY_AD[0]) < 3) \
		&& (CHX_AD[1] >xMin) && (CHX_AD[3]<xMax) && (CHY_AD[1] > yMin) && (CHY_AD[3]<yMax))
		{
			Temp_X = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
			Temp_Y = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;
			Temp_X = _AD2X(Temp_X);					//A\D坐标转换为象素坐标
			Temp_Y = _AD2Y(Temp_Y);
			break;									//若读取在允许误差之内则退出;
		}
		else
		{
			for(i=0;i<100;i++);
		}
	}
	if(Temp_X && Temp_Y)
	{
		WQ_TOUCH_StoreState(Temp_X,Temp_Y);			//触摸屏接口函数
	}
	else
	{
		WQ_TOUCH_StoreState(-1,-1);	
	}
}

static unsigned char Touch_DownUp = 0;	//当按下并有效置1;当松开并有效置0;
static void TouchEven_Handle(void)
{
	unsigned char TouchEven = 0;			//按下\松开有效时置1;
	if(Touch_DownUp == 0)
	{
		if( !DPen )
		{
			TouchEven = 1;					//有效点击
		}
		else
		{
			TouchEven = 0;					//无效点击;或者是干扰
		}
	}
	else
	{
		if(DPen)
		{
			TouchEven = 1;					//松开触摸,有效;
		}
		else
		{
			TouchEven = 0;					//干扰;而不是松开触摸
		}
	}
	if(TouchEven)
	{
		if(Touch_DownUp == 0)
		{
			Touch_DownUp = 1;
			WQ_TOUCH_Handle();				//调用自己编写的触摸屏处理函数
		}
		else
		{
			Touch_DownUp = 0;
			WQ_TOUCH_StoreState(-1,-1);
		}
	}
}

static void Timer2_On(void)
{
	rTCON |= Timer2_Update;			//装载定时器初值;
	rTCON &= ~Timer2_Update;
	rI_ISPC = BIT_TIMER2;			//清除中断标志
	rINTMSK &= ~BIT_TIMER2;			//Timer2 interrupt enable;
	rTCON |= Timer2_Start;			//启动定时器2, 20ms后中断
}
static void Timer2_Off(void)
{
	rINTMSK |= BIT_TIMER2;			//Timer2 interrupt disable;
	rTCON &= ~Timer2_Start;			//Timer2 stop;
}

static void __irq Timer2_Int(void)
{
	Timer2_Off();
	TouchEven_Handle();
	rI_ISPC = BIT_TIMER2;			//清除中断标志
}


static void Timer2Interrupt_Init(void)	//定时器2中断注册
{
	unsigned int kc;
    kc = 0xffffff & ( ( (int)Timer2_Int - (unsigned int)ISR_TIMER2-8 )>>2 );
    *(unsigned int*)ISR_TIMER2 = 0xEA000000 |kc ;
}


static void Timer2_Init(void)
{
	rTCFG0 &= ~(0xff<<8);
	rTCFG0 |= (0x95<<8);			//Timer2预分频->150;
	rTCFG1 &= ~(0x0f<<8);
	rTCFG1 |= (0x03<<8);			//Timer2分割器->1/16;MCLK = 60M; Timer2CLK = 25000Hz
	
	rTCON &= ~(0x0f<<12);			//Timer2: auto load->off;inverter->off;
	rTCNTB2 = 0x2ee;				//Timer2 初值;定时30ms;
	Timer2Interrupt_Init();
	rI_ISPC = BIT_TIMER2;			//清除中断标志
}

unsigned char Touch7843_Init(void)
{
	//GPC2=Output(7843_DIN);GPC0=Input(7843_DOUT);GPC3=Output(7843_DCLK);
	rPCONC &= ~( 0xff );
	rPCONC |=  ( 0x50 );
	
	rPUPC &= ~( 0x0f );
	rPUPC |= ( 0x03 );				//Pin 7843_DOUT pull up disable;

	ReadAD7843_X();
	ReadAD7843_Y();					//初始化ADS7843;
	Timer2_Init();
	return 1;
}

void GUI_Touch_Check(void)
{
	if( !Touch_DownUp && !DPen && !(rTCON&Timer2_Start) )
	{
		Timer2_On();
	}
	if( Touch_DownUp && DPen && !(rTCON&Timer2_Start) )
	{
		Timer2_On();
	}
}

void OS_Touch_Check(void)
{
	if( !Touch_DownUp && !DPen )
	{
		//OSTimeDly(20);
		TouchEven_Handle();
	}
	if( Touch_DownUp && DPen )
	{
		//OSTimeDly(20);
		TouchEven_Handle();
	}
}


void ReadTouch_Data(void)
{
	int TempXMin,TempXMax,TempYMin,TempYMax;
	
	TempXMin=Rd24LCxx(0xa0,0);
	TempXMax=Rd24LCxx(0xa0,1);
	TempYMin=Rd24LCxx(0xa0,2);
	TempYMax=Rd24LCxx(0xa0,3);
	
	if(labs(xyMinMax[GUI_COORD_X].Min-TempXMin)<20 && labs(xyMinMax[GUI_COORD_X].Max-TempXMax)<20)
	{
		xyMinMax[GUI_COORD_X].Min = TempXMin;
		xyMinMax[GUI_COORD_X].Max = TempXMax;
	}
	if(labs(xyMinMax[GUI_COORD_Y].Min-TempYMin)<20 && labs(xyMinMax[GUI_COORD_Y].Max-TempYMax)<20)
	{
		xyMinMax[GUI_COORD_Y].Min = TempYMin;
		xyMinMax[GUI_COORD_Y].Max = TempYMax;
	}
}

void Touch_Task(void)
{
	GUI_Touch_Check();
}


⌨️ 快捷键说明

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