📄 drv_touchpanel.c
字号:
/****************************************************************************************************************
* *
* 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 + -