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

📄 drv_touchpanel.c

📁 Epson系列芯片开发的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************************************
 *														*
 *	Copyright (C) SEIKO EPSON CORP. 2000									*
 *														*
 *	File name: Touch_Panel.c										*
 *	  This is touch panel interface driver. 								*
 *	Note: in this file x means the long axes,y means the short axes 					*
 *		eg. in 120x160 LCD x=160,y=120									*
 *														*
 *	Revision history											*
 *		2002.04.30	Andrew Yin		Start.							*
 *														*
 ***************************************************************************************************************/
#include "common.h"
#include "int.h"
#include "8timer.h"
#include "16timer.h"
#include "ad.h"
#include "io.h"
#include "osc.h"
#include "presc.h"
#include "main.h"

#define MAXSAMPLENUM 		6
#define TOUCHPANELSCANGAP	5
#define TOUCHPANELDITHERINGTIME	10

unsigned char ucCurrentSampleTime; 				// current sample time
unsigned short usaXY[ MAXSAMPLENUM ][ 2 ] ;   			// usaXY[][0]: X coordinate; usaXY[][1] Y coordinate
unsigned short usADValueX, usADValueY;				// X AD Value and Y AD Value
unsigned char ucTouchPanelStatus;				// Pen status:	0	down
								//		1	down2up
								//		2	dithering
								//		3	up

void vInitTouchPanel( void );						// Initial TouchPanel
void vInitTouchPanelIO( void );						// Initial TouchPanel IO port
void vInitTouchPanelAD( void );						// Initial TouchPanel A/D convertor
void vIntTouchPanel( void);						// Interrupt Sevice routine of TouchPanel pen down
void vTouchPanelDitherHandler( unsigned char ucDelayMiliSecond );	// Dithering Handler and scan gap
void vTouchPanelScanStop( void );					// TouchPanel scan stop
void vIntTouchPanelScanHandler( void );					// TouchPanel scan routine
unsigned char ucTouchPanelAverageADValue( unsigned char ucSampleNumber, 
	unsigned short *pusXADValue, unsigned short *pusYADValue );	// Caculate the Average of MAXSAMPLENUM's A/D Value
unsigned char ucTouchPanelGetCoordinate( unsigned short *pusXADValue, 
	unsigned short *pusYADValue );					// Get the TouchPanel A/D Value

void vIntTouchPanelAD( void );


/****************************************************************************************************************
 * vInitTouchPanel
 *   Type :	void
 *   Ret val :	none
 *   Argument :	void
 *   Function :	Initialize TouchPanel
 ****************************************************************************************************************/
void vInitTouchPanel( void )
{
	vInitTouchPanelIO( );
	vInitTouchPanelAD( );
}

/****************************************************************************************************************
 * vInitTouchPanelIO
 *   Type :	void
 *   Ret val :	none
 *   Argument :	void
 *   Function :	Initialize I/O port of TouchPanel
 ****************************************************************************************************************/
void vInitTouchPanelIO( void )
{
	// Initial #PENINT pin.
	*(volatile unsigned char *)0x402C3 &= 0x0FB;
	// Key interrupt group1( FPK1 ) K62 ( #PENINT ) interrupt condition setting, low active
	*(volatile unsigned char *)0x402CD |= 0x04;
	// Key interrupt group1(FPK1) mask setting
	*(volatile unsigned char *)IN_SMPK1_ADDR |= 0x04;	//Enable K62 ( #PENINT ) interrupt
	// Set #PENINT pin interrupt priority: 4 level.
	*(volatile unsigned char *)0x40262 &= 0x0F;
	*(volatile unsigned char *)0x40262 |= 0x40;
	
	*( volatile unsigned char * )0x40280 |= 0x20;		// reset FPK1 interrupt flag
	*( volatile unsigned char * )0x40270 |= 0x20;		// enable FPK1 interrupt
	
	// Initial BXH, BXL, BYH, BYL pins
	//[0x402DC]
 	*(volatile unsigned char *)IO_CFP3_ADDR &= 0x03;	// select P2 function: P32,P33,P34,P35
 	//[0x402DE]
 	*(volatile unsigned char *)IO_IOC3_ADDR |= 0x3C;	// set P32,P33,P34,P35 output
 	//[0x402DD]
 	*(volatile unsigned char *)IO_P3D_ADDR |= 0x34;		// set P34(BYH) = 1,P32(BXH) = 1,P35(BYL) = 1,
	*(volatile unsigned char *)IO_P3D_ADDR &= 0x0F7;	// set P33(BXL) = 0
}

/****************************************************************************************************************
 * vInitTouchPanelAD
 *   Type :	void
 *   Ret val :	none
 *   Argument :	void
 *   Function :	Initialize A/D converter.
 ***************************************************************************************************************/
void vInitTouchPanelAD( void )
{
	//[0x40244] Disable all AD when setting.
	*(volatile unsigned char *)AD_OWE_ADDR = 0x00;

	//[0x402C3] function: select analog input PIN: AD0,AD1
	*(volatile unsigned char *)IN_CFK6_ADDR |= 0x03;

	//[0x40181]=0 [0x40181], select perscaler clock source: OCS3
	*(volatile unsigned char *)OSC_PSCDT0_ADDR = OSC_PSCDT0_OSC3;
	
	//[0x4014f]|=0x0B set input clock :(3.75MHz)-- Fpscin/16 ;perscaler -> A/D ( 0x0C:Fpscin/32->1.875MHz )
	*(volatile unsigned char *)PRESC_PSAD_ADDR = 0x0B;
							 					
	//[0x40243] = 0x00 A/D convertion order start chanel AD0 and end chanel AD0
	*(volatile unsigned char *)AD_CS_ADDR = AD_CE_0 | AD_CS_0;
	
	//[0x40244] = 0x04 A/D converter enable, A/D converter stop, A/D converter over write error clear
	*(volatile unsigned char *)AD_OWE_ADDR = AD_ADE_ENA | AD_ADST_STOP | AD_OWE_NOERR;
	
	//[0x40242] = 0x00 select A/D normal mode & trigger by software
	*(volatile unsigned char *)AD_CH_ADDR = AD_TS_SOFT;	
	
	//[0x40245] = 0x03 select the sampling time x9 clock
	*(volatile unsigned char *)AD_ST_ADDR = AD_ST_9;
	
	//[0x40293] &=0xFB set AD Interrupt request on,not IDMA request on
	*(volatile unsigned char *)INT_RS1_RADE_RP4_ADDR &=0xFB;
	
	//[0x40297] &=0xFD set AD IDMA enable off
	*(volatile unsigned char *)0x40297 &= 0xFB;
	
	//[0x4026a] set AD interrupt level 5
	*(volatile unsigned char *)INT_PSIO1_PAD_ADDR &= 0x0F;
	*(volatile unsigned char *)INT_PSIO1_PAD_ADDR |= 0x50;

	//[0x40287] Reset A/D converter interrupt factor flag
	*(volatile unsigned char *)INT_FADE_FCTM_FP4_ADDR |= 0x01;
	
	//[0x40277] set AD interrupt enable
	//*(volatile unsigned char *)INT_EADE_ECTM_EP4_ADDR |= 0x01;
}

/***************************************************************************************************************
 * vIntTouchPanel
 *   Type:	void
 *   Input:	void
 *   Ret val:	void
 *   Argument:	void
 *   Function:	TouchPanel interrupt service routine, Start 16 bit timer3 to scan, 
 *				and disable TouchPanel interrupt,till Pen up
 **************************************************************************************************************/
void vIntTouchPanel( void)
{
	asm("pushn	%r15");
	*(volatile unsigned char *)IN_SMPK1_ADDR &= 0x0FB;	// mask(disable) FPK1(K62) interrupt
	*( volatile unsigned char * )0x40280 |= 0x20;		// reset FPK1 interrupt flag
	vTouchPanelDitherHandler( TOUCHPANELDITHERINGTIME );	//start 16 bits timer3 to eliminate dithering
	asm("popn	%r15");
	asm("reti");
}

/***************************************************************************************************************
 * ucTouchPanelAverageADValue
 *   Type :	void
 *   Input:	unsigned char ucSampleNumber
 *   Ret val :	validate data numbers
 *   Argument :	void
 *   Function :	calculate average of "ucSampleNumber" times AD value & 
 *				put it into the buffer *pusXADValue and *pusYADValue
 **************************************************************************************************************/
unsigned char ucTouchPanelAverageADValue( unsigned char ucSampleNumber, unsigned short *pusXADValue, unsigned short *pusYADValue )
{
	unsigned char i;
	unsigned short usMaxX, usMinX, usMaxY, usMinY;
	
	*pusXADValue = *pusYADValue = 0x0000;
	
	usMaxX = usMinX = usaXY[0][0];
	usMaxY = usMinY = usaXY[0][1];
	for( i = 0; i < ucSampleNumber; i++ )
	{
		usMaxX = ( usaXY[i][0] > usMaxX ? usaXY[i][0] : usMaxX);
		usMinX = ( usaXY[i][0] < usMinX ? usaXY[i][0] : usMinX);
		usMaxY = ( usaXY[i][1] > usMaxY ? usaXY[i][1] : usMaxY);
		usMinY = ( usaXY[i][1] < usMinY ? usaXY[i][1] : usMinY);
				
		*pusXADValue += usaXY[i][0];
		*pusYADValue += usaXY[i][1];
	}
	
	if( usMaxX - usMinX > 0x50 || usMaxY - usMinY > 0x50 )
		return ( 0 );
	
	*pusXADValue -= usMaxX;
	*pusXADValue -= usMinX;
	*pusYADValue -= usMaxY;
	*pusYADValue -= usMinY;
	
	ucSampleNumber -= 2;
	
	*pusXADValue /= ucSampleNumber;
	*pusYADValue /= ucSampleNumber;
	return( 1 );
}

/**************************************************************************************************************
 * ucTouchPanelGetCoordinate
 *   Type:	unsigned char
 *   Argument:	pusXADValue, pusYADValue
 *   Function:	interrupt service when 8 bits Timer0 set by "TK_Scan_Start(ucDelayMiliSecond)" underflow
 *              		1. get "ucSampleNumber times" of coordinate.
 *				2. average the coordinates to 1 coordinate
 *				3. set again for next scan time gap
 *				4. stop to scan if coordinate is out of area(pen up)
 *   Ret val:	pusXADValue,pusYADValue is return value of x,y AD value(Not X,Y coordinate!!!)
 *		0:	Pen still down ,pusXADValue,pusYADValue returned with correct value
 *		1: 	Pen Up,	pusXADValue,pusYADValue returned with last Pen coordinate

⌨️ 快捷键说明

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