⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tchscr.c

📁 在移植成功ucos核的基础上扩充了该操作系统的许多没有功能。如文件系统
💻 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 + -