接触屏附着在显现器外表,依据接触点在显现屏上对应坐标点的显现内容或图形符号进行相应操作。
其坐标辨认原理如下图:
当手指接触屏幕时,两个彼此绝缘的导电层在接触点处衔接,顶层的5伏电压就会加到底层接触点处,底层该点的电压会产生改动,操控器检测到该点的改变后,将该点的电压进行A/D转化,得到的值与5伏比较,再乘以该轴总长度即可得接触点靠地那一端的坐标:X=L*V(I)/5
也就是说咱们要得到触点坐标的话,只需要将触点的电压进行A/D转化再用公式核算一下便可。那么接触屏驱动的要点应该是在什么时候,对什么地址的电压进行A/D转化。S3C2440中的A/D转化器便有这种功用:
如图所示为S3C2440中ADC与接触屏的接口结构图。
咱们从上面的结构图和数 据手册能够知道,该ADC模块总共有8个通道能够进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP。那么 ADC是怎样完结模拟信号到数字信号的转化呢?首要模拟信号从任一通道输入,然后设定寄存器中预分频器的值来确认AD转化器频率,最终ADC将模拟信号转 换为数字信号保存到ADC数据寄存器0中(ADCDAT0),然后ADCDAT0中的数据能够经过中止或查询的方法来访问。
从下面的程序中能够看到这些信号是怎么别操控的:
中止形式用到的寄存器:
1,初始化ADC。
设置接触屏接口为等候中止形式:
寄存器ADCTSC的第2位用于挑选主动(接连)XY坐标转化形式
寄存器ADCTSC的第3位能够挑选上拉电阻的使能,在等候中止形式下,上拉电阻要有用
- rADCTSC=0xd3;
//[0:7]Wfait,XP_PU(在等候中止形式下,上拉电阻要有用),XP_Dis,XM_Dis,YP_Dis,YM_En
A/D延时寄存器ADCDLY能够设置开端中止到真实开端A/D转化这段时刻的延时长度,它的时钟源频率为3.68MHz。
- rADCDLY=50000;
//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
当然还要开中止,留意INT_TC为子中止:
- rINTMSK=~BIT_ADC;
//ADC Touch Screen Mask bit clear,enable ADCint - rINTSUBMSK=~(BIT_SUB_TC);//enable
sub ADCint
2,编写中止函数。
假如INT_TC产生,挑选XY转化形式,发动A/D转化:
- rADCTSC=(1<<3)|(1<<2);
//Pull-up disable,(在触发中止后,上拉电阻要无效) Seq. X,Y postion measure. - saveAdcdly=rADCDLY;
//save ADCDLY(发动延时) - 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~!!
经过INT_ADC查看AD转化是否完结:
- while(!(rSRCPND
& (BIT_ADC))); //check if ADC is finished with interrupt bit
其间,x轴坐标值放入ADCDAT0[9..0],y轴坐标值放入ADCDAT1[9..0]
- xdata=(rADCDAT0&0x3ff);
- ydata=(rADCDAT1&0x3ff);//读取转化成果,x轴坐标值放入rADCDAT0,y轴坐标值放入ADCDAT1
设置接触屏为等候中止形式
- rADCTSC
=0xd3; //Waiting for interrupt//[0:7]Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
等候触笔抬起后,康复现场,完毕中止函数。
- rADCTSC=rADCTSC|(1<<8);
// Detect tylus up sinterrupt signal.查看触笔抬起中止 while(1) //to check Pen-up state { if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit { //Uart_Printf(“Stylus Up Interrupt~!”);//触笔抬起! break; //if Stylus is up(1) state } }