s3c2440 LCD——坐标读取

一、电阻式触摸屏工作原理原理

1,电阻式触摸屏实物

触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。


为了防止触摸屏和LCD混淆,来张实物图,这就是我们要了解在四线触摸屏,咋一看就是一片一玻璃,下面我们一点一点分析,看它是如何工作的

2,电阻式触摸屏结构


如上图所示,电阻触摸屏是一块4层的透明的复合薄膜屏,触摸屏由两层塑料薄膜组成,各薄膜层上均涂有一层导电金属(通常是氧化铟锡),中间的空气间隙将二者分开。如下图所示,外面两层白色的,上面我软薄膜,下面白色为玻璃基板,中间两层分别为X、Y两个透明电极层。由上图可知,电阻触摸屏在最上面的触摸屏是软的,所以也称为软屏(相对于电容触摸屏为硬屏

2,电阻式触摸屏如何得到坐标点

  下面这个示意图更比较明确:如果有点按下,如下,X+为VDD,X-为GND,Y+为AD转化,Y-为高阻状态。这样可以测出触点X轴的AD值,同样也可以测出这点Y轴的AD值。


如果上面不太明白的话,再来一个比较简易理解的。等效电路如下所示,电阻式触摸屏工作的核心为:当在X方向的电极对上施加一确定的电压,而Y方向电极对上不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,便可得知触点的X坐标值。同理,当在Y电极对上加电压,而X电极对上不加电压时,通过测量X+电极的电压,便可得知触点的Y坐标。得到(X,Y)就可以得到一个点的坐标值了。


通过上面我们了解了电阻式触摸屏工作原理,坐标位置是如何取得的。



二.  在S3C2440中的触摸屏接口

转换速率:当PCLK=50MHz时,分频设为49,则10位的转换计算如下:
When the GCLK frequency is 50MHz and the prescaler value is 49,
A/D converter freq. = 50MHz/(49+1) = 1MHz
Conversion time = 1/(1MHz / 5cycles) = 1/200KHz = 5 us
This A/D converter was designed to operate at maximum 2.5MHz clock, so the conversion rate can go up to 500 KSPS.
触摸屏接口的模式有以下几种:
普通ADC转换模式
独立X/Y位置转换模式
自动X/Y位置转换模式
等待中断模式
我们主要接受触摸屏接口的等待中断模式和自动X/Y位置转换模式(驱动程序中会用到):
自动转换模式操作流程如下:触摸屏控制器自动转换X,Y的触摸位置,当转换完毕后将数据分别存放在寄存器ADCDAT0(放X坐标)和ADCDAT1(放Y坐标).并产生INT_ADC中断通知转换完毕。
等待中断模式:
Touch Screen Controller generates interrupt (INT_TC) signal when the Stylus is down. Waiting for Interrupt Modesetting value is rADCTSC=0xd3; // XP_PU, XP_Dis, XM_Dis, YP_Dis, YM_En.
当触摸后,触摸屏控制器产生INT_TC中断,四个引脚设置应该为:
引脚 XP XM YP YM
状态 PULL UP/XP Disable Disable (初始值即是) Disable Enable
设置 1 0 1 1
当中断产生后,X/Y的位置数据可以选择独立X/Y位置转换模式,和自动X/Y位置转换模式进行读取,采用自动X/Y位置转换模式进行读取需要对我们已经设置的TSC寄存器进行更改,在原有的基础上或上S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)。
数据转换完毕后,也会产生中断。


三 寄存器

1 . ADCTSC 寄存器


2 . ADCDLY


3.ADCCON与ADCDAT0,1看另一篇文章。

代码如下:

#defineGLOBAL_CLK1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "lcdlib.c"

#include "lcdlib.h"

 

volatile int  xdata,ydata,count;

 

void __irq AdcTsauto(void)//中断处理函数

{

U32 saveAdcdly;

if (rADCDAT0&0x8000)//判断是否为提起状态

{

Uart_Printf("\nStylus Up!\n");

rADCTSC &= 0xFF;

}

else

{

Uart_Printf("\nStylus Down!\n");

}

rADCTSC (1<<3)|(1<<2);//自动连续测量X坐标和Y坐标

saveAdcdly rADCDLY;

rADCDLY 40000;

rADCCON |= 0x01;//AD转换开始且该位在开始后清零

while (rADCCON 0x01);//判断是否开始

while (!(rADCCON 0x8000));//是否被按下

while (!(rSRCPND (BIT_ADC)));//是否发生中断

xdata (rADCDAT0 0x3FF);

ydata (rADCDAT1 0x3FF);

//Check Stylus Up Interrupt.

rSUBSRCPND |= BIT_SUB_TC;//清中断除

ClearPending(BIT_ADC);

rINTSUBMSK ~(BIT_SUB_TC);//打开屏蔽

rINTMSK ~(BIT_ADC);//打开屏蔽

rADCTSC 0xD3;

rADCTSC rADCTSC (1<<8);//检测光标抬起中断信号

while (1)

{

if (rSUBSRCPND (BIT_SUB_TC))//如果按下中断发生

{

Uart_Printf("Stylus Up Interrupt!\n");

break;

}

}

Uart_Printf("count=%d XP=d, YP=d\n", count++, xdata, ydata);

rADCTSC &=~(1<<8);//检测按下中断信号

rSUBSRCPND |= BIT_SUB_TC;

rINTSUBMSK ~(BIT_SUB_TC);

ClearPending(BIT_ADC);

}

 

void AdcTs_Test(void)

{

 

rADCDLY 50000;//设置延时

 

rADCCON (1<<14)+(9<<6);//设置a/d预分频

 

Uart_Printf("\n[ADC touch screen test.]\n");

rADCTSC 0xD3;//XP,YP输出驱动无效传

pISR_ADC (int)AdcTsauto;//中断函数入口地址向量表

rINTMSK ~BIT_ADC;//打开adc中断屏蔽

rINTSUBMSK ~(BIT_SUB_TC);//打开子中断屏蔽

Uart_Printf("\nType any key to exit.\n");

Uart_Printf("\nStylus down, please... \n");

Uart_Getch();

rINTSUBMSK |= BIT_SUB_TC;//禁止中断

rINTMSK |= BIT_ADC;//禁止中断

Uart_Printf("[Touch Screen Test.]\n");

}

 

 

 

void Main(void)

 

{

MMU_Init();//初始化内存,实现内存地址重定向

 

AdcTs_Test();

 

while(1); 

 

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值