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

📄 drv_ad2lcd.c

📁 一款SmartPhone的驱动代码
💻 C
字号:
/***********************************************************************
*									*
*	Copyright (C) SEIKO EPSON CORP. 2000				*
*									*
*	File name: add2lcdd.c						*
*	  This file includes some functions which translate the touch   *
*	  panel AD data to the LCD pixel data				*
*	  Note: in this file x means the long axes,y means the short axes
*		eg. in 160x240 LCD x=240,y=160				*
*	  								*
*									*
*	Revision history						*
*		2000.06.30	Kurt Shen	Start.			*
*		2000.08.14	Kurt Shen	add tp_mapping function	*
************************************************************************/
#include "sysMCU.h"

unsigned short get_avrg(unsigned short *);
unsigned short get_avrg_adj(unsigned short *);
float get_x_step(unsigned short,unsigned short);
float get_y_step(unsigned short,unsigned short);
short get_lcdd(unsigned short,float);
short get_xlcdd(unsigned short,float);
short get_ylcdd(unsigned short,float);
void tp_mapping(void);//814

extern float x_step,y_step;//814
unsigned short x0;		// the x_add of (0,0) point in lcd
unsigned short y0;		// the y_add of (0,0) point in lcd
unsigned short x240;		// the x_add of (160,240) point in lcd
unsigned short y160;		// the x_add of (160,240) point in lcd
unsigned char x_tp_map[256];//814
unsigned char y_tp_map[512];//814

/*******************************************************************************
 * get_avrg
 *   Type :	void
 *   Input:	 add <- (x_add[0] or y_add[0]),step <- (x_step or y_step size)
 *   Ret val :	add_avrg <- x or y axes average ad data
 *   Argument :	void
 *   Function :	average touch panel ad data
 *******************************************************************************/
unsigned short get_avrg(unsigned short *add)
{ 	
	unsigned char i_get_avrg;
	unsigned short add_max;
	unsigned short add_min;
	unsigned short add_ma;
	unsigned short add_mi;
	unsigned short add_sum;
	unsigned short add_avrg;
	
	add_max = *add;
	add_min = *add;
	add_ma = *add;
	add_mi = *add;
	add_sum = *add;
	add_avrg = *add;
	
	
	for(i_get_avrg=1;i_get_avrg<AD_DATA_NUM;i_get_avrg++)
	{
		add ++;
		if((*add)>add_max)
		{
			add_ma = add_max; // get the 2nd max add
			add_max = *add;	// get the max x_add or y_add
		}
		else
		{
			if((*add)<add_min)
			{
				add_mi = add_min; // get the 2nd min add
				add_min= *add;	// get the min x_add or y_add
			}
		}
				
		add_sum += (*add);	// sum all x_add or y_add
	}
	
	if((add_ma-add_mi)>0x10) return(0);	// error ad data
			
	add_avrg = (add_sum - add_max - add_min) / (AD_DATA_NUM-2); //average x_add or y_add except max & min
	
	if ((add_avrg<0x50) || (add_avrg>0x3df)) return(0); //error ad data
	
	return(add_avrg);		// average T/P ad data


}
 

/*******************************************************************************
 * get_avrg_adj
 *   Type :	void
 *   Input:	 add <- (x_add[0] or y_add[0]),step <- (x_step or y_step size)
 *   Ret val :	add_avrg <- x or y axes average ad data
 *   Argument :	void
 *   Function :	average ad data, just used in getting adjust point ad data
 *******************************************************************************/
