?? touch.c
字號:
#include "Touch.h"
#include "../../target/2410addr.h"
#include "../../ucos-ii/includes.h"
#include "../../target/2410lib.h"
#define ADCPRS 39
#define TOUCH_XSIZE (240)
#define TOUCH_YSIZE (320)
#define TOUCH_AD_LEFT 0x2a//0x16//0x15b//0x120
#define TOUCH_AD_RIGHT 0x3e8//0x1fe//0xec8//0xe70
#define TOUCH_AD_TOP 0x30//0x200//0x1d6//0x230
#define TOUCH_AD_BOTTOM 0x3d0//0x3d8//0xdee//0xdf0
static int xMin;
static int xMax;
static int yMin;
static int yMax;
#define TOUCH_SWAP_XY 0// 0
#define TOUCH_MIRROR_X 0
#define TOUCH_MIRROR_Y 1
#define COORD_X 0
#define COORD_Y 1
typedef struct {int Min; int Max; } tMinMax;
static tMinMax xyMinMax[2] = {
#if ((TOUCH_SWAP_XY==0) && (TOUCH_MIRROR_X==0)) || ((TOUCH_SWAP_XY) && (TOUCH_MIRROR_Y==0))
{ TOUCH_AD_LEFT, TOUCH_AD_RIGHT },
#else
{ TOUCH_AD_RIGHT, TOUCH_AD_LEFT },
#endif
#if ((TOUCH_SWAP_XY==0) && (TOUCH_MIRROR_Y==0)) || ((TOUCH_SWAP_XY) && (TOUCH_MIRROR_X==0))
{ TOUCH_AD_TOP, TOUCH_AD_BOTTOM }
#else
{ TOUCH_AD_BOTTOM, TOUCH_AD_TOP }
#endif
};
int AD2X(int adx) {
INT32 r = adx - xyMinMax[COORD_X].Min;
r *= TOUCH_XSIZE - 1;
return r / (xyMinMax[COORD_X].Max - xyMinMax[COORD_X].Min);
}
int AD2Y(int ady) {
INT32 r = ady - xyMinMax[COORD_Y].Min;
r *= TOUCH_YSIZE - 1;
return r/(xyMinMax[COORD_Y].Max - xyMinMax[COORD_Y].Min);
}
extern OS_EVENT *pLcdTask_MsgQueue;
STRU_TOUCH_MSG StruMsg_Touch;
void *Touch_Isr(void)
{
static int xPhys, yPhys;
int x,y;
/* calculate Min / Max values */
if (xyMinMax[COORD_X].Min < xyMinMax[COORD_X].Max) {
xMin = xyMinMax[COORD_X].Min;
xMax = xyMinMax[COORD_X].Max;
} else {
xMax = xyMinMax[COORD_X].Min;
xMin = xyMinMax[COORD_X].Max;
}
if (xyMinMax[COORD_Y].Min < xyMinMax[COORD_Y].Max) {
yMin = xyMinMax[COORD_Y].Min;
yMax = xyMinMax[COORD_Y].Max;
} else {
yMax = xyMinMax[COORD_Y].Min;
yMin = xyMinMax[COORD_Y].Max;
}
rINTSUBMSK|=(BIT_SUB_ADC|BIT_SUB_TC); // Mask sub interrupt (ADC and TC)
// TC(Touch screen Control) Interrupt
if(rADCTSC&0x100)
{
// Uart_Printf("\nStylus Up!!\n");
rADCTSC&=0xff; // Set stylus down interrupt
}
else
{
// Uart_Printf("\nStylus Down!!\n");
// <Auto X-Position and Y-Position Read>
rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);
// Stylus Down,Don't care,Don't care,Don't care,Don't care,XP pullup Dis,Auto,No operation
rADCCON|=0x1; // Start Auto conversion
while(rADCCON & 0x1); //check if Enable_start is low
while(!(0x8000&rADCCON)); // Check ECFLG
StruMsg_Touch.ulType = MSG_TYPE_TOUCH;
xPhys = 0x3ff&rADCDAT0;
yPhys = 0x3ff&rADCDAT1;
if ((xPhys <xMin) | (xPhys>xMax) | (yPhys <yMin) | (yPhys>yMax)) {
}
else
{
x = AD2X(xPhys);
y = AD2Y(yPhys);
StruMsg_Touch.ulPara1 = x;
StruMsg_Touch.ulPara2 = y;
if (OSQPostInIsr(pLcdTask_MsgQueue, (void*)(&StruMsg_Touch)) == OS_Q_NEED_CONTEXT)
{
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
rSUBSRCPND|=BIT_SUB_TC;
rINTSUBMSK&=~(BIT_SUB_TC); // Unmask sub interrupt (TC)
ClearPending(BIT_ADC);
IrqStart();
return (IrqFinish());
}
}
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
// Stylus Up,Don't care,Don't care,Don't care,Don't care,XP pullup En,Normal,Waiting mode
}
rSUBSRCPND|=BIT_SUB_TC;
rINTSUBMSK&=~(BIT_SUB_TC); // Unmask sub interrupt (TC)
ClearPending(BIT_ADC);
}
extern void Touch_IsrHandle(void);
void TOUCH_Init(void)
{
rADCDLY=(50000); // ADC Start or Interval Delay
rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
// Enable Prescaler,Prescaler,AIN5/7 fix,Normal,Disable read start,No operation
rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);//tark
// Down,YM:GND,YP:AIN5,XM:Hi-z,XP:AIN7,XP pullup En,Normal,Waiting for interrupt mode
pISR_ADC=(unsigned)Touch_IsrHandle;
rINTMSK &= ~(BIT_ADC);
rINTSUBMSK &= ~(BIT_SUB_TC);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -