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

📄 tchscr.c

📁 ucos-II+移植到arm+s3c2410的全套代码
💻 C
字号:
#include "../inc/drivers.h"
#include "../inc/sys/lib.h"
#include <includes.h>
#include "../ucos-ii/add/osaddition.h"
#include "../src/miniGUI/uhal/ucos2input.h"
#include <stdio.h>

//#define DPRINTF		printf
#define DPRINTF(...)		//printfNULL

#if OS_Touch_Screen_Task==1

#define IRQ_ADS7843				IRQ_EINT5	//IRQ_EINT5
#define ADS7843_PIN_PEN		(GPIO_MODE_IN | GPIO_PULLUP_EN | GPIO_F5)

#define TS_OPEN_INT()		set_external_irq(IRQ_ADS7843, EXT_LOWLEVEL, GPIO_PULLUP_EN)
#define TS_CLOSE_INT()		set_gpio_ctrl(ADS7843_PIN_PEN)

#define ADS7843_PIN_CS		(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12)

#define ADS7843_CTRL_START		0x80
#define ADS7843_GET_X			0x50
#define ADS7843_GET_Y			0x10
#define ADS7843_CTRL_12MODE	0x0
#define ADS7843_CTRL_8MODE	0x8
#define ADS7843_CTRL_SER		0x4
#define ADS7843_CTRL_DFR		0x0
#define ADS7843_CTRL_DISPWD	0x3	// Disable power down
#define ADS7843_CTRL_ENPWD	0x0	// enable power down

#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)

static OS_EVENT* pTouchBeginSem=NULL;

static int penStatus=TCHSCR_ACTION_NULL;
//打开下面的坐标
//static int TchScr_Xmax=820,TchScr_Xmin=82, TchScr_Ymax=926,TchScr_Ymin=97;
//  static int TchScr_Xmax=830,TchScr_Xmin=135, TchScr_Ymax=921,TchScr_Ymin=102;
   static int TchScr_Xmax=874,TchScr_Xmin=61, TchScr_Ymax=923,TchScr_Ymin=85; //修正采样值后的数据
//extern U32 ConfigSysdata[];
//extern U8 isConfigsysLoad;

#define TCHSCR_PenDown()		(!read_gpio_bit(ADS7843_PIN_PEN))

#define enable_7843()	write_gpio_bit(ADS7843_PIN_CS, 0)
#define disable_7843()	write_gpio_bit(ADS7843_PIN_CS, 1)

#define ADS7843_SPI_CHANNEL		0

__inline static void set7843toIRQmode(void)
{
	enable_7843();
	SPISend(ADS7843_CMD_X, ADS7843_SPI_CHANNEL);
	SPIRecv(ADS7843_SPI_CHANNEL);
	SPIRecv(ADS7843_SPI_CHANNEL);
	disable_7843();
}

static void TchScr_init()
{
	set_gpio_ctrl(ADS7843_PIN_CS);
	write_gpio_bit(ADS7843_PIN_CS, 1);
	SPI_initIO(ADS7843_SPI_CHANNEL);
	Set_SIO_mode(ADS7843_SPI_CHANNEL, SPCON_SMOD_POLL | 
		SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH | 
		SPCON_CPHA_FMTA, 33, 2, NULL, NULL, NULL);
	set7843toIRQmode();
}

#define CLOCK_DELAY()		do{int i; for(i=0; i<10; i++);}while(0)

void TchScr_GetScrXY(int *x, int *y)
{
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr;
#endif    

	unsigned int temp;

	OS_ENTER_CRITICAL();

	enable_7843();

	SPISend (ADS7843_CMD_X, ADS7843_SPI_CHANNEL);
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n1x=%d",temp>>2);
	//*x=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2x=%d",temp>>2);
	//*x+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2x=%d",temp>>2);
	*x=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2x=%d",temp>>2);
	*x+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2x=%d",temp>>2);
	*x+=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n3x=%d",temp>>2);
	*x+=temp;

	temp=SendReadData(0,ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n4x=%d",temp>>2);
	//*x+=temp;
	*x>>=4;		//x=x/4/4;	change to 10bit
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n1y=%d",temp>>2);
	//*y=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2y=%d",temp>>2);
	//*y+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2y=%d",temp>>2);
	*y=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2y=%d",temp>>2);
	*y+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n2y=%d",temp>>2);
	*y+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n3y=%d",temp>>2);
	*y+=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(0, ADS7843_SPI_CHANNEL)>>3);
	//Uart_Printf(0,"\n4y=%d",temp>>2);
	//*y+=temp;
	*y>>=4;		//y=y/4/4;
	
    *x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
	*y=(TchScr_Ymax-*y)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
	
	disable_7843();

	OS_EXIT_CRITICAL();

#if 0
	{
		calibrate_POINT dsppt, tchppt;
		tchppt.x=*x;
		tchppt.y=*y;
		getDisplayPoint(&dsppt, &tchppt, &system_param.calibrate_matrix);
		*x=dsppt.x;
		*y=dsppt.y;
		//*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
	    //*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
	}
#endif
}

static void Touch_Screen_ISR(int vector, void* data)
{
	DPRINTF("Touch screen Interrupt\n");

	TS_CLOSE_INT();
	penStatus=TCHSCR_ACTION_DOWN;
	OSSemPost(pTouchBeginSem);
}

extern OS_FLAG_GRP *Input_Flag;
tsdata tchscr_data;

#if USE_MINIGUI==1

#define SendTS(TchScrAction) do\
		{ 	tchscr_data.action = TchScrAction;								\
			OSFlagPost(Input_Flag, UCOS2_MOUSEINPUT, OS_FLAG_SET, &err);		\
		}while(0)
#else

#define SendTS(TchScrAction) do{\
		POSMSG pmsg=OSCreateMessage(NULL, OSM_TOUCH_SCREEN,(tchscr_data.y<<16)|(tchscr_data.x&0xffff), TchScrAction);\
		SendMessage(pmsg);	}while(0)

#endif


void Touch_Screen_Task(void *Id)             //触摸屏任务
{
	INT8U err,sta=0;
    int i;
	TchScr_init();

	printk("begin TouchScreen Task\n");
	pTouchBeginSem=OSSemCreate(0);

	//设置触摸屏中断处理函数
	TS_OPEN_INT();
	SetISR_Interrupt(IRQ_ADS7843, Touch_Screen_ISR, NULL);

	for(;;){
		OSSemPend(pTouchBeginSem, 0, &err);	//wait for Touch Screen Pen down
		OSTimeDly(10);
		for(;;){
			if (TCHSCR_PenDown()){	//有触摸笔按下
				TchScr_GetScrXY(&(tchscr_data.x), &(tchscr_data.y));
				/*SendTS(penStatus);
				penStatus=TCHSCR_ACTION_MOVE;*/
				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{
//				if(penStatus==TCHSCR_ACTION_DOWN)
//					SendTS(TCHSCR_ACTION_CLICK);

				/*if(penStatus!=TCHSCR_ACTION_DOWN && penStatus!=TCHSCR_ACTION_MOVE){
					break;
				}

				penStatus=TCHSCR_ACTION_UP;
				SendTS(penStatus);
				TS_OPEN_INT();
				break;*/
				switch(sta)
               	         {case 1: sta=0;           // 如果释放前置检测到1次按下,开始分析单双击动作
                                        for(i=0;i<7;i++)
                                          {OSTimeDly(10);
                                           if(TCHSCR_PenDown())  //在规定时间内又检测到按下则认为是双击
                            	                {TchScr_GetScrXY(&(tchscr_data.x), &(tchscr_data.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	//OS_Touch_Screen_Task==1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -