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

📄 gui_touch_driveranalog.c

📁 本代码包含已经移植好的UCGUI代码,控制器是S3C44B0,通过UCGUI,在LCD上图片显示.
💻 C
字号:
/***********************************************************************************************************                                                uC/GUI*                        Universal graphic software for embedded applications**                       (c) Copyright 2002, Micrium Inc., Weston, FL*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH**              礐/GUI is protected by international copyright laws. Knowledge of the*              source code may not be used to write a similar product. This file may*              only be used in accordance with a license and should not be redistributed*              in any way. We appreciate your understanding and fairness.*----------------------------------------------------------------------File        : GUITOUCH.CPurpose     : Touch screen manager----------------------------------------------------------------------This module handles the touch screen. It is configured in the fileGUITouch.conf.h (Should be located in the Config\ directory).----------------------------------------------------------------------*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "LCD_Private.H"      /* private modul definitions & config */#include "GUI_Protected.h"/* Generate code only if configuration says so ! */#if GUI_SUPPORT_TOUCH#include "GUITouchconf.h"    /* Located in GUIx, will include GUITouch.conf.h */#include "44b.h"#include "ads7843.h"/*************************************************************************          Config defaults************************************************************************/#ifndef GUI_TOUCH_AD_LEFT      /* max value returned by AD-converter */  #define GUI_TOUCH_AD_LEFT 270   #endif#ifndef GUI_TOUCH_AD_RIGHT      /* min value returned by AD-converter */  #define GUI_TOUCH_AD_RIGHT 3800    #endif#ifndef GUI_TOUCH_AD_TOP       /* max value returned by AD-converter */  #define GUI_TOUCH_AD_TOP 250#endif#ifndef GUI_TOUCH_AD_BOTTOM      /* min value returned by AD-converter */  #define GUI_TOUCH_AD_BOTTOM 3680#endif#ifndef GUI_TOUCH_SWAP_XY    /* Is XY of touch swapped ? */  #define GUI_TOUCH_SWAP_XY 0#endif#ifndef GUI_TOUCH_MIRROR_X  #define GUI_TOUCH_MIRROR_X 0#endif#ifndef GUI_TOUCH_MIRROR_Y  #define GUI_TOUCH_MIRROR_Y 1#endif#ifndef GUI_TOUCH_YSIZE  #define GUI_TOUCH_YSIZE LCD_YSIZE#endif#ifndef GUI_TOUCH_XSIZE  #define GUI_TOUCH_XSIZE LCD_XSIZE#endif/*************************************************************************          Config check************************************************************************//*  *****************************************************************  *                                                               *  *              Global data                                      *  *                                                               *  *****************************************************************The global data below is for debugging purposes only. A "clean"application should not use these values for any other purpose.NEVER write into these values !*///int GUI_TOUCH_yPhys, GUI_TOUCH_xPhys;/******************************************************************       Static data*******************************************************************/typedef struct {int Min; int Max; } tMinMax;static tMinMax xyMinMax[2] = {#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_X==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_Y==0))  { GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT },#else  { GUI_TOUCH_AD_RIGHT, GUI_TOUCH_AD_LEFT },#endif#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_Y==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_X==0))  { GUI_TOUCH_AD_TOP,  GUI_TOUCH_AD_BOTTOM }#else  { GUI_TOUCH_AD_BOTTOM,  GUI_TOUCH_AD_TOP }#endif};#ifndef WIN32static int xMin;static int xMax;static int yMin;static int yMax;#endif/***********************************************************************       Convert physical value into (logical) coordinates*/int AD2X(int adx) {  I32 r = adx - xyMinMax[GUI_COORD_X].Min;  r *= GUI_TOUCH_XSIZE - 1;  return r / (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min);    }int AD2Y(int ady) {  I32 r = ady - xyMinMax[GUI_COORD_Y].Min;  r *= GUI_TOUCH_YSIZE - 1;  return r/(xyMinMax[GUI_COORD_Y].Max - xyMinMax[GUI_COORD_Y].Min);    }/***********************************************************************        Diagnostic routines*/int  GUI_TOUCH_GetxPhys(void) {	if(!TP_IRQ)		return Read_X();	else		return -1; //GUI_TOUCH_xPhys;}int  GUI_TOUCH_GetyPhys(void) {	if(!TP_IRQ)		return Read_Y();	else		return -1; //GUI_TOUCH_xPhys;}void TOUCH_X_ActivateX(void) {}void TOUCH_X_ActivateY(void) {}void TOUCH_X_Disable(void) {}int  TOUCH_X_MeasureX(void) {}int  TOUCH_X_MeasureY(void) {}/***********************************************************************              SetDefaultCalibration*/void GUI_TOUCH_SetDefaultCalibration(void) {  xyMinMax[0].Min = GUI_TOUCH_AD_LEFT;  xyMinMax[0].Max = GUI_TOUCH_AD_RIGHT;  xyMinMax[1].Min = GUI_TOUCH_AD_TOP;  xyMinMax[1].Max = GUI_TOUCH_AD_BOTTOM;}/***********************************************************************              Calibration*/static int Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) {  return p0+ ((p1-p0) * (l-l0)) / (l1-l0);}int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1) {  int l0 = 0;  int l1 = (Coord==GUI_COORD_X) ? LCD_XSIZE-1 : LCD_YSIZE-1;  if (labs(Phys0-Phys1) < 20)    return 1;  if (labs(Log0-Log1) < 20)    return 1;  xyMinMax[Coord].Min = Log2Phys(l0, Log0, Log1, Phys0, Phys1);  xyMinMax[Coord].Max = Log2Phys(l1, Log0, Log1, Phys0, Phys1);  return 0;}/***********************************************************************              GUI_TOUCH_Exec*/void GUI_TOUCH_Exec(void) {  #ifndef WIN32  static U8 ReadState;  static int xPhys, yPhys;  int x,y;  /* calculate Min / Max values */  if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) {    xMin = xyMinMax[GUI_COORD_X].Min;    xMax = xyMinMax[GUI_COORD_X].Max;  } else {    xMax = xyMinMax[GUI_COORD_X].Min;    xMin = xyMinMax[GUI_COORD_X].Max;  }  if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) {    yMin = xyMinMax[GUI_COORD_Y].Min;    yMax = xyMinMax[GUI_COORD_Y].Max;  } else {    yMax = xyMinMax[GUI_COORD_Y].Min;    yMin = xyMinMax[GUI_COORD_Y].Max;  }  /* Execute the state machine which reads the touch */  switch (ReadState) {  case 0:    yPhys = TOUCH_X_MeasureY();    TOUCH_X_ActivateY();  /* Prepare X- measurement */    ReadState++;    break;  default:    xPhys = TOUCH_X_MeasureX();    TOUCH_X_ActivateX();  /* Prepare Y- measurement */    /* Convert values into logical values */      #if !GUI_TOUCH_SWAP_XY   /* Is X/Y swapped ? */        x = xPhys;        y = yPhys;      #else        x = yPhys;        y = xPhys;      #endif    if ((x <xMin) | (x>xMax)  | (y <yMin) | (y>yMax)) {      GUI_TOUCH_StoreState(-1,-1);    } else {      x = AD2X(x);      y = AD2Y(y);      GUI_TOUCH_StoreState(x,y);    }    /* Reset state machine */    ReadState=0;    break;  }  #endif /* WIN32 */}/********************************************************************** *	FS44B0X Touch screen driver */#define TP_UP 	0#define TP_DOWN	1static int TpStatus=TP_UP;void __irq Timer3_TouchExe(void){	  #ifndef WIN32  	static int xPhys, yPhys;  	int x,y;  	    rI_ISPC=BIT_TIMER3;        rUTXH0='+';    if(TpStatus==TP_UP) {	//笔未压下状态位        if(!TP_IRQ) {		//得到笔压下中断信号//        	TpStatus=TP_DOWN;	//设置压下状态            if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) {              xMin = xyMinMax[GUI_COORD_X].Min;              xMax = xyMinMax[GUI_COORD_X].Max;            } else {              xMax = xyMinMax[GUI_COORD_X].Min;              xMin = xyMinMax[GUI_COORD_X].Max;            }            if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) {              yMin = xyMinMax[GUI_COORD_Y].Min;              yMax = xyMinMax[GUI_COORD_Y].Max;            } else {              yMax = xyMinMax[GUI_COORD_Y].Min;              yMin = xyMinMax[GUI_COORD_Y].Max;            }          	/* Execute the state machine which reads the touch */          	TP_GetAdXY(&xPhys,&yPhys);            /* Convert values into logical values */            #if !GUI_TOUCH_SWAP_XY   /* Is X/Y swapped ? */              x = xPhys;              y = yPhys;            #else              x = yPhys;              y = xPhys;            #endif                    if ((x <xMin) | (x>xMax)  | (y <yMin) | (y>yMax)) {              GUI_TOUCH_StoreState(-1,-1);            } else {              x = AD2X(x);              y = AD2Y(y);              GUI_TOUCH_StoreState(x,y);              Uart_Printf("\nx=%d,y=%d",x,y);            }        }        else {        	GUI_TOUCH_StoreState(-1,-1);        }    }        if(TpStatus==TP_DOWN) {	//笔已压下状态位        if(TP_IRQ) {		//笔中断信号已经消失            TpStatus=TP_UP;	//设置笔未压状态位        }    }  #endif /* WIN32 *///////////////////////////////////////////////////////////////////////////  	int xPhys, yPhys;//  	int x,y;//  	//    rI_ISPC=BIT_TIMER3;//    //    rUTXH0='+';//    if(!TP_IRQ){//    	//		TP_GetAdXY(&xPhys,&yPhys);//        x = xPhys;//        y = yPhys;//        x = AD2X(x);//        y = AD2Y(y);//        GUI_TOUCH_StoreState(x,y);//        Uart_Printf("\nx=%d,y=%d",x,y);//        //  	}//////////////////////////////////////////////////////////////////////////}#elsevoid GUI_TOUCH_DriverAnalog_C(void) {}#endif    /* defined(GUI_SUPPORT_TOUCH) && GUI_SUPPORT_TOUCH */

⌨️ 快捷键说明

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