伟东山视频自学笔记——触摸屏



常见触摸屏可以分为电阻式、电容式、表面声波式等。电阻式是应用较广的一种触摸屏,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。

s3c2440集成了4线制电阻式的触摸屏接口,触点坐标的检测是通过A/D转换来实现的。s3c2440一共有4种触摸屏接口模式,其中,自动(连续)XY坐标转换模式和等待中

断模式应用比较常见。

 

1.普通转换模式
 
单转换模式是最合适的通用 ADC转换。此模式可以通过设置 ADCCON(ADC控制寄存器)初始化并且通过读写ADCDAT0(ADC数据寄存器 0)就能够完成。

2.分离的 X/Y方向转换模式
 
触摸屏控制器可以工作在两个转换模式之一。分离转换模式如下方法操作。X方向模式写 X方向转换数据到ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y方向模式写 

Y方向转换数据到 ADCDAT1,故触摸屏接口产生中断源给中断控制器。

3.自动(顺序)X/Y方向转换模式
  
自动(顺序)X/Y方向转换模式是系统依次转换触点的X轴坐标和Y轴坐标。触摸屏控制器顺序变换被触点 X 方向和 Y方向。触摸控制器在写入 X测量数值到 ADCDAT010

和写入 Y测量数值到ADCDAT110位中后,触摸屏接口产生中断源给中断控制器。

4.等待中断模式

  当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为 rADCTSC=0xd3; // XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

