TOUCH  PANEL

来源:互联网 发布:有哪些污的游戏知乎 编辑:程序博客网 时间:2024/05/21 11:22
//====================================================================================
//文 件 名:TouchPanel.c
//功能描述: 触摸屏驱动程序
//====================================================================================


#include "TouchPanel.h"
#include "2440lib.h"
#include "option.h"
#include "2440addr.h"
#include "uart/uart.h"


#define ADCPRS 39


short ResultX;
short ResultY;


void __irq Adc_or_TsSep(void);
//=============================================================
//语法格式:void Touch_Init(void)
//实现功能:触摸屏驱动初始化,初始化变量、ADC、IO等,并开启ADC中断
//参数:
//返回值:
//=============================================================
void Touch_Init(void)
{
ResultX = -1;
ResultY = -1;


rADCDLY = (5000);  // ADC Start or Interval Delay


rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
 // Enable Prescaler,Prescaler,AIN7/5 fix,Normal,Disable read start,No operation
rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);//等待按下模式
 // Down,YM:GND,YP:AIN5,XM:Hi-z,XP:AIN7,XP pullup En,Normal,Waiting for interrupt mode


//清中断
rSRCPND |= BIT_ADC;
rINTPND |= BIT_ADC;
rSUBSRCPND|= BIT_SUB_TC;
rSUBSRCPND |= BIT_SUB_ADC;
//打开TC中断
rINTMSK &=~(BIT_ADC);
rINTSUBMSK &=~(BIT_SUB_TC);
rINTSUBMSK |= (BIT_SUB_ADC); //关闭触ADC转换中断
pISR_ADC   = (unsigned)Adc_or_TsSep;
}


//=============================================================
//语法格式:void Touch_ADC_ISR(void);
//实现功能:TC中断服务子程序
//参数:
//返回值:
//=============================================================
void __irq Adc_or_TsSep(void)
{
unsigned int valx, valy;
int i;

rSUBSRCPND |= BIT_SUB_TC;
ClearPending(BIT_ADC);

if(rADCDAT0&0x8000)
{
Uart_Printf("\nStylus Up!!\n");
rADCTSC &= ~(0x01<<8);    // Set stylus down interrupt
}
else 
{
Uart_Printf("\nStylus Down!!\n");

// 采集X轴
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1);
valx = 0;
for(i=0;i<5;i++)
{
rADCCON|=0x1;               
while(rADCCON & 0x1);      
while(!(0x8000&rADCCON));   
valx += (0x3ff&rADCDAT0);
}
valx /= 5;

// 采集Y轴
rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(2);
valy = 0;
for(i=0;i<5;i++)
{
rADCCON|=0x1;              
while(rADCCON & 0x1);      
while(!(0x8000&rADCCON));  
valy += (0x3ff&rADCDAT1);
}
valy /= 5;

// 计算X和Y坐标
  ResultX = TOUCH_WIDTH * ( TOUCH_DEFAULT_RB -valx) / (TOUCH_DEFAULT_RB - TOUCH_DEFAULT_LB);
  ResultY = TOUCH_HEIGHT * (valy - TOUCH_DEFAULT_TB) / (TOUCH_DEFAULT_BB - TOUCH_DEFAULT_TB);


// 恢复到等待台起中断模式
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
}
}


//=============================================================
//语法格式:short Touch_Get(short *x, short *y);
//实现功能:触摸屏获取触摸坐标函数
//参数: *x: 触摸点的横坐标; *y: 触摸点的纵坐标
//返回值:
//=============================================================
short Touch_Get(short *x, short *y)
{
if(ResultX != -1)
{
*x = ResultX ;
*y = ResultY;
ResultX = -1;
ResultY = -1;
return 0;
}
else
{
*x = -1;
*y = -1;
return -1;
}
}
原创粉丝点击