概述
10 位CMOS ADC(模/数转换器)是一个8 通道模拟输入的再循环类型设备。其转换模拟输入信号为10 位二
进制数字编码,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电
模式的操作。
触摸屏接口可以控制/选择触摸屏X、Y 方向的引脚(XP,XM,YP,YM)的变换。触摸屏接口包括触摸屏引
脚控制逻辑和带中断发生逻辑的ADC 接口逻辑。
触摸屏接口模式
1. 普通转换模式
单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)初始化并且通过读写
ADCDAT0(ADC 数据寄存器0)就能够完成。
2. 分离的X/Y 方向转换模式
触摸屏控制器可以工作在两个转换模式之一。方向转换模式如下方法操作。X 方向模式写X 方向转换数据到
ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y 方向模式写Y 方向转换数据到ADCDAT1,故触摸屏接口产
生中断源给中断控制器。
3. 自动(顺序)X/Y 方向转换模式
自动(顺序)X/Y 方向转换模式操作如下。触摸屏控制器顺序变换触摸X 方向和Y 方向。在自动方向转变模式中触摸
控制器在写入X 测量数值到ADCDAT0 和写入Y 测量数值到ADCDAT1 后,触摸屏接口产生中断源给中断控制器。
4. 等待中断模式
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为rADCTSC=0xd3; // XP_PU,XP_Dis,
XM_Dis,YP_Dis,YM_En
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。(XY_PST 设置到无操作模式)
待机模式
当ADCCON [2]被设置为'1'时激活待机模式。此模式中,停止A/D 转换操作并且ADCDAT0、ADCDAT1 寄存
器包含的是先前转换的数据。
寄存器的功能可以看一下数据手册
下面是结合FL2440开发板的触摸屏操作实例:
触摸屏工作流程以及程序设计流程:
一、触摸屏初始化:
1、设置触摸屏接口为中断等待模式(ADCTSC寄存器),等待触摸笔按下
2、清除源挂起寄存器(SRCPND)、中断挂起寄存器(INTPND)、子源挂起寄存器
(SUBSRCPND)
3、程序入口函数,关中断屏蔽寄存器和子中断屏蔽寄存器(INTMSK,INTSUBMSK),中断
模式和中断优先级默认即可
二、触摸屏中断服务子程序:
一)触摸笔按下中断
4、如果中断发生,设置x,y坐标为自动转换模式
5、启动AD转换,然后检测AD转换是否启动
6、检测AD转换是否结束,若结束,获取x,y坐标的值
7、对几个寄存器写1清零,防止反复发生中断(这里的中断是笔尖按下中断)
二)触摸笔抬起中断
8、设置触摸屏即可为等待中断模式,等待触摸笔抬起(ADCTSC,关键是要设置触摸
笔抬起中断信号)
9、如果发生中断,不做任何操作,只打印出一句触摸笔抬起中断信息
10、触摸笔抬起之后,把得到的x,y坐标值发送给PC机,显示出具体数值
三)再次设置触摸屏为等待中断模式,等待下次触摸屏被按下
#include"2440addr.h"
#include"def.h"
//void Touch_Screen_Off(void);
int key=0,xdata,ydata;
void __irq ADC_ISR(void) ;
void ledcontrol();
void Touch_Screen_Init(void)
{
rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
// Enable Prescaler=39,Prescaler A/D converter freq. = 50 MHz/(39+1) = 1.25MHz
//Conversion time = 1/(1.25MHz / 5cycles) = 1/250 kHz = 4 us
//AIN0,Normal,Disable read start,No operation
rADCCON = (1<<14)|(39<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
//YM=GND,YP=AIN5,XM=Hi-z,XP=AIN7,XP pullup En,Normal ADC,Waiting for interrupt mode
rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
pISR_ADC = (unsigned)ADC_ISR; //中断服务函数地址赋给中断指针
ClearSubPending(BIT_SUB_TC);//清子挂起寄存器
ClearSubPending(BIT_SUB_ADC);
ClearPending(BIT_ADC);//清挂起寄存器
EnableSubIrq(BIT_SUB_TC); //使能子中断
EnableIrq(BIT_ADC); //使能中断
}
void __irq ADC_ISR(void)
{
U32 saveAdcdly;
if(rADCDAT0&0x8000)//顺序X 方向、Y 方向测量
{
rADCTSC&=0xff; // Set stylus down interrupt bit
}
rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
saveAdcdly=rADCDLY;
rADCDLY=40000; //Normal conversion mode delay about (1/50M)*40000=0.8ms
rADCCON|=0x1; //start ADC
while(rADCCON & 0x1); //check if Enable_start is low
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
xdata=(rADCDAT0&0x3ff);//读取x坐标数据
ydata=(rADCDAT1&0x3ff);//读取y坐标数据
//YH 0627, To check Stylus Up Interrupt.
rSUBSRCPND|=BIT_SUB_TC;//清除相应的寄存器
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);
rADCTSC =0xd3; //Waiting for interrupt
rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
while(1) //to check Pen-up state
{
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
{
break; //if Stylus is up(1) state
}
}
ledcontrol();
rADCDLY=saveAdcdly;
rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
rSUBSRCPND|=BIT_SUB_TC;
rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC)
ClearPending(BIT_ADC);
}
void ledcontrol()//根据点击的触摸屏的位置来判断控制哪一个led的亮灭
{
if((xdata>100)&&(xdata<500)&&(ydata>500)&&(ydata<900))
{
key=1;
}
else if((xdata>500)&&(xdata<900)&&(ydata>500)&&(ydata<900))
{
key=2;
}
else if((xdata>100)&&(xdata<500)&&(ydata>100)&&(ydata<500))
{
key=3;
}
else if((xdata>500)&&(xdata<900)&&(ydata>100)&&(ydata<500))
{
key=4;
}
switch(key){
case 1:
rGPBDAT^=(1<<5);
key=0;//将i清零防止下次收到其他数据时干扰
break;
case 2:
rGPBDAT^=(1<<6);
key=0;
break;
case 3:
rGPBDAT^=(1<<8);
key=0;
break;
case 4:
rGPBDAT^=(1<<10);
key=0;
break;
default:break;
}
}
void Touchmain(void)
{
rGPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出
rGPBDAT|=0x560;//4个LED全灭
Touch_Screen_Init();
while(1);
} |