TOUCH  PANEL

//====================================================================================
//文 件 名: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;
}
}
触摸屏(Touch Panel)是一种输入设备,它可以通过手指或者触控笔在屏幕上进行操作,实现与设备的交互。触摸屏的工作原理是通过感应手指或者触控笔的电容变化来实现位置的检测。在嵌入式系统中,触摸屏的驱动程序通常需要通过底层硬件接口来实现。根据提供的引用内容,可以看出触摸屏的驱动程序需要实现以下两个功能: 1. TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):该函数用于启用触摸屏,并且注册一个回调函数,当触摸屏被触摸时,会调用该回调函数。 2. 初始化临界区,初始化所需的触摸屏中断gIntrTouch和gIntrTouchChanged,并且把它们关联到事件hTouchPanelEvent中:该功能用于初始化触摸屏的中断,并且将中断与事件关联起来,以便在触摸屏被触摸时能够及时地响应。 以下是一个示例代码,用于在STM32F4嵌入式系统上实现触摸屏的驱动程序: ```c // 启用触摸屏 void TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback) { // 注册回调函数 g_pfnTouchPanelCallback = pfnCallback; } // 初始化触摸屏中断 void TouchPanelInit(void) { // 初始化临界区 InitializeCriticalSection(&g_csTouchPanel); // 初始化触摸屏中断 gIntrTouch = GPIO_PIN_0; gIntrTouchChanged = GPIO_PIN_1; // 关联中断和事件 hTouchPanelEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hTouchPanelEvent == NULL) { // 创建事件失败 return; } // 启用中断 NVIC_EnableIRQ(EXTI0_IRQn); NVIC_EnableIRQ(EXTI1_IRQn); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值