unsigned short get_avrg_adj(unsigned short *add)
{ 	
	unsigned char i_get_avrg;
	unsigned short add_max;
	unsigned short add_min;
	unsigned short add_ma;
	unsigned short add_mi;
	unsigned short add_sum;
	unsigned short add_avrg;
	
	add_max = *add;
	add_min = *add;
	add_ma = *add;
	add_mi = *add;
	add_sum = *add;
	add_avrg = *add;
	
	for(i_get_avrg=1;i_get_avrg<AD_DATA_NUM;i_get_avrg++)
	{
		add ++;
		if((*add)>add_max)
		{
			add_ma = add_max; // get the 2nd max add
			add_max = *add;	// get the max x_add or y_add
		}
		else
		{
			if((*add)<add_min)
			{
				add_mi = add_min; // get the 2nd min add
				add_min= *add;	// get the min x_add or y_add
			}
		}
				
		add_sum += (*add);	// sum all x_add or y_add
	}
	
	if((add_ma-add_mi)>0x10) return(0);	// error ad data
			
	add_avrg = (add_sum - add_max - add_min) / (AD_DATA_NUM-2); //average x_add or y_add except max & min
	
	if ((add_avrg<0x50)) return(0); //error ad data
	
	return(add_avrg);		// average T/P ad data

	
}

/******************************************************************************
 * get_x_step
 *   Type :	float
 *   Input:	upper_left x_add,lower_right x_add
 *   Ret val :	x axes data
 *   Argument :	float
 *   Function :	get the lcd dot step from ad data
 *		caculate x0 & x120 from x_add_lr & x_add_ul
 *******************************************************************************/
float get_x_step(unsigned short x_add_ul,unsigned short x_add_lr)
{
	
	float x_step;
	x_step = (x_add_ul-(float)x_add_lr) / (120-2*MARGIN);
	
	x0 = x_add_ul + x_step*MARGIN;
	x240 = x_add_lr - x_step*MARGIN;
	
	return(x_step);
}

/*******************************************************************************
 * get_y_step
 *   Type :	float
 *   Input:	upper_left y_add,lower_right y_add
 *   Ret val :	y axes data
 *   Argument :	float
 *   Function :	get the lcd dot step from ad data
 *		caculate y0 & y160 from y_add_lr & y_add_ul
 *******************************************************************************/
float get_y_step(unsigned short y_add_ul,unsigned short y_add_lr)
{
	float y_step;
	y_step = ((float)y_add_ul-(float)y_add_lr) / (160-2*MARGIN);
	
	y0 = y_add_ul + y_step*MARGIN;
	y160 = y_add_lr - y_step*MARGIN;

	return(y_step);
}

/****************************814************************************************
 * Function name: tp_mapping
 *   Input:	void 
 *   Ret val :	void
 *   Argument :	none
 *   Function :	map the touch panel AD data to LCD data
 *		AD data  : num*4
 *	`	LCD data : x_tp_map[num],y_tp_map[]
 *
 *   Histroy : 
 *		2000,08,14	Kurt Shen	star
 *	
 *******************************************************************************/
void tp_mapping(void)
{
	unsigned short num;
	
	for(num=0;num<TP_ADD_MIN/2+1;num++)
	{
		y_tp_map[num]=255;			// set the overanged AD data to 0xff
	}
	for(num=TP_ADD_MIN/2+1;num<TP_ADD_MAX/2;num++)	// map add data to lcd data
	{
		y_tp_map[num]=(unsigned char)((y0-num*2)/y_step+0.5);	
	}
	for(num=TP_ADD_MAX/2;num<512;num++)
	{
		y_tp_map[num]=255;			// set the overanged AD data to 0xff
	}
	
	for(num=0;num<TP_ADD_MIN/4+1;num++)
	{
		x_tp_map[num]=255;			// set the overanged AD data to 0xff
	}
	
	for(num=TP_ADD_MIN/4+1;num<TP_ADD_MAX/4;num++)// map add data to lcd data
	{
		x_tp_map[num]=(unsigned char)((x0-num*4)/x_step+0.5);
	}
	
	for(num=TP_ADD_MAX/4;num<256;num++)
	{
		x_tp_map[num]=255;			// set the overanged AD data to 0xff
	}
}

⌨️ 快捷键说明

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