ADC和TP接口

《嵌入式Linux应用完全开发手册》第2篇第14章总结归纳

本章目标

  1. 了解S3C2410/S3C2440 ADC和触摸屏的结构
  2. 了解电阻触摸屏的工作原理和等效电路图
  3. 了解S3C2410/S3C2440触摸屏控制器的多种工作方式
  4. 掌握S3C2410/S3C2440 ADC和触摸屏的编程方法

ADC和触摸屏硬件介绍和使用

S3C2410/S3C2440 ADC和触摸屏接口概述

S3C2410/S3C2440 的CMOS模数转换器(ADC,Analog to Digital Converter)可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制数据。在2.5MHz的A/D转换时钟下,最大的转换速率可达500KSPS(samples per second,每秒采样的次数)。
S3C2410/S3C2440 都提供触摸屏的接口,不过有所不同。S3C2410的触摸屏接口向外提供4个控制信号引脚(nYPON、YMON、nXPON、XMON)和2个模拟信号输入引脚(AIN[7]、AIN[5])。这6个引脚通过4个晶体管与触摸屏的4个引脚相连。而S3C2440提供了与触摸屏直接相连的4个引脚,不在需要外接晶体管。
S3C2410/S3C2440 ADC和触摸屏接口有如下特性:

  1. 分辨率:10位
  2. 微分线性度误差:±1.0LSB
  3. 积分线性度误差:±2.0LSB
  4. 最大转换功率:500KSPS
  5. 低功耗
  6. 供电电压:3.3V
  7. 输入模拟电压范围:0-3.3V
  8. 片上采样保持功能
  9. 普通转换模式
  10. 分离的x/y轴坐标转换模式
  11. 自动(连续)x/y轴坐标转换模式
  12. 等待中断模式

ADC和触摸屏接口结构如图所示:
img not found
从上图可以知道,ADC和触摸屏接口中只有一个A/D转换器可以通过设置寄存器来选择对哪路模拟信号(多达8路)进行采样。图中有两个中断信号:INT_ADC、INT_TC,前者表示A/D转化器已经转换完毕,后者表示触摸屏被按下了。
对于S3C2410,在使用触摸屏时,AIN[7]和AIN[5]被用来测量XP、YP的电平,只剩下AIN[6]、AIN[4:0]共6个引脚被用于一般的ADC输入。对于S3C2440,在使用触摸屏时,引脚XP、XM、YP和YM被用于和触摸屏直接相连,只剩下AIN[3:0]共4个引脚用于一般的ADC输入;当不使用触摸屏时,XP、XM、YP和YM这4个引脚也可以用于一般的ADC输入。
S3C2410与触摸屏的连接比S3C2440复杂,需要增加几个外接晶体管,如下图所示:
img not found

S3C2410/S3C2440 ADC接口的使用方法

ADC的启动方式有两种:手工启动、读结果时就自动启动下一次转换。也有两种方法获知当前转换是否已经结束:查询状态位、转换结束时就发出中断。
ADC的操作只涉及3个寄存器:ADCCON、ADCTSC、ADCDAT0。下面介绍它们的用法,有关触摸屏的数据位将在下面的小节介绍。
ADCCON寄存器

名称 说明
ECFLG [15] 只读,A/D转换结束标志。
0:正在转换。1:转换结束。
PRSCEN [14] 决定A/D转换器的时钟是否分频。
0:不使用。1:使用。
PRSCVL [13:6] 预分频系数,取值0-255:A/D时钟 = PCLK/(PRSCVL + 1)。
注意:A/D时钟必须小于PCLK的1/5。
SEL_MUX [5:3] 选择进行A/D转换的通道。
对于S3C2410,取值如下:
000:AIN 0; 001:AIN 1;010:AIN 2;011:AIN 3;
100:AIN 4;101:AIN 5;110:AIN 6;111:AIN 7(XP);
对于S3C2440,取值如下:
000:AIN 0; 001:AIN 1;010:AIN 2;011:AIN 3;
100:YM;101:YP;110:XM;111:XP;
STDBM [2] 选择静态模式(Standby Mode)。
0:正常模式;1:静态模式。
READ_START [1] 读转换数据时是否启动下一次转换。
0:不启动;1:启动;
ENABLE_START [0] 启动A/D转换(当READ_START为1时,此位无效)。
0:无作用;1:启动A/D转换(转换真正开始时,此位被清零)。

ADCDAT0寄存器

名称 说明
UPDOWN [15] 对于触摸屏,使用“等待中断模式”时,
0:触摸屏被按下;1:触摸屏没有被按下。
AUTO_PST [14] 决定是否使用自动(连续)x/y轴坐标转换模式。
0:正常转换;1:自动(连续)x/y坐标轴转换。
XY_PST [13:12] 手动x/y轴坐标转换模式。
00:无操作;01:x轴坐标转换;
10:y轴坐标转换;11:等待中断模式。
Reserved [11:10] 保留
XPDATA(普通ADC转换数据) [9:0] x轴坐标转换数据值(或普通ADC转换数据值)
数值范围:0-0x3FF

ADC的使用分4个步骤:

  1. 设置ADCCON寄存器,选择信号输入通道,设置A/D转换器的时钟。
    使能A/D转化器时钟的预分频功能时,A/D时钟的计算公式如下:
    1
    2
    A/D时钟 = PCLK / (PRSCVL + 1)
    注:A/D时钟最大为 2.5MHz,并且应该小于PCLK的1/5
  2. 设置ADCTSC寄存器,使用设为普通转换模式,不使用触摸屏功能。
    ADCTSC寄存器多用于触摸屏,对于普通ADC,使用它的默认值即可,或设置其位[2]为0。ADCTSC寄存器的格式在下面的小节介绍。
  3. 设置ADCCON寄存器,启用A/D转换。
    如果设置READ_START位,则读转换数据(读ADCDAT0寄存器)时即启动下一次转换;否则,可以通过设置ENABLE_START位来启动A/D转换。
  4. 转换结束时,读取ADCDAT0寄存器获得数值。
    如果使用查询方式,则可以不断读取ADCCON寄存器的ECFLG位来确定转换是否结束;否则可以使用INT_ADC中断,发生INT_ADC中断时表示转换结束。

触摸屏原理及接口

电阻触摸屏的原理

触摸屏已经在现实生活中大量使用,种类也有很多,比如超声波触摸屏、红外触摸屏、电容触摸屏、电阻触摸屏等。电阻触摸屏由于造价低廉,在电气上可以直接接入用户的系统而得到大量使用。电阻触摸屏有几种类型,比如“四线”、“五线”、“八线”。线越多,精度就越高,温度漂移也越少,但是基本的操作是一样的。它本质是个电阻分压器,将矩形区域中的触摸点(x,y)的物理位置转换为代表x坐标和y坐标的电压。
S3C2410/S3C2440的触摸屏接口可以驱动四线电阻触摸屏,四线电阻触摸屏的等效电路如下图所示:
img not found
img not found
图中粗黑线表示相互绝缘的两层导电层,当按压时,它们在触点外相连;不同的触点在x,y方向上的分压值不一样,将这两个电压值经过A/D转换后即可得到x,y坐标。下面根据等效电路图说明触摸屏的工作过程。

  1. 平时触摸屏没有被按下时,等效电路如图14.5所示。
    S4、S5闭合,S1、S2、S3断开,即YM接地、XP上拉、XP作为模拟输入(对CPU而言)、YP作为模拟输入(对CPU而言)、XM高阻。
    平时触摸屏没有按下时,由于上拉电阻的关系,Y_ADC为高电平;当x轴和y轴受挤压而接触导通之后,Y_ADC的电压由于联通到y轴接地而变为低电平,此此低电平可作为中断触发信号来通知CPU发生“Pen Down”事件。在S3C2410/S3C2440中,称为等待中断模式。
  2. 采样X_ADC电压,得到x坐标,等效电路如图14.6所示。
    S1、S3闭合,S2、S4、S5断开,即XP接上电源、XM接地、YP作为模拟输入(对CPU而言)、YM高阻、XP禁止上拉。这时,YP即X_ADC就是x轴的分压点,进行A/D转化后得到x坐标。
  3. 采样Y_ADC电压,得到y坐标,等效电路如图14.7所示。
    S2、S4闭合,S1、S3、S5断开,即YP接上电源、YM接地、XP作为模拟输入(对CPU而言)、XM高阻、XP禁止上拉。这时,XP即Y_ADC就是y轴的分压点,进行A/D转换后得到y坐标。

