微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440之触摸屏

S3C2440之触摸屏

时间:11-27 来源:互联网 点击:
触摸屏附着在显示器表面,根据触摸点在显示屏上对应坐标点的显示内容或图形符号进行相应操作。

其坐标识别原理如下图:

当手指触摸屏幕时,两个相互绝缘的导电层在触摸点处连接,顶层的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中的数据可以通过中断或查询的方式来访问。


从下面的程序中可以看到这些信号是如何别控制的:

中断模式用到的寄存器:

SUBSRCPND:次级源挂起寄存器

INTSUBMSK:中断次级屏蔽寄存器

SRCPND:源挂起寄存器

INTPND:中断挂起寄存器

INTMSK:中断屏蔽寄存器

ADCCON:AD控制寄存器

ADCDAT0:AD转换数据寄存器

1,初始化ADC。

设置触摸屏接口为等待中断模式:

寄存器ADCTSC的第2位用于选择自动(连续)XY坐标转换模式

寄存器ADCTSC的第3位可以选择上拉电阻的使能,在等待中断模式下,上拉电阻要有效

  1. rADCTSC=0xd3;//[0:7]Wfait,XP_PU(在等待中断模式下,上拉电阻要有效),XP_Dis,XM_Dis,YP_Dis,YM_En

A/D延时寄存器ADCDLY可以设置开始中断到真正开始A/D转换这段时间的延时长度,它的时钟源频率为3.68MHz。

  1. rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms

当然还要开中断,注意INT_TC为子中断:

  1. rINTMSK=~BIT_ADC;//ADCTouchScreenMaskbitclear,enableADCint
  2. rINTSUBMSK=~(BIT_SUB_TC);//enablesubADCint

2,编写中断函数。

如果INT_TC发生,选择XY转换模式,启动A/D转换:

  1. rADCTSC=(1<3)|(1<2);//Pull-updisable,(在触发中断后,上拉电阻要无效)Seq.X,Ypostionmeasure.
  2. saveAdcdly=rADCDLY;//saveADCDLY(启动延时)
  3. rADCDLY=40000;//Normalconversionmodedelayabout(1/50M)*40000=0.8ms
  4. rADCCON|=0x1;//startADC

要等待转换开启结束和转换结束

  1. while(rADCCON&0x1);//checkifEnable_startislow,转换开启结束
  2. while(!(rADCCON&0x8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!!

通过INT_ADC检查AD转换是否完成:

  1. while(!(rSRCPND&(BIT_ADC)));//checkifADCisfinishedwithinterruptbit

其中,x轴坐标值放入ADCDAT0[9..0],y轴坐标值放入ADCDAT1[9..0]

  1. xdata=(rADCDAT0&0x3ff);
  2. ydata=(rADCDAT1&0x3ff);//读取转换结果,x轴坐标值放入rADCDAT0,y轴坐标值放入ADCDAT1

设置触摸屏为等待中断模式

  1. rADCTSC=0xd3;//Waitingforinterrupt//[0:7]Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

等待触笔抬起后,恢复现场,结束中断函数。

  1. rADCTSC=rADCTSC|(1<8);//Detecttylusupsinterruptsignal.检查触笔抬起中断
  2. while(1)//tocheckPen-upstate
  3. {
  4. if(rSUBSRCPND&(BIT_SUB_TC))//checkifADCisfinishedwithinterruptbit
  5. {
  6. //Uart_Printf("StylusUpInterrupt~!");//触笔抬起!
  7. break;//ifStylusisup(1)state
  8. }
  9. }

Test_Touchpanel.c实现检测触点坐标

  1. #defineREQCNT30
  2. #defineADCPRS9//YH0627
  3. #defineLOOP1
  4. void__irqAdcTsAuto(void);
  5. intcount=0;
  6. volatileintxdata,ydata;
  7. voidTest_Touchpanel(void)
  8. {
  9. rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms
  10. rADCCON=(1<14)+(ADCPRS<6);//ADCPRSEn,ADCPRSValue
  11. Uart_Printf("ADCtouchscreentest");
  12. rADCTSC=0xd3;//[0:7]Wfait,XP_PU(在等待中断模式下,上拉电阻要有效),XP_Dis,XM_Dis,YP_Dis,YM_En
  13. pISR_ADC=(int)AdcTsAuto;
  14. rINTMSK=~BIT_ADC;//ADCTouchScreenMaskbitclear,enableADCint
  15. rINTSUBMSK=~(BIT_SUB_TC);//enablesubADCint
  16. Uart_Printf("Typeanykeytoexit!!!");
  17. Uart_Printf("StylusDown,please......");
  18. Uart_Getch();
  19. rINTSUBMSK|=BIT_SUB_TC;//getakeythenmasksubADCint;exit
  20. rINTMSK|=BIT_ADC;//maskADCint
  21. Uart_Printf("TouchScreenTestisFinished!!!");
  22. }
  23. void__irqAdcTsAuto(void)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top