触摸屏控制器产生中断信号(INT_TC),必须清除等待中断模式。(XY坐标的测量模式也就是 XY_PST 设置到无操作模式--寄存器ADCTSC的低两位必须清零

 

   在一般情况下,为实现触摸屏功能,先是设置为等待中断模式,在产生中断后,再设置为自动(连续)XY坐标转换模式,依次读取触点的坐标值。

寄存器 ADCTSC的第8位能够判断是触笔落下中断还是触笔抬起中断就如同在windows下应用程序一样鼠标按下,放开都会向线程队列中投递消息以区分:

 

 

   寄存器 ADCTSC的第3位可以选择上拉电阻的使能,在等待中断模式下,上拉电阻要有效,在触发中断后,上拉电阻要无效。寄存器ADCTSC的第2位用于选择自动

(连续)XY坐标转换模式。触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断。

 

 

      在开始实现触摸屏功能之前,还需要解决一个问题,那就是触摸屏的校正。触摸屏和LCD是两种不同的物理器件。对于一个分辨率为320×240LCD,它的宽度为320

像素,高度为240个像素。而触摸屏处理的数据是点的物理坐标,该坐标是通过触摸屏控制器采集得到的。要想实现触摸屏上的物理坐标与LCD上的像素点坐标一一对应上,

两者之间就需要一定的转换,即校正。而且电阻式触摸屏由于自身的原因参数会发生变化,因此需要经常性的校正。比较常见的校正方法是三点校正法,它的原理是:

 

      LCD上每个点PD的坐标为[XD,YD],触摸屏上每个点PT的坐标为[XT,YT]。要实现触摸屏上的坐标转换为LCD上的坐标,需要下列公式进行转换:

[plain] view plain copy

 print?

  1. XDA×XTB×YTC  
  2.   
  3. YDD×XTE×YTF  

   因为其中一共有六个参数(A,B,C,D,E,F),因此只需要三个取样点就可以求得这六个参数。这六个参数一旦确定下来,只要给出任意触摸屏上的坐标点PT,代入这个公式,就可以得到它所对应的LCD上像素点的坐标PD。具体的求解过程就不细讲,只给出最终的结果(貌似是线性代数的东东)。已知LCD上的三个取样点为:PD0,PD1,PD2,它们所对应的触摸屏上的三个点为:PT0,PT1,PT2A,B,C,D,E,F这六个参数最终的结果都是一个分式,而且都有一个共同的分母,为:

[plain] view plain copy

 print?

  1. K(XT0XT2)×(YT1YT2)(XT1XT2)×(YT0YT2)  


那么这六个参数分别为:

[plain] view plain copy

 print?

  1. A[(XD0XD2)×(YT1YT2)(XD1XD2)×(YT0YT2)] / K  
  2.   
  3. B[(XT0XT2)×(XD1XD2)(XD0XD2)×(XT1XT2)] / K  
  4.   
  5. C[YT0×(XT2×XD1XT1×XD2)YT1×(XT0×XD2XT2×XD0)YT2×(XT1×XD0XT0×XD1)] / K  
  6.   
  7. D[(YD0YD2)×(YT1YT2)(YD1YD2)×(YT0YT2)] / K  
  8.   
  9. E[(XT0XT2)×(YD1YD2)(YD0YD2)×(XT1XT2)] / K  
  10.   
  11. F[YT0×(XT2×YD1XT1×YD2)YT1×(XT0×YD2XT2×YD0)YT2×(XT1×YD0XT0×YD1)] / K  



      下面的程序是实现触摸屏功能的简单实例——以触点为中心,绘制出一个红色的边长为10个像素的正方形。触点的坐标是用下面方法得到的:当触笔落下时,进入中断,

然后读取触点处的坐标,直到触笔的抬起,才退出该次中断。由于触摸屏需要校正,因此在使用之前需要进行校正处理。但并不是每次使用都要校正,只要坐标没有发生漂移,就不需要再次校正。所以在进行一次校正后,只要把那几个参数保存起来,下次需要时直接使用上次保存下来的参数即可。在这里,我们利用EEPROM来保存这几个参数,

A,B,C,D,E,F,K分别保存在以0x20,0x30,0x40,0x50,0x60,0x70,0x80为首地址内存的连续4个字节空间内,另外内存地址0x1F保存一个标识信息,当为0x6A时,表示这几个

参数已计算并保存好了,只需从上述内存地址中读取参数就行,而当为其他值时,就需要进行校正。校正时,需要三个取样点,在这里我们选取LCD上的(32,24)(160,216)(288,120)为这三个取样点,我们在这三个取样点上画一个十字(如下图所示),只需要依次点击这三个点,即可完成触摸屏的校正。



 

 

这个模块代码我实验了很久都无法通过,按照操作顺序  先设置为等待中断模式之后怎么也无法产生中断。

代码也就没有 Git push了。等以后再研究研究

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s3c2440ADC 触摸屏操作

 (2014-04-2921:39:44)

转载

 

分类: ARM

原理:

 

8通道的AD输入,转换为10位的二进制数据。在2.5MHZ的最大A/D转换时钟下,可以达到500KSPS

 

2440XP XM YP YM直接和触摸屏直接相连。ADC和触摸屏接口公用一个A/D转换器。

 

触摸屏接口模式:

 

1.     正常转换模式,就是普通的AD转换,通过读写ADCDAT0即可。

 

2.     分离的X/Y位置转换模式。X位置写往ADCDAT0Y位置写往ADCDAT1。都会产生中断。

 

3.     连续的X/Y位置转换模式。触摸屏控制器连续转换XY位置。都写完后,产生一个中断。

 

ADC的操作规范:

 

ADC的启动包括手动操作和读结果时自动启动下一次转换。两种方法查询是否结束,查询状态位和转换结束时中断。

 

ADC编程步骤

 

1.     设置ADCCON,选择输入通道,设置AD转换时钟。

 

2.     设置ADCTSC,设为普通转换,不使用触摸屏。

 

3.     设置ADCCON启动AD转换,两种方式。

 

4.     转换结束时,读ADCDAT0获取结果。可以查询,也可以利用中断。

 

触摸屏操作规范:

 

XP YP要么作为模拟输入,要么接电源;XM YM要么接地,要么高阻。

 

1.     设置等待中断模式,设置ADCSTC寄存器即可,此时还需要设置第8位表明是pen down还是pen up中断。

 

2.     中断产生后,就会进入转换阶段,转换又分为X/Y分别转换和X/Y连续转换模式,在等待模式中上拉电阻有效,在触发中断后,上拉电阻无效。

 

可以为X.Y分别转换,设置ADCSTC=0x69 0x9a即可,X转换完会进入ADC中断,Y转换完也会进入ADC中断。

 

也可以设置连续的X.Y转换。此时ADCSTC的低2位设置为003位设置为AUTO_PST

 

 

 

 

 

 

S3C2440包含一个8通道A/D转换器,有10位分辨率下面简要介绍一下S3C2440ADC的用法:

用到的寄存器:

 

      ADCCONADC控制寄存器

      ADCDAT0ADC转换数据寄存器

      SUBSRCPND:次级源挂起寄存器

      INTSUBMSK:中断次级屏蔽寄存器

      SRCPND:源挂起寄存器

      INTPND:中断挂起寄存器

      INTMSK:中断屏蔽寄存器

      ADCCONAD控制寄存器

      ADCDAT0AD转换数据寄存器

1,首先设置控制寄存器ADCCON的相应位来选择频率和通道:

[html] view plaincopy

 

rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel,分频使能,写入分频值,选择通道  

其中PreScaler是预分频值,决定A/D转换器频率 = 50MHz/49+1 = 1MHz如图:

 

2,然后启动AD并等待启动位ADCCON[0]0和转换结束位ADCCON[15]1

[html] view plaincopy

 

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等待转换结束  


3,最后读取相应通道转换结果寄存器的值:

寄存器ADCDAT0的低10位用于存储A/D转换后的数据。

[html] view plaincopy

 

return ( (int)rADCDAT0 & 0x3ff );//返回0~9位的采样值,0~1023  

[html] view plaincopy

 

a0=ReadAdc(0); //对应开发板上W1可调电阻  

a1=ReadAdc(1); //对应开发板上W2可调电阻  

OK

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值