📄 tchscr.c
字号:
#include "..\startup\44b.h"
#include "..\inc\drv\LCD320.h"
#include "..\inc\drv\tchScr.h"
#include "..\inc\maro.h"
#include "..\inc\drv\flash.h"
#include "..\ucos-ii\uhal\uhal.h"
#include "..\ucos-ii\add\osaddition.h"
#include "../ucos-ii/Uhal/isr.h"
#define TS_OPEN_INT() do{rPCONG |= (3<<10);}while(0) //into EXINT mode
#define TS_CLOSE_INT() do{rPCONG &= ~(3<<10);}while(0)//into input mode
#define ENABLE_7843() do{rPDATF&=~ADS7843_PIN_CS;}while(0)
#define DISABLE_7843() do{rPDATF|=ADS7843_PIN_CS;}while(0)
#define TCHSCR_PenDown() ((rPDATG&ADS7843_PIN_PEN)==0)
#if OS_Touch_Screen_Task==1
static OS_EVENT* pTouchBeginSem=NULL;
#endif
static int penStatus=TCHSCR_ACTION_NULL;
#define ADS7843_CMD_X (ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
#define ADS7843_CMD_Y (ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
int TchScr_Xmax=1840,TchScr_Xmin=176,
TchScr_Ymax=195,TchScr_Ymin=1910;
extern U32 ConfigSysdata[];
extern U8 isConfigsysLoad;
static void LoadAxisMax()
{
if(!isConfigsysLoad)
return;
TchScr_Xmax=ConfigSysdata[0];
TchScr_Xmin=ConfigSysdata[1];
TchScr_Ymax=ConfigSysdata[2];
TchScr_Ymin=ConfigSysdata[3];
if(TchScr_Xmax==TchScr_Xmin || TchScr_Ymax==TchScr_Ymin){
TchScr_Xmax=1840;
TchScr_Xmin=176;
TchScr_Ymax=195;
TchScr_Ymin=1910;
Uart_Printf("\nerror touch screen data!");
LCD_printf("error touch screen data!\n");
return;
}
Uart_Printf("\nLoad touch screen data OK!\n");
LCD_printf("Load touch screen data OK!\n");
}
void TchScr_init()
{
LoadAxisMax();
}
#if OS_Touch_Screen_Task==1
static void TchScr_GetScrXY(int *x, int *y)
{
unsigned int tempx[8],tempy[8],maxt,mint,sumt,i;
//rPDATF&=~ADS7843_PIN_CS;
ENABLE_7843();
SendSIOData(ADS7843_CMD_X);
for(i=0;i<8;i++)
{
SendSIOData(0);
tempx[i]=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
tempx[i]<<=8;
tempx[i]|=ReadSIOData();
tempx[i]>>=4;
SendSIOData(0);
tempy[i]=ReadSIOData();
SendSIOData(ADS7843_CMD_X);
tempy[i]<<=8;
tempy[i]|=ReadSIOData();
tempy[i]>>=4;
}
//SendSIOData(0); //最后送出ADS7843_CMD_X控制字后补充16个脉冲
//SendSIOData(0);
//rPDATF|=ADS7843_PIN_CS;
DISABLE_7843();
maxt=tempx[0];mint=tempx[0];sumt=tempx[0];
for(i=1;i<8;i++)
{if(tempx[i]>maxt)maxt=tempx[i];
if(tempx[i]<mint)mint=tempx[i];
sumt+=tempx[i];
}
sumt=(sumt-maxt-mint)/6;
*x=sumt;
maxt=tempy[0];mint=tempy[0];sumt=tempy[0];
for(i=1;i<8;i++)
{if(tempy[i]>maxt)maxt=tempy[i];
if(tempy[i]<mint)mint=tempy[i];
sumt+=tempy[i];
}
sumt=(sumt-maxt-mint)/6;
*y=sumt;
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
}
/*
static void TchScr_GetScrXY(int *x, int *y)
{
unsigned int temp;
ENABLE_7843();
SendSIOData(ADS7843_CMD_X);
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_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; //x=x/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(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; //y=y/4;
DISABLE_7843();
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
}
*/
static void Touch_Screen_ISR(void)
{
TS_CLOSE_INT();
if (TCHSCR_PenDown()) {
//penStatus=TCHSCR_ACTION_DOWN;
OSSemPost(pTouchBeginSem);
}
else{
TS_OPEN_INT();
}
}
#define SendTS(TchScrAction) do\
{ pmsg=OSCreateMessage(NULL, OSM_TOUCH_SCREEN,(y<<16)|(x&0xffff),TchScrAction); \
SendMessage(pmsg);\
}while(0)
void Touch_Screen_Task(void *Id) //触摸屏任务
{
int x,y,i;
U32 TchScrAction;
POSMSG pmsg;
INT8U err,sta;
Uart_Printf("begin TouchScreen Task\n");
pTouchBeginSem=OSSemCreate(0);
//设置触摸屏中断处理函数
SetISR_Interrupt(EINT4567_OFFSET, Touch_Screen_ISR, EINT5_OFFSET);
TS_OPEN_INT();
/* for(;;){
OSSemPend(pTouchBeginSem, 0, &err); //wait for Touch Screen Pen down
for(;;){
if (TCHSCR_PenDown()){ //有触摸笔按下
TchScr_GetScrXY(&x, &y);
SendTS(penStatus);
penStatus=TCHSCR_ACTION_MOVE;
}
else{
penStatus=TCHSCR_ACTION_UP;
SendTS(penStatus);
TS_OPEN_INT();
break;
}
OSTimeDly(10);
Uart_Printf("blank\n");
}
} */
sta=0;
for(;;)
{OSSemPend(pTouchBeginSem, 0, &err); //wait for Touch Screen Pen down
for(;;)
{ if(TCHSCR_PenDown())//有触摸屏按下动作
{TchScr_GetScrXY(&x, &y);//获得坐标值
switch(sta)
{case 0: sta=1;break;
case 1: sta=3;
penStatus=TCHSCR_ACTION_DOWN;//连续两次检测到按下则认为DOWN
SendTS(penStatus);
break;
case 3: penStatus=TCHSCR_ACTION_MOVE;//连续三次检测到按下则认为MOVE
SendTS(penStatus);
break;
default : sta=0;break;
}
}
else
{switch(sta)
{case 1: sta=0; // 如果释放前置检测到1次按下,开始分析单双击动作
for(i=0;i<7;i++)
{OSTimeDly(10);
if(TCHSCR_PenDown()) //在规定时间内又检测到按下则认为是双击
{TchScr_GetScrXY(&x, &y);
penStatus=TCHSCR_ACTION_DBCLICK;
SendTS(penStatus);
OSTimeDly(60);
break;
}
}
if(i==7) { //在规定时间内没有检测到新的按下动作认为是单击
penStatus=TCHSCR_ACTION_CLICK;
SendTS(penStatus);}
break;
case 3: sta=0; //在释放前检测到2次以上的按下动作认为是UP
penStatus=TCHSCR_ACTION_UP;
SendTS(penStatus);
break;
default: sta=0;break;
}
TS_OPEN_INT(); //打开触摸屏中断并退出查询状态
break;
}
OSTimeDly(100);
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -