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

📄 touch2410.c

📁 此文件是基于arm在Windows下的ADS1.2开发环境中实现的触摸屏试验
💻 C
📖 第 1 页 / 共 2 页
字号:
        for (i = 0; i < ADCount - 1; i++){
            Uart_Printf("%d,",tmp[i]);
        }
        Uart_Printf("\n");
        #endif
        
        //fill table
        //ArrayCmp是一个表格,表格的第一列存储各点之间的差值,
        //第二列存储相同的点连续存放的个数
        /* 举例:
        tmp[] : 2,0,0,0,2,0,0,2,2
        ArrayCmp[]如下:
        下标	差值	连续个数
        0		2		0
        1		0		2
        2		0		-2
        3		0		-1
        4		2		0
        5		0		1
        6		0		-2
        7		2		1
        */
        ArrayCmp[0].difsize = tmp[0];
        ArrayCmp[0].continuecount = 0;
        k = 0;
        for(i = 1; i < ADCount - 1; i++){
            if ((tmp[i] == tmp[i - 1]) && (diftag == 0)){
                ArrayCmp[i].difsize = tmp[i];
                ArrayCmp[i].continuecount = -2;
                ArrayCmp[i - 1].continuecount = 1;
                diftag = 1;
                k = i - 1;
            }else if ((tmp[i] == tmp[i - 1]) && (diftag == 1)){
                ArrayCmp[i].difsize = tmp[i];
                ArrayCmp[i].continuecount = -1;
                ArrayCmp[k].continuecount += 1;
                diftag = 1;
            }else{ //(tmp[i] != tmp[i - 1])
                ArrayCmp[i].difsize = tmp[i];
                ArrayCmp[i].continuecount = 0;
                diftag = 0;
            }
        }
        
        #if (isDebug == 1)
        Uart_Printf("ArrayCmp:\n    ");
        for (i = 0; i < ADCount - 1; i++){
            Uart_Printf("%d,  %d,  %d\n",i, ArrayCmp[i].difsize, ArrayCmp[i].continuecount);
        }
        Uart_Printf("\n");
        #endif
        //scan table
        //扫描ArrayCmp[]中差值最小且连续个数最多的点的下标
        k = 0;
        for (i = 1; i < ADCount - 1; i++){
            if (ArrayCmp[i].difsize < ArrayCmp[k].difsize)
                k = i;
            else if (ArrayCmp[i].difsize == ArrayCmp[k].difsize){
                if (ArrayCmp[i].continuecount >= ArrayCmp[k].continuecount)
                    k = i;
            }
        }
        Dat0 = p[k];
        
        
    #endif
    
    return Dat0;
}

/*
***********************************************************************************************************
* 函数名称:  GetTouch_XY_AD(void)
*       					
* 函数功能:  写给触摸屏控制器控制字,把触摸屏控制器转换的AD值放到接收变量AD_XY中
*
* 输入参数:  无
*
* 返回值  :  AD_XY
***********************************************************************************************************
*/
unsigned int GetTouch_XY_AD(void){
    int Dat0, i;
    int* p;
                      //转换次数
	unsigned int x, y;              //存放转换结果
	unsigned int AD_XY = 0; //存放最终XY的转换结果

	p = ArrayDat0;                   //初始化累加变量
     		
	while ((rADCDAT0 & 0x8000) | (rADCDAT1 & 0x8000));//测试rADCDAT的bit15是否等于0(触笔按下状态)
 
	//X,Y分别转换模式
	rGPGUP = 0xffff;  //设置GPIO,禁止GPG上拉
	rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1);       //设置转换X的位置
	//rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(1);       //设置转换X的位置
	for(i = 0; i < ADCount; i++){                                //开始转换X,共ADCount次
		if (ad_flag==1)
		{rADCCON = (1<<14)|(49<<6)|(7<<3)|(0<<2)|(0<<1)|(1);              //设置控制寄存器
		while(rADCCON & 0x1);                     //测试转换开始位
		while(!(0x8000 & rADCCON));   // 测试ECFLG位,转换是否结束
		Delay(20);
		ArrayDat0[i] = (rADCDAT0) & 0x3ff;
		ad_flag==0;
		}
		else
		{rADCCON = (1<<14)|(49<<6)|(7<<3)|(0<<2)|(0<<1)|(0); }
		//Dat0 += (rADCDAT0) & 0x3ff;     //转换结果累加,最后取平均
		
	}
	Dat0 = GetDat0(p);

	
	if (Dat0 != 0){    //如果X有效,继续转换Y
		x = Dat0;
		
		#if (isDebug == 1)
		for (i = 0; i < ADCount; i ++){
	        Uart_Printf("%d, ", ArrayDat0[i]);
	    }
	    Uart_Printf("\n");
	    #endif
		
		
		
		rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(2);     //设置转换Y的位置
		//rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2);     //设置转换Y的位置
		Delay(100);
		for (i = 0; i < ADCount; i++){                             //开始转换Y,共ADCount次
			rADCCON = (1<<14)|(49<<6)|(5<<3)|(0<<2)|(0<<1)|(1);            //设置控制寄存器
			while(rADCCON & 0x1);                    //测试转换开始位
			while(!(0x8000 & rADCCON));  // 测试ECFLG位,转换是否结束
			Delay(20);
			//Dat0 += (rADCDAT1) & 0x3ff;    //转换结果累加,最后取平均
			ArrayDat0[i] = (rADCDAT1) & 0x3ff;
		}
		Dat0 = GetDat0(p);
		y = Dat0;
		
		#if (isDebug == 1)
		for (i = 0; i < ADCount; i ++){
		    Uart_Printf("%d, ",ArrayDat0[i]);
		}
		Uart_Printf("\n",ArrayDat0[i]);
		#endif
	}
	rGPGUP = 0x00;   //设置GPIO,使能GPG上拉
	
	
	Uart_Printf("采样结果::x: %d, y: %d\n",x, y);
	#if (isDebug == 1)
	Uart_Printf("采样结果::x: %d, y: %d\n",x, y);
	#endif
	
	AD_XY = (x << 16) | y;	//高16位存放X,低16位存放Y
		
	//恢复等待中断模式
	Touch_Init();
    Delay(1000);
    
    while (!((rADCDAT0 & 0x8000) & (rADCDAT1 & 0x8000)));       //测试rADCDAT的bit15是否等于1(触笔抬起状态)
     		
 	return AD_XY;	
}

/*
***********************************************************************************************************
* 函数名称:  AD2X(int adx)
* 函数功能:  把AD值转换成X坐标值
* 输入参数:  adx
* 返回值  :  X坐标值
***********************************************************************************************************
*/	
int AD2X(int adx) 									           					// 把AD值转换成坐标值 x
{
	return GUI_TOUCH_XSIZE * (GUI_TOUCH_AD_LEFT - adx) / (GUI_TOUCH_AD_LEFT - GUI_TOUCH_AD_RIGHT);
}
/*
***********************************************************************************************************
* 函数名称:  AD2Y(int ady)
* 函数功能:  把AD值转换成Y坐标值
* 输入参数:  ady
* 返回值  :  Y坐标值
***********************************************************************************************************
*/
int AD2Y(int ady) 																// 把AD值转换成坐标值 y
{
	return GUI_TOUCH_YSIZE * (GUI_TOUCH_AD_TOP - ady) / (GUI_TOUCH_AD_TOP - GUI_TOUCH_AD_BOTTOM);
}




void Timer1_init(void)
{
    rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口为信号输出
    rGPGDAT = rGPGDAT | 0x300;

    rTCFG0  = 255;      // Prescaler0=255
    rTCFG1  = 0 << 4;      // 
    rTCNTB1 = 976;    // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;
    rTCMPB1 = 0x00;
    rTCON   = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载
    rTCON   = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载
     
}

void __irq Timer1_ISR( void )
{ 
 	ad_flag = 1;
   	rSRCPND |= BIT_TIMER1;
   	rINTPND |= BIT_TIMER1;
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1INT_Init(void)
- 函数说明 : 定时器中断初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/	
void Timer1INT_Init(void)						             //定时器接口使能
{
     if ((rINTPND & BIT_TIMER1))
    {
    	rSRCPND |= BIT_TIMER1;
    }
    pISR_TIMER1 = (int)Timer1_ISR;
    rINTMSK  &= ~(BIT_TIMER1);  //开中断;    
}

/*
*************************************************************************************************************
*-													结束文件                                               -*
*************************************************************************************************************
*/

⌨️ 快捷键说明

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