2440裸机编程之十 触摸屏

2019-11-09来源: 51hei关键字:2440  裸机编程  触摸屏

触摸屏由于其体积小、轻便和接口简单的特点,成为一种在嵌入式系统中应用广泛的输
入设备。本实例首先介绍四线电阻式触摸屏的结构和工作原理,然后介绍S3C2440A 通过内
部集成的触摸屏控制寄存器的设置,来完成对触摸屏触摸位置坐标的读取。





典型触摸屏的工作组件一般由3 部分组成。两层透明的阻性导体层、两层
导体之间的隔离层和电极。阻性导体层选用阻性材料,如将铟锡氧化物(1TO)涂在衬底上构
成,或者上层衬底用塑料,下层衬底用玻璃。隔离层为粘性绝缘液体材料,如聚脂薄膜。电
极选用导电性能极好的材料(如银粉墨)构成,其导电性能大约为ITO 的1 000 倍。









工作原理:见下图
1.获取X坐标:X+和X-加上正负电压,X方向就会形成电势梯度网络;Y-接高阻,Y+接输入,一旦屏幕上某点被按下,绝缘液体被排开,上下两个导体层在此点导通,Y+获取此点在X方向上的电势,即此点的X坐标,通过ADC转换成数字量输入给系统。
同理
1.获取Y坐标:Y+和Y-加上正负电压,Y方向就会形成电势梯度网络;X-接高阻,X+接输入,一旦屏幕上某点被按下,绝缘液体被排开,上下两个导体层在此点导通,X+获取此点在Y方向上的电势,即此点的Y坐标,通过ADC转换成数字量输入给系统。
这样,通过ADC转换成数字量输入给系统。






这里做个试验,笔尖接触 触摸屏,然后串口打印坐标值。
注意X测量时,依据上述原理,XP接参考电平,XM接地,YP接ADC通道5,YM接高阻,上拉功能取消,这些都在寄存器中设置ADCTSC。
同理,Y测量时,YP接参考电平,YM接地,XP接ADC通道7,XM接高阻,上拉功能取消.
其他用到的是ADC相关的寄存器。
//********************************************************************

#define adc_frequency 2000000

U16 x_tsc,y_tsc;

void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("n触摸屏中断+坐标提取实验n");

tsc_int_init();   //触摸屏中断初始化
tsc_init();    //触摸屏初始化
while(1);

}

void  tsc_int_init(void)  //触摸屏中断初始化
{
rSUBSRCPND |= 1<<9;     //INT_TC清0

rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0

pISR_ADC = (U32)TSC_ISR;   //申请中断向量

rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽

rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽

rADCTSC = 0x0d3 ;     //等待中断模式的特定设置
}


void   TSC_ISR(void) __irq    //触摸屏中断例程
{
rINTMSK |= 1<<31;     //ADC中断的屏蔽
rINTSUBMSK |=  1<<9 | 1<<10;  //TSC和ADC_S中断屏蔽

tsc_get();       //得到触点坐标
Uart_Printf("x=%d,y=%dn",x_tsc,y_tsc);

rSUBSRCPND |= 1<<9;     //INT_TC清0
rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0
  
rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<10); //禁止ADC_S的屏蔽

}


void tsc_init(void)      //触摸屏初始化
{
rADCDLY= 0x5000;//必须要延时
rADCCON = (PCLK/adc_frequency - 1)<<6 | 1<<14 ;    //设置ADC频率,预分频有效
}

void tsc_get(void)
{
rADCCON = rADCCON & ~(7<<3) | 7<<3 ;     //选择XP通道
rADCTSC = (0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|1 ; //X测量模式:YM=Z, YP=AIN[5] ,XM=GND, XP=V, PULL_UP=DISABLE, NORMAL, X-position (ENABLE=GND/V)
    rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
x_tsc = rADCDAT0&0x3FF;         //得到转换结果
  
rADCCON = rADCCON & ~(7<<3) | 5<<3 ;     //选择YP通道
rADCTSC = (1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|2 ; //Y测量模式:YM=GND, YP=V ,XM=Z, XP=AIN[7], PULL_UP=DISENBLE, NORMAL, Y-position (DISABLE=AIN/Z)
rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
y_tsc = rADCDAT1&0x3FF;         //得到转换结果

tsc_int_init();      //触摸屏中断初始化
Delay(10);
while(!((rADCDAT0 & 0X8000) & (rADCDAT1 & 0X8000) ));//等待笔尖抬起
}


//*******************************************************************


结果如图:







下面做个LCD和触摸屏TSC结合的实验,每当触摸屏某点被按下,在LCD的此点显示一个小正方形。
注意LCD的XY坐标与TSC的XY坐标不一样,需要转化,我研究了一下之间的关系,不是太精准,仅供参考:(x_lcd, y_lcd) = ( 1.0084*y_tsc - 150,-0.82*x_tsc +600,12345)。
//********************************************************************

#define adc_frequency 2000000



#define CLKVAL (6)  //VCLK=HCLK÷[(CLKVAL+1)×2]
#define PNRMODE (3)  //TFT LCD panel
#define BPPMODE (12) //16 bpp for TFT
#define ENVID (1)  //输出和控制 有效

#define VBPD (29)  //垂直同步信号后肩
#define LINEVAL (480) //垂直尺寸
#define VFPD (13)  //垂直同步信号前肩
#define VSPW (3)  //垂直同步信号脉宽

#define HBPD (40)  //水平同步信号后肩
#define HOZVAL (800) //水平尺寸
#define HFPD (40)  //水平同步信号前肩

#define HSPW (48)  //水平同步信号脉宽

#define FRM565 (1)  //565格式
#define PWREN (1)  //GPG供电使能(用于掉电模式)
#define BSWP (0)     //字节不交换:
//#define HWSWP (1)     //半字交换 16位用不到


#define OFFSIZE (0)  //若不用虚拟屏幕,则为0
#define PAGEWIDTH (HOZVAL)//虚拟屏幕的宽 单位半字 若不用虚拟屏幕,则和实际一致


U16 x_tsc,y_tsc;



void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("n触摸屏和LCD综合实验nn");
Uart_Printf(" 触摸处将显一个方块nn");

tsc_int_init();   //触摸屏中断初始化
tsc_init();    //触摸屏初始化
lcd_init();    //LCD初始化

//test();

while(1);

}

void test(void)
{
int i;
for(i=50;i<480;i+=50)
  zhengfangxing(400,i,3000);
  
}

void  tsc_int_init(void)  //触摸屏中断初始化
{
rSUBSRCPND |= 1<<9;     //INT_TC清0

rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0

pISR_ADC = (U32)TSC_ISR;   //申请中断向量

rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽

rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽

rADCTSC = 0x0d3 ;     //等待中断模式的特定设置
}


void   TSC_ISR(void) __irq    //触摸屏中断例程
{
rINTMSK |= 1<<31;     //ADC中断的屏蔽
rINTSUBMSK |=  1<<9 | 1<<10;  //TSC和ADC_S中断屏蔽

tsc_get();       //得到触点坐标
Uart_Printf("x=%d,y=%dn",x_tsc,y_tsc);

zhengfangxing( 1.0084*y_tsc - 150,-0.82*x_tsc +600,12345);//实验获得转换关系,精度有待提高

rSUBSRCPND |= 1<<9;     //INT_TC清0
rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0
  
rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<10); //禁止ADC_S的屏蔽

}


void tsc_init(void)      //触摸屏初始化
{
rADCDLY= 0x5000;//必须要延时
rADCCON = (PCLK/adc_frequency - 1)<<6 | 1<<14 ;    //设置ADC频率,预分频有效
}