S3C2410/S3C2440触摸屏接口

与上面描述的触摸屏工作过程的3个步骤对应,触摸屏控制器也有4种工作模式。

  1. 等待中断模式(Waiting for Interrupt Mode)
    设置ADCTSC寄存器为0xD3即可令触摸屏控制器处于这种模式。这时,它在等待触摸屏按下。当触摸屏被按下时,触摸屏控制器将发出INT_TC中断信号,这时触摸屏控制器要转入以下两种工作模式中的一种,以读取x、y坐标。
    对于S3C2410,当触摸屏按下或松开的时候,都产生INT_TC中断信号。
    对于S3C2440,可以设置ADCTSC寄存器的位[8]为0或1时,表示等待Pen Down中断或Pen Up中断。
  2. 分离的x/y轴坐标转换模式
    这分别对应上述触摸屏工作过程的第2、3步骤。设置ADCTSC寄存器为0x69进入x轴坐标转换模式,x坐标值转换完毕后被写入ADCDAT0,然后发出INT_ADC中断;相似的,设置ADCTSC寄存器为0x9A进入y轴坐标转换模式,y坐标轴转换完毕后被写入ADCDAT1,然后发出INT_ADC中断。
  3. 自动(连续)x/y轴坐标转换模式
    上述触摸屏工作过程的第2、3步骤可以合成一个步骤,设置ADCTSC寄存器值为0x0C,进入自动(连续)x/y轴坐标转换模式,触摸屏控制器就会自动转换x、y坐标值,并分别写入ADCDAT0、ADCDAT1寄存器中,然后发出INT_ADC中断。
  4. 普通转换模式
    不使用触摸屏时,触摸屏控制器处于这种模式。在这种模式下,可以通过设置ADCCON寄存器启动普通的A/D转换,转换完成时数据被写入ADCDAT0寄存器中。
    ADCTSC寄存器被用来选择触摸屏的工作模式,下面介绍ADCTSC寄存器。
    名称 说明
    Reserved/UD_SEN [8] 对于S3C2410,此位必须为0。
    对于S3C2440,此位表示将检测哪类中断(触点按下、触点松开)。
    0:按下;1:松开。
    YM_SEN [7] 对于S3C2410,用于选择YMON的输出值。
    0:YMON输出0(YM:高阻);1:YMON输出1(YM:GND)
    对于S3C2440,YM使能开关。
    0:YM驱动禁止(高阻);1:YM驱动使能(接地)
    YP_SEN [6] 对于S3C2410,用于选择nYPON的输出值。
    0:nYPON输出0(YP:外部电压);1:nYPON输出1(YM接AIN[5])
    对于S3C2440,YP使能开关。
    0:YP驱动禁止(接外部电压);1:YP驱动使能(接模拟输入)
    XM_SEN [5] 对于S3C2410,用于选择XMON的输出值。
    0:XMON输出0(XM:高阻);1:XMON输出1(XM:GND)
    对于S3C2440,XM使能开关。
    0:XM驱动禁止(高阻);1:XM驱动使能(接地)
    XP_SEN [4] 对于S3C2410,用于选择nXPON的输出值。
    0:nXPON输出0(XP:外部电压);1:nXPON输出1(XM接AIN[7])
    对于S3C2440,XP使能开关。
    0:XP驱动禁止(接外部电压);1:XP驱动使能(接模拟输入)
    PULL_UP [3] XP上拉使能。
    0:使能上拉;1:禁止上拉
    AUTO_PST [2] 是否使用自动(连续)x/y轴坐标转换模式。
    0:普通转换模式 1:自动(连续)x/y轴坐标转换模式
    XY_PST [1:0] 手动测量x、y轴坐标。
    00:无操作模式;01:测量x轴坐标;
    10:测量y轴坐标;11:等待中断模式

注:
①处于等待中断模式时,XP_SEN必须设为1(XP接模拟输入),PULL_UP必须设为0(使能上拉)。
②AUTO_PST设为1时,必须处于自动(连续)x/y轴坐标转换模式下。

对于S3C2410,当触摸控制器处于等待中断模式时,触摸屏被按下时,可以不断发出INT_TC中断信号,以便进入自动(连续)x/y轴转换模式转换x、y坐标。发出中断信号的间隔可以通过ADCDLY寄存器来设置。
对于S3C2440,当CPU处于休眠模式下,触摸屏被按下时可以不断发出INT_TC中断信号以唤醒CPU。发出中断信号的间隔可以通过ADCDLY寄存器来设置。
另外,对于普通转换模式、分离的x/y轴坐标转换模式、自动(连续)x/y轴坐标转换模式,都可以通过ADCDLY来设置采样的延时时间。
ADCDLY寄存器格式如下表所示,在等待中断模式时,延时时钟为X-tal(3.68MHz),其他情况为PCLK。

名称 说明
DELAY [15:0] 采样的延时值,或发出中断的间隔值

img not found

ADCDAT1寄存器的格式如下表所示。它与ADCDAT0寄存器格式相似,ADCDAT1寄存器中保存y坐标值;而ADCDAT0寄存器中保存普通A/D转换的值或x坐标值。

名称 说明
UPDOWN [15] 对于触摸屏,使用“等待中断模式”时如下。
0:触摸屏被按下;1:触摸屏没有被按下
AUTO_PST [14] 决定是否使用自动(连续)x/y坐标转换模式。
0:正常转换;1:自动(连续)x/y轴坐标转换
XY_PST [13:12] 手动x/y轴坐标转换模式
00:无操作;01:x轴坐标转换
10:y轴坐标转换 11:等待中断模式
Reserved [11:10] 保留
YPDATA [9:0] x轴坐标转换数据值

ADC和触摸屏操作实例

硬件设计

模拟输入引脚AIN0、AIN1外接可调电阻器,电路图如下图所示:
img not found
图中的两个电阻器是可调电阻器,程序通过AIN0、AIN1这两个通道采集、转换电压值。
触摸屏的接口是标准的,它的电路图如图14.4所示。

程序设计

测试ADC时,程序不断测量AIN0、AIN1的电压,并在串口上显示出来。测试触摸屏时,只是测试触笔按下、松开的事件,并且把按下时采集到的x、y坐标打印出来,它们只是原始的数据。
主要文件为adc_ts.c。主要接口为adc_ts.c中的Test_Adc、Test_Ts函数。

测试ADC的代码详解

ADC主入口函数Test_Adc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
测试ADC
通过A/D转换,测量可变电阻器的电压值
*/
void Test_Adc(void)
{
float vol0,vol1;
int t0,t1;

while(!awaitkay(0)) //串口无输出,则不断测试
{
vol0 = ((float)ReadAdc(0)*3.3)/1024.0; //计算电压值
vol1 = ((float)ReadAdc(1)*3.3)/1024.0 //计算电压值
t0 = (vol0 - (int)vol0) * 1000; //计算小数部分
t1 = (vol1 - (int)vol1) * 1000; //计算小数部分
printf("AIN0 = %d.%-3dV AIN1 = %d.%-3dV\r",(int)vol0,t0,(int)vol1,t1,);
}
printf("\n");
}

第12、13行先调用ReadAdc函数发起A/D转换,返回10位转换值(最大值为1023);然后计算实际电压值(S3C2410/S3C2440模拟信号最大电压3.3V)。

ReadAdc 函数:设置、启动ADC,获取转换结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
使用查询方式读取A/D转换值
输入参数:
ch:模拟信号通道,取值为0-7
*/

static int ReadAdc(int ch)
{
//使用模拟通道,使能预分频功能,设置A/D转换器的时钟 = PCLK/(49 + 1)
ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);

//清除位[2],设为普通转换模式
ADCTSC &= ~(1 << 2);

//设置位[0]为1,启动A/D转换
ADCCON |= ADC_START;

//当A/D转换真正开始时,位[0]会自动清0
while(ADCCON & ADC_START);

//检测位[15],当它为1时表示转换结束
while(!(ADCCON & ADC_ENDCVT));

//读取数据
return (ADCDAT0 & 0x3ff);
}

程序流程与前面介绍的ADC的4个步骤一一对应。

  1. 第10行选择模拟通道,使能预分频功能,设置A/D转化器的时钟。
    本程序中,PCLK为50MHz,所以A/D转换器的时钟为50MHz/(49 + 1) = 1MHz,小于最大A/D时钟2.5MHz。
  2. 第13行清除ADCTSC寄存器位[2],设为普通转换模式,ADCTSC寄存器格式上文有表格描述。
  3. 第16行设置ADCCON寄存器位[0],启动A/D转换。
    ADC的启动有两种方式,如果使用“读启动”方式(此时ADCCON寄存器位[1]被设为1),则读一下ADCDAT0寄存器即可启动;如果使用手动方式,设置ADCCON寄存器位[0]即可启动。
  4. 第22行循环检测ADCCON的位[15],直到它为1为止,这表示A/D转换结束。
    也可以使用中断方式,当A/D转换结束时,ADC会发出INT_ADC中断信号。
  5. 最后,第25行读取ADCDAT0即可得到转换的数据(低10位为有效数据)。

测试触摸屏的代码详解

触摸屏的操作稍微复杂,下面将程序流程图和触摸屏控制的状态转换图合并在一起,以便代码分析。
img not found

触摸屏的主入口函数Test_Ts

Test_Ts函数进行初始化、开启ADC中断之后,就不再参与触摸屏的操作,这都通过中断服务程序来完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
测试触摸屏,打印触点坐标
*/
void Test_Ts(void)
{
isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandlel; //设置中断服务程序
INTMSK &= ~BIT_ADC; //开启ADC总中断
INTSUBMSK &= ~(BIT_SUB_TC); //开启INT_TC中断,即触摸屏被按下或松开时产生中断
INTSUBMSK &= ~(BIT_SUB_ADC); //开启INT_ADC中断,即A/D转换结束时产生中断

//使能预分频功能,设置A/D转换器的时钟 = PCLK / (49 + 1);
ADCCON = PRESCALE_EN | PRSCVL(49);

/*
采样延时时间 = (1/3.6864M)*50000 = 13.56ms
即按下触摸屏后,再过13.56ms才能采样
*/
ADCDLY = 50000;

wait_down_int(); //进入“等待中断模式”,等待触摸屏按下

getc();

//屏蔽ADC中断
INTSUBMSK |= BIT_SUB_TC;
INTSUBMSK |= BIT_SUB_ADC;
INTMSK |= BIT_ADC;
}

第6行设置ADC中断的处理函数,第7-9行开启ADC中断。ADC中断有两类:INT_TC和INT_ADC,前者表示触摸屏被按下或松开,后者表示A/D转换结束。
第12行使能预分频功能,设置A/D转化器的时钟为PCLK/(49 + 1);本程序中,PCLK为50MHz,所以A/D转换器的时钟为50MHz/(49 + 1) = 1MHz,小于最大A/D时钟2.5MHz。
第18行设置延时时间。
第20行调用wait_down_int()宏,令触摸屏控制器进入“等待中断模式”,等待触摸屏被按下。
第22行等待串口的输入,以退出测试。等待期间通过中断来驱动触摸屏的操作。
第25-28行屏蔽ADC中断。
wait_down_int、wait_up_int、mode_auto_xy都是宏定义,它们用于设置触摸屏进入“等待Pen Down中断模式”、“等待Pen Up中断模式”、“自动(连续)x/y轴坐标转换模式”。
需要注意以下几点:

  1. 对于S3C2410,ADCTSC的位[8]属于保留位,只能设为0;当处于“等待中断模式”时,无论是“Pen Down”中断还是“Pen Up”中断都可以检测到。
  2. 对于S3C2440,ADCTSC的位[8]为0、1时分别表示等待Pen Down中断或者Pen Up中断。
  3. 要进入“自动(连续)x/y坐标轴坐标转换模式”,XP、XM、YP、YM的状态不必理会,触摸屏在采样时会自动控制它们。

上述宏定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
设置进入等待中断模式,XP_PU、XP_Dis、XM_Dis、YP_Dis、YM_En
1. 对于S3C2410,位[8]只能为0,所以只能使用下面的wait_down_int,它既等待Pen Down中断,也等待Pen Up中断
2. 对于S3C2440,位[8]为0、1时分别表示等待Pen Down中断或Pen Up中断
*/
/*进入“等待中断模式”,等待触摸屏被按下*/
#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | \
XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
XP_PST(WAIT_INT_MODE);}
/*进入“等待中断模式”,等待触摸屏被松开*/
#define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | \
XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
XP_PST(WAIT_INT_MODE);}
/*进入自动(连续)x/y轴坐标转换模式*/
#define mode_auto_xy() {ADCTSC = CONVERT_AUTO | XP_PULL_UP_DIS | XP_PST(NOP_MODE);}

触摸屏中断处理函数:转换触摸屏的工作模式

执行Test_Ts函数之后,触摸屏控制器处于“等待Pen Down中断模式”。这时,如果按下触摸屏,则发生INT_TC中断,进入AdcTsIntHandle中断处理函数。它很简单,只是判断当前中断时INT_TC还是INT_ADC,然后分别调用他们的中断服务程序。

1
2
3
4
5
6
7
8
9
10
11
/*
ADC、触摸屏的中断服务程序
对于INT_TC、INT_ADC中断,分别调用它们的处理程序
*/
void AdcTsIntHandle(void)
{
if(SUBSRCPND & BIT_SUB_TC)
Isr_Tc();
if(SUBSRCPND & BIT_SUB_ADC)
Isr_Adc();
}

INT_TC的中断服务程序Isr_Tc代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
INT_TC的中断服务程序
当触摸屏被按下时,进入自动(连续)x/y轴坐标转换模式
当触摸屏被松开时,进入等待中断模式,再次等待INT_TC中断
*/
static void Isr_Tc(void)
{
if(ADCDAT0 & 0x8000)
{
wait_down_int(); //进入“等待中断模式”,等待触摸屏被按下
}
else
{
mode_auto_xy(); //进入自动(连续)x/y轴坐标转换模式
/*
设置位[0]为1,启动A/D转换
注意:ADCDLY为50000,PCLK = 50MHz
要经过(1/50MHz)x 50000 = 1ms 后才开始转换x坐标
再经过1ms之后才开始转换y坐标
*/
ADCCON |= ADC_START;
}

//清除INT_TC中断
SUBSRCPND |= BIT_SUB_TC;
SRCPND |= BIT_ADC;
INTPND |= BIT_ADC;
}

第7行首先判断是“Pen Down”还是“Pen Up”中断,如果是“Pen Up”中断,表示触摸完成,在第9行通过wait_down_int()宏令触摸屏控制器进入“等待Pen Down中断模式”,等待下一次操作。
如果是“Pen Down”中断,则在第13行通过mode_auto_xy()宏令触摸屏控制器进入“自动(连续)x/y轴坐标转换模式”,然后在20行启动A/D转换。也可以使用“分离的x/y轴坐标转换模式”手动的分别转换x坐标、y坐标。
第24-26行清除INT_TC中断。

在ADC中断处理函数中获取x、y坐标

在“自动(连续)x/y轴坐标转换模式”下,x、y坐标都转换完毕后,产生INT_ADC中断,进入AdcTsIntHandle中断处理函数,它进而调用INT_ADC的中断服务程序Isr_Adc,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
INT_ADC的中断服务程序
A/D转换结束时发生此中断
先读取x、y坐标值,在进入等待中断模式
*/
static void Isr_Adc(void)
{
//打印x、y坐标值
printf("xdata = %4d, ydata = %4d\r\n",(int)(ADCDAT0 & 0x3ff),(int)(ADCDAT1 & 0x3ff));

//判断是S3C2410还是S3C2440
if((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
{
//S3C2410
wait_down_int(); //进入“等待中断模式”,等待触摸屏松开
}
else
{
//S3C2440
wait_up_int(); //进入“等待中断模式”,等待触摸屏松开
}

//清除INT_ADC中断
SUBSRCPND |= BIT_SUB_ADC;
SRCPND |= BIT_ADC;
INTPND |= BIT_ADC;
}

首先,第9行从ADCDAT0、ADCDAT1寄存器中读出x、y的值,并打印出来。然后,通过第13(S3C2410)、18(S3C2440)行进入“等待Pen Up中断模式”,等待触摸屏松开。S3C2410的触摸屏控制器既等待Pen Down中断,又等待Pen Up中断;S3C2440的触摸屏控制器可以分开设置:等待被按下或(和)等待被松开。
最后,第22-24行清除ADC中断。