嵌入式- 触摸屏实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触摸屏实验
实验目的:了解ARM处理器触摸屏的处理机制,掌握在S3C2440A平台下进行触摸屏应用编程需要完成的任
务
实验器材:Sinosys-EA2440实验箱PC机
实验原理:触摸屏的4 根信号线直接和S3C2440A 的TSYM、TSYP、TSXM 和TSXP 四个引脚相连,由S3C2440A 内部来控制电平的转换和AD 的转换测量。触摸屏的硬件连接图如图1.1:
图1.1 触摸屏信号连接图
s3c2440 一共有4 种触摸屏接口模式,其中,自动(连续)XY 坐标转换模式和等待中断模式应用地比较常见。等待中断模式是在触笔落下时产生一个中断,在这种模式下,A/D 触摸屏控制寄存器ADCTSC 的值应为0xD3,在系统响应中断后,XY 坐标的测量模式必须为无操作模式,即寄存器ADCTSC 的低两位必须清零。自动(连续)XY 坐标转换模式是系统依次转换触点的X 轴
坐标和Y 轴坐标,中X 轴坐标值写入寄存器ADCDAT0 的低10 位中,Y 轴坐标写入寄存器ADCDAT1的低10 位中,在这种模式下,系统同样会产生中断信号。在一般情况下,为实现触摸屏功能,先是设置为等待中断模式,在产生中断后,再设置为自动(连续)XY 坐标转换模式,依次读取触点的坐标值。
实验总结:利用ADS1.2 工具(ADS 工具的使用请参照前面的实验)打开“\SourceCode\Interface\touchpanel_test”的工程文touchpanel_test.mcp 工程文件。在Touchpanel.c 的
Test_Touchpanel 子函数中对触摸屏相关的寄存器进行设置和初始化。
rADCDLY=50000; //Normal conversion mode delay about
(1/3.6864M)*50000=13.56ms
rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value Uart_Printf("ADC touch screen test\n");
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En pISR_ADC = (int)AdcTsAuto;//指定触摸屏中断的入口地址rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear rINTSUBMSK=~(BIT_SUB_TC);
触摸屏中断服务程序在对寄存器进行设置和指定中断服务程序
的入口地址后,程序进入等待状态,当用触摸笔点按触摸屏时,处理器接受中断,并进入中断服务程序的执行。中断服务程序源码如下:
int i; U32 saveAdcdly;
if(rADCDAT0&0x8000)
{
//Uart_Printf("\nStylus Up!!\n");
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 启动AD 转换
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);//AD 转换结束后得到(x,y)坐标ydata=(rADCDAT1&0x3ff);
//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
{
//Uart_Printf("Stylus Up Interrupt~!\n");
break; //if Stylus is up(1) state
} } //等待直到触摸笔离开触摸屏时往串口输出坐标值
Uart_Printf("count=%03d XP=%04d, YP=%04d\n",
count++, xdata, ydata);
rADCDLY=saveAdcdly;
rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal. rSUBSRCPND|=BIT_SUB_TC; rINTSUBMSK=~(BIT_SUB_TC); ClearPending(BIT_ADC);
通过DNW软件将程序下载到实验箱中,点击触摸屏,可以在图上观察到不同坐标的变化,如图1.3