void tsc_get(void)
{
rADCCON = rADCCON & ~(7<<3) | 7<<3 ;     //选择XP通道
rADCTSC = (0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|1 ; //X测量模式:YM=Z, YP=AIN[5] ,XM=GND, XP=V, PULL_UP=DISABLE, NORMAL, X-position (ENABLE=GND/V)
    rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
x_tsc = rADCDAT0&0x3FF;         //得到转换结果
  
rADCCON = rADCCON & ~(7<<3) | 5<<3 ;     //选择YP通道
rADCTSC = (1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|2 ; //Y测量模式:YM=GND, YP=V ,XM=Z, XP=AIN[7], PULL_UP=DISENBLE, NORMAL, Y-position (DISABLE=AIN/Z)
rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
y_tsc = rADCDAT1&0x3FF;         //得到转换结果

tsc_int_init();      //触摸屏中断初始化
Delay(10);
while(!((rADCDAT0 & 0X8000) & (rADCDAT1 & 0X8000) ));//等待笔尖抬起
}

[1] [2]
关键字:2440  裸机编程  触摸屏 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479514.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:2440裸机编程之十一 GPRS
下一篇:2440裸机编程之九 LCD液晶显示器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

S3C2440裸奔之环境搭建
首先需要搭建一个可以编译代码的环境。从一开始我就不想用ADS(安装完ADS后会产生一个CodeWarrior for ARM Developer Suite的工具,可以编译和调试代码),虽然它是个很好的工具,但是它却隐藏了很多的细节,不利于新手去深度学习。所以我还是希望从Makefile入手,一步一步弄懂所有的细节。第一步:需要先搭建一个Linux环境,我是安装在虚拟机上面的。安装好Linux后,再从网上下载arm-linux-gcc,一般解压后之后就可以直接使用了,但需要先设置好环境参数。二步:编写代码,然后在Linux系统上进行编译。代码在后面会给出。第三步:需要把编译好的bin文件烧写到板子上。这个需要使用J-Link烧录器,
发表于 2019-11-11
S3C2440裸奔之环境搭建
S3C2440裸奔之SDRAM
先安装ADS1.2,该软件主要用来编译并调试ARM处理器的程序的。下面所有的源程序都将通过ADS编译并最终链接成可执行文件,即.bin文件。下面的程序主要是先初始化SDRAM,然后将程序跳转到SDRAM中,并点亮4个LED灯。在ARM处理器启动的最开始,一般都需要:1、关闭“看门狗”;2、关闭中断;然后再初始化SDRAM,因为在初始化SDRAM时,要用到时钟频率,所以也需要设置时钟频率。以下是用汇编语言写的起动代码,为后面的C语言环境作铺垫。WTCON    EQU  0x53000000     ;Watch-dog timer modeINTMSK     E
发表于 2019-11-11
2440裸机编程之五 定时器
S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。定时器特性总结如下。● 5 个16 位定时器可以工作在中断模式或DMA 模式。● 包括2 个8 位预分频器、2 个4 位分割器。● 输出波形的占空比可用编程控制(即进行脉宽调制)。● 具有自动重载模式或单次触发模式。● 具有死区发生器。与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn定时器的频率由PCLK分频而来,即Ftimer = PCLK
发表于 2019-11-11
2440裸机编程之五 定时器
2440裸机编程之六 实时时钟
实时日历时钟(RTC)单元作为S3C2440A 内部一个独立的功能单元,能够像钟表和日历一样保存并自动计算时间。它还具有定时报警和产生节拍的功能。RTC 单元仅需要通过外接一个32. 768 kHz 的晶振来提供时钟源。RTC 可以通过备用电池供电,因此,即使系统电源关闭,也可以继续工作。RTC 的寄存器保存了一些表示时间的8 位BCD 码数据,包括:秒、分、时、日期、星期、月和年。下面分四部分分别介绍:RTC的显示,RTC的设置,RTC的节拍中断,RTC的报警中断一、RTC的显示RTCCON用于RTC的控制,其中RTCCON[0]用于控制使能,所以在操作RTC的任何寄存器之前,要使这一位使能,这样才使操作有效rBCDYEAR&nb
发表于 2019-11-09
2440裸机编程之六 实时时钟
2440裸机编程之七 模数转换器ADC
S3C2440A 内部具有8 路模拟信号输入的10 位模/数转换器(ADC)。用到的寄存器有:ADCCON:用于选择通道、设置频率、开始转换、结束标志   ADC的频率 = PCLK/(ADCCON[13:6]+1)ADCDATn:用于读出ADC通道n的转换结果:ADCDATn[9:0]下面是个ADC通道0的实验程序://********************************************************************#define adc_frequency 2000000void Main(void){       &nb
发表于 2019-11-09
2440裸机编程之七 模数转换器ADC
2440裸机编程之八 UART通用异步收发
S3C2440A 内部集成的UART(通用异步收发器)单元提供三个独立的异步串行I/O端口,也就是通常所说的串口。串口是用途广泛的通讯口,很多工业现场总线都以串口为基础。在这里,串口不仅可以用来与外部设备进行数据通讯,还可以用来观察系统的运行状况,例如前面已经使用过的利用串口终端工具观察程序运行情况的方法。 S3C2440A 的UART 单元提供三个独立的异步串行I/O 端口,每个都可以在中断或DMA 两种模式下工作。它们支持的最高波特率为115. 2 kbps。每个UART 通道包含2 个64 位FIFO 分别供接收和发送使用。S3C2440A 的UART 具有以下可配置的参数项目:可编程的波特率,红外收/发模式,l
发表于 2019-11-09
2440裸机编程之八 UART通用异步收发
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved