//====================================================================================
//文 件 名: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;
}
}
//文 件 名: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;
}
}