?? tchscr.c
字號(hào):
#include "44b.h"
#include "LCD320.h"
#include "tchScr.h"
#include "maro.h"
#define ADS7843_CMD_X (ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
//采樣x軸電壓值,數(shù)據(jù)為12位,參考電壓輸入模式為差分模式,允許省電模式
#define ADS7843_CMD_Y (ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
int TchScr_Xmax=1876,TchScr_Xmin=269,
TchScr_Ymax=229,TchScr_Ymin=1725;//觸摸屏返回電壓值范圍
void TchScr_GetScrXY(int *x, int *y, U8 bCal)
{//獲得觸摸點(diǎn)坐標(biāo)
unsigned int temp;
rPDATF&=~ADS7843_PIN_CS;//打開ADS7843
SendSIOData(ADS7843_CMD_X);//發(fā)送讀取x電壓值控制字
SendSIOData(0);//等待8個(gè)時(shí)鐘節(jié)拍,因?yàn)橥瓿梢晦D(zhuǎn)換需要16個(gè)時(shí)鐘
temp=ReadSIOData();//讀取采樣值高8位
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();//讀取低8位并與以前高8位組成16位數(shù)據(jù)
*x=(temp>>4);//去掉低4位,保留12位有效數(shù)據(jù)
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
*x>>=2; //采樣4次取平均值
//讀取y電壓值
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(0);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
*y>>=2;
rPDATF|=ADS7843_PIN_CS;//關(guān)閉ADS7843
if(bCal){//對(duì)采樣結(jié)果進(jìn)行轉(zhuǎn)換
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
}
}
U32 TchScr_GetOSXY(int *x, int *y)
{//獲得觸摸點(diǎn)坐標(biāo)并返回觸摸動(dòng)作
static U32 mode=0;
static int oldx,oldy;
int i,j;
for(;;){
if((mode!=TCHSCR_ACTION_DOWN) && (mode!=TCHSCR_ACTION_MOVE)){
if(!TCHSCR_IsPenNotDown){//有觸摸動(dòng)作
TchScr_GetScrXY(x, y,TRUE);//得到觸摸點(diǎn)坐標(biāo)
for(i=0;i<40;i++){
if(TCHSCR_IsPenNotDown)//抬起
break;
Delay(100);
}
if(i<40){ //在規(guī)定的雙擊時(shí)間之內(nèi)抬起,檢測(cè)是不是及時(shí)按下
for(i=0;i<60;i++){
if(!TCHSCR_IsPenNotDown){
if (i<10) {i=60;break;}//如果單擊后很短時(shí)間內(nèi)按下,不視為雙擊
mode=TCHSCR_ACTION_DBCLICK;
for(j=0;j<40;j++) Delay(100);//檢測(cè)到雙擊后延時(shí),防止拖尾
break;
}
Delay(100);
}
if(i==60) //沒(méi)有在規(guī)定的時(shí)間內(nèi)按下
mode=TCHSCR_ACTION_CLICK;
}
else{ //沒(méi)有在規(guī)定的時(shí)間內(nèi)抬起
mode=TCHSCR_ACTION_DOWN;
}
break;
}
}
else{
if(TCHSCR_IsPenNotDown){ //抬起
mode=TCHSCR_ACTION_UP;
*x=oldx;
*y=oldy;
return mode;
}
else{
TchScr_GetScrXY(x, y,TRUE);
if(ABS(oldx-*x)>4 ||ABS( oldy-*y)>4){//有移動(dòng)動(dòng)作
mode=TCHSCR_ACTION_MOVE;
break;
}
}
}
Delay(50);
}
oldx=*x;
oldy=*y;
return mode;
}
void TchScr_Test()
{
U32 mode;
int x,y;
Uart_Printf("\nplease touch the screen\n");
for(;;){
mode=TchScr_GetOSXY(&x, &y);
switch(mode){
case TCHSCR_ACTION_CLICK:
Uart_Printf("Action=click:x=%d,\ty=%d\n",x,y);
break;
case TCHSCR_ACTION_DBCLICK:
Uart_Printf("Action=double click:x=%d,\ty=%d\n",x,y);
break;
case TCHSCR_ACTION_DOWN:
Uart_Printf("Action=down:x=%d,\ty=%d\n",x,y);
break;
case TCHSCR_ACTION_UP:
Uart_Printf("Action=up:x=%d,\ty=%d\n",x,y);
break;
case TCHSCR_ACTION_MOVE:
Uart_Printf("Action=move:x=%d,\ty=%d\n",x,y);
break;
}
Delay(1000);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -