?? touch.c
字號(hào):
#include <stdio.h>
#include "touch.h"
#include "../timeer/timeer.h"
#define GUI_TOUCH_XSIZE LCD_WIDTH
#define GUI_TOUCH_YSIZE LCD_HEIGHT
#define GUI_TOUCH_AD_LEFT (1185)
#define GUI_TOUCH_AD_RIGHT (99)
#define GUI_TOUCH_AD_TOP (168)
#define GUI_TOUCH_AD_BOTTOM (1120)
#define STATE_PEN_DOWN (1)
#define STATE_PEN_UP (2)
static int s_nPenState = STATE_PEN_UP;
static int timerID = -1;
static int xynum = 0;
static int cx = 0;
findxy_t chfindxy[20]={0};
int TOUCH_AD2X(int nAdxValue)
{
int nTempVal = 0;
nTempVal = (nAdxValue - GUI_TOUCH_AD_LEFT) * (GUI_TOUCH_XSIZE -1);
nTempVal = nTempVal / (GUI_TOUCH_AD_RIGHT - GUI_TOUCH_AD_LEFT);
return nTempVal;
}
int TOUCH_AD2Y(int nAdyValue)
{
int nTempVal = 0;
nTempVal = (nAdyValue - GUI_TOUCH_AD_TOP) * (GUI_TOUCH_YSIZE -1);
nTempVal = nTempVal / (GUI_TOUCH_AD_BOTTOM - GUI_TOUCH_AD_TOP);
return nTempVal;
}
void TOUCH_WaitPenUp()
{
ADCCON = (1<<14)+(9<<6);
ADCTSC = 0x1d3;
ADCUPDN = 0;
}
void TOUCH_WaitPenDown()
{
ADCCON = (1<<14)+(9<<6);
ADCTSC = 0xd3;
ADCUPDN = 0;
}
void TOUCH_findXY()
{
int nIndex = 0;
int nX = 0;
int nY = 0;
int nXCount = 0;
int nYCount = 0;
int nXMin = 2000;
int nXMax = -1;
int nYMin = 2000;
int nYMax = -1;
for(nIndex =0 ; nIndex < 5; nIndex++)
{
nX = chfindxy[nIndex].x;
nY = chfindxy[nIndex].y;
//記錄最小值
if(nX < nXMin)
nXMin = nX;
if(nY < nYMin)
nYMin = nY;
//記錄最大值
if(nX < nXMax)
nXMax = nX;
if(nY < nYMax)
nYMax = nY;
//統(tǒng)計(jì)采樣值
nXCount += nX;
nYCount += nY;
}
nX = (nXCount - nXMin -nXMax) / 3;
nY = (nYCount - nYMin -nYMax) / 3;
cx = nX;
cy = nY;
//LCD_PutPixel(nY,nX,RGB(0,0,0));
}
void TOUCH_GetXY()
{
int nIndex = 0;
int nX = 0;
int nY = 0;
int nXCount = 0;
int nYCount = 0;
int nXMin = 2000;
int nXMax = -1;
int nYMin = 2000;
int nYMax = -1;
char xch[20] = {0};
char ych[20] = {0};
for(nIndex =0 ; nIndex < 6; nIndex++)
{
//開(kāi)始采樣
ADCTSC = ((1<<3)|(1<<2));
ADCCON |= 0x1;
//等待采樣結(jié)束
while(ADCCON & 0x1);
while(!(ADCCON & 0x8000));
//獲取采樣值
nX = (ADCDAT0 & 0x3FF);
nY = (ADCDAT1 & 0x3FF);
//記錄最小值
if(nX < nXMin)
nXMin = nX;
if(nY < nYMin)
nYMin = nY;
//記錄最大值
if(nX < nXMax)
nXMax = nX;
if(nY < nYMax)
nYMax = nY;
//統(tǒng)計(jì)采樣值
nXCount += nX;
nYCount += nY;
}
nX = (nXCount - nXMin -nXMax) / 4;
nY = (nYCount - nYMin -nYMax) / 4;
/*坐標(biāo)電壓打印*/
sprintf(xch,"%d",nX);
sprintf(ych,"%d",nY);
LCD_DrawText(70,40,xch,4,RGB(255,255,255),RGB(0,0,0));
LCD_DrawText(100,40,ych,4,RGB(255,255,255),RGB(0,0,0));
/*邊沿修正*/
if(nX > GUI_TOUCH_AD_LEFT)
nX = GUI_TOUCH_AD_LEFT;
if(nX < GUI_TOUCH_AD_RIGHT)
nX = GUI_TOUCH_AD_RIGHT;
if(nY < GUI_TOUCH_AD_TOP)
nY = GUI_TOUCH_AD_TOP;
if(nY > GUI_TOUCH_AD_BOTTOM)
nY = GUI_TOUCH_AD_BOTTOM;
//將電壓轉(zhuǎn)換為坐標(biāo) 坐標(biāo)獲得后做相應(yīng)的處理
nX = TOUCH_AD2X(nX);
nY = TOUCH_AD2Y(nY);
/*X調(diào)整*/
if(nX<230 && nX>189)
nX+=3;
else if(nX<=54 && nX>5)
nX+=3;
else if(nX<=189 && nX>54)
nX+=3;
else if(nX<=5 && nX>0)
nX+=3;
//Y調(diào)整
if(nY<=240 && nY>170)
nY-=3;
/*坐標(biāo)打印*/
memset(xch,0,sizeof(xch));
memset(ych,0,sizeof(ych));
sprintf(xch,"%d",nX);
sprintf(ych,"%d",nY);
LCD_DrawText(70,80,xch,3,RGB(255,255,255),RGB(0,0,0));
LCD_DrawText(100,80,ych,3,RGB(255,255,255),RGB(0,0,0));
//去掉第一次與最后一次
if(xynum > 1 && xynum <= 6)
{
chfindxy[xynum].x=nX;
chfindxy[xynum].y=nY;
chfindxy[xynum].num=xynum;
}
xynum++;
//發(fā)現(xiàn)第一點(diǎn)
if(xynum == 6)
{
TOUCH_findXY();
//xynum=0;
//memset(chfindxy,0,sizeof(chfindxy));
}
else if(xynum > 6)
{
if(abs(nX-cx) >= 0 && abs(nX-cx) <= 7 && abs(nY-cy) >= 0 && abs(nY-cy) <= 7)
{
cx = nX;
cy = nY;
}
}
//等待中斷提起
TOUCH_WaitPenUp();
}
void TOUCH_Timer()
{
if(s_nPenState == STATE_PEN_DOWN)
{
TOUCH_GetXY();
}
}
void TOUCH_Start()
{
s_nPenState = STATE_PEN_DOWN;
TIMER_TS_Start(timerID);
//等待抬起
TOUCH_WaitPenUp();
}
void TOUCH_Stop()
{
s_nPenState = STATE_PEN_UP;
//等待按下
TOUCH_WaitPenDown();
TIMER_TS_Stop(timerID);
xynum=0;
memset(chfindxy,0,sizeof(chfindxy));
cx=0;
cy=0;
}
void TOUCH_IRQEntry()
{
if(SUBSRCPND & BIT_SUB_TC)
{
if(ADCUPDN & STATE_PEN_DOWN)
{
TOUCH_Start();//按下開(kāi)始采樣
}
else if(ADCUPDN & STATE_PEN_UP)
{
TOUCH_Stop();//抬起結(jié)束采樣
}
SUBSRCPND |= BIT_SUB_TC;
}
}
void TOUCH_Init()
{
xynum=0;
cx=0;
cy=0;
memset(chfindxy,0,sizeof(chfindxy));
IRQ_SetMask(INT_TYPE_INT_ADC,0); //開(kāi)啟一級(jí)中斷
//IRQ_SetMask(INT_TYPE_INT_ADC_S,0);
IRQ_SetMask(INT_TYPE_INT_TC,0);
//INTMSK &= ~BIT_ADC;
//INTSUBMSK &= ~BIT_SUB_TC;
ADCDLY = 30000;
ADCCON = (1 << 14) + (9 << 6);
ADCTSC = 0xd3; //中斷等待模式
IRQ_Install(INT_TYPE_INT_TC,TOUCH_IRQEntry);
//創(chuàng)建軟定時(shí)
timerID = TIMER_TS_Create(10,1,TOUCH_Timer);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -