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

📄 touch2410.c

📁 此文件是基于arm在Windows下的ADS1.2开发环境中实现的触摸屏试验
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : Touch2410.c	
;* 文件功能 : 该文件为S3C2410硬件平台的触摸屏程序驱动程序
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/

#include "..\inc\touch2410.h"
#include "2410addr.h"
#include "..\..\Startup2410\INC\2410lib.h"
#include "..\glib\glib.h"

  int  TOUCH_X ;
  int  TOUCH_Y ;
  extern char ad_flag;

#define isDebug 0  //如果此值是1,可以串口输出信息,此值是0,不输出信息

	const int ADCount = 10;
	int ArrayDat0[ADCount];
	
#define avaverage 0
#define optimize 1

#define method optimize

	
/*
***********************************************************************************************************
*
*          						----***--   配置宏    --***-----
*
***********************************************************************************************************
*/
	
	#ifndef GUI_TOUCH_AD_LEFT      									// 由AD转换器返回的320X240屏的最左面的值
  		//#define GUI_TOUCH_AD_LEFT 		610   
  		#define GUI_TOUCH_AD_LEFT 		20   
	#endif

	#ifndef GUI_TOUCH_AD_RIGHT      								// 由AD转换器返回的320X240屏的最右面的值 
  		#define GUI_TOUCH_AD_RIGHT 		935    
	#endif

	#ifndef GUI_TOUCH_AD_TOP       									// 由AD转换器返回的320X240屏的最上面的值 
  		//#define GUI_TOUCH_AD_TOP 		710
  		#define GUI_TOUCH_AD_TOP 		60
	#endif

	#ifndef GUI_TOUCH_AD_BOTTOM     								// 由AD转换器返回的320X240屏的最下面的值 
  		//#define GUI_TOUCH_AD_BOTTOM  	360
  		#define GUI_TOUCH_AD_BOTTOM  	960
	#endif

	#ifndef GUI_TOUCH_XSIZE
  		#define GUI_TOUCH_XSIZE 		640
	#endif
	#ifndef GUI_TOUCH_YSIZE
  		#define GUI_TOUCH_YSIZE 		480
	#endif

/*
*************************************************************************************************************
- 函数名称: void Touch_Show(int x, int y)
- 函数功能:触摸屏触点显示函数
- 输入参数:x:横坐标,y:纵坐标
- 输出参数:无
*************************************************************************************************************
*/ 
void Touch_Show(int x, int y)
{
    Uart_Printf("量化后的结果:x = %d, y = %d\n\n",x,y);
    Fill_Circle (x, y, 15);
    Delay(1500);
    Set_Color(GUI_RED);
    Fill_Rect(0,0,639,479);
  	Set_Color(GUI_YELLOW);
}

/*
*************************************************************************************************************
- 函数名称: void Touch_Init(void)
- 函数功能:初始化触摸屏控制器
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/ 
void Touch_Init(void)				
{
    rADCDLY   = (0x5000);	                                   // ADC Start or Interval Delay
	rADCTSC   = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);  //设置成为等待中断模式
	//rADCTSC   = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(3);  //设置成为等待中断模式,disable int
	rADCCON	= (1<<14)|(49<<6)|(7<<3)|(0<<2)|(1<<1)|(0);	                  //设置ADC控制寄存器
}

/*
*************************************************************************************************************
- 函数名称:void TouchINT_Init(void)
- 函数功能:触摸屏中断初始化
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/
void TouchINT_Init(void)													             //触摸屏硬件接口使能
{
    if ((rSRCPND & BIT_ADC)){                 //清除中断挂起位
    	rSRCPND |= BIT_ADC;
    } 
     
     if ((rINTPND & BIT_ADC)){
    	rINTPND |= BIT_ADC;
    }
 
    if ((rSUBSRCPND & BIT_SUB_TC)){
    	rSUBSRCPND |= BIT_SUB_TC;
    }
    
    if ((rSUBSRCPND & BIT_SUB_ADC)){
    	rSUBSRCPND |= BIT_SUB_ADC;
    }
    rINTMSK  &= ~(BIT_ADC);      //相关中断屏蔽位置0,使能中断
    rINTSUBMSK  &= ~(BIT_SUB_TC);
    pISR_ADC = (unsigned)Touch_ISR;             //设置中断向量
}

/*
*************************************************************************************************************
- 函数名称: void __irq Touch(void)
- 函数功能:触摸屏中断
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/ 

void __irq  Touch_ISR(void){
	int AD_XY,yPhys,xPhys;
	
	//关中断
	rINTMSK |= (BIT_ADC);
	rINTSUBMSK |= (BIT_SUB_ADC | BIT_SUB_TC);	// 关闭子中断(ADC和TC) 
	
	//获取位置
	AD_XY  = GetTouch_XY_AD();
	yPhys = (AD_XY) & 0xffff;      //获取Y的AD值
    xPhys = (AD_XY >> 16) & 0xffff;//获取X的AD值
    TOUCH_X = AD2X(xPhys);
    TOUCH_Y = AD2Y(yPhys);
   	// 
   	Touch_Show(TOUCH_X,TOUCH_Y);
    //开中断,清空挂起位
    rSUBSRCPND |= BIT_SUB_TC;
    ClearPending(BIT_ADC);
    
    rINTMSK  &= ~(BIT_ADC);
    rINTSUBMSK &= ~(BIT_SUB_ADC);
    rINTSUBMSK &= ~(BIT_SUB_TC);
    
}
/*
*************************************************************************************************************
- 函数名称: void selectsort(int* r,int n)
- 函数功能:选择排序
- 输入参数:r[] is struct rec,n是要排序记录的个数
- 输出参数:无
*************************************************************************************************************
*/
void selectsort(int* r,int n){ //r[] is struct rec,选择排序
    int i,j,k;
    int w;//struct rec
    for(i = 0; i < n - 1; i ++){
        k = i;
        for (j = i + 1; j < n; j ++){
            if (r[j] < r[k])
                k = j;
        }
        if (k != i){
            w=r[i];//交换
            r[i]=r[k];
            r[k]=w;
        }
    }
    #if (isDebug == 1)
        Uart_Printf("Sort::");
        for (i = 0; i < n; i++)
            Uart_Printf("%d, ", r[i]);
        Uart_Printf("  end\n");
    #endif
}

/*
*************************************************************************************************************
- 函数名称: int GetDat0(int* p)
- 函数功能:将采集到的数据进行处理,去除不稳定的抖动值,得到准确的AD转换值
- 输入参数:采集到的数据的指针
- 输出参数:准确的AD转换值
*************************************************************************************************************
*/ 
int GetDat0(int* p){
    int Dat0;
    //const int ADCount = 10;
    int tmp[9];//ADCount - 1
    int i, k, diftag = 0;
    struct ARRAYCMP{
        int difsize;
        int continuecount;
    }ArrayCmp[9];//ADCount - 1
    #if (method == avaverage) //将采集的点数据平均处理
        Dat0 = 0;
        for(i = 0; i < ADCount; i ++){
            Dat0 += p[i];     //转换结果累加,最后取平均
        }
        Dat0 /= ADCount;

    #elif (method == optimize) //取最优点,即选取各点之间差别最小且连续个数最多的点,这是最稳定值
        selectsort(p, ADCount); //将采集到的数据排序(由小到大)
        for (i = 0; i < ADCount - 1; i ++){
            tmp[i] = p[i + 1] - p[i]; //tmp[]存储各点之间的差值
        }
        #if (isDebug == 1)
        Uart_Printf("tmp:\n    ");

⌨️ 快捷键说明

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