S3C2440之触摸屏

发布者:w2628203123最新更新时间:2015-09-15 来源: eefocus关键字:S3C2440  触摸屏 手机看文章 扫描二维码
随时随地手机看文章
触摸屏附着在显示器表面,根据触摸点在显示屏上对应坐标点的显示内容或图形符号进行相应操作。

其坐标识别原理如下图:

当手指触摸屏幕时,两个相互绝缘的导电层在触摸点处连接,顶层的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;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

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

  1. rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear,enable ADCint  
  2. rINTSUBMSK=~(BIT_SUB_TC);//enable sub  ADCint  
2,编写中断函数。

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

  1. rADCTSC=(1<<3)|(1<<2);         //Pull-up disable,(在触发中断后,上拉电阻要无效) Seq. X,Y postion measure.  
  2. saveAdcdly=rADCDLY;             //save ADCDLY(启动延时)  
  3. rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms  
  4.   
  5. rADCCON|=0x1;                   //start ADC  
要等待转换开启结束和转换结束
  1. while(rADCCON 0x1);       //check if Enable_start is low,转换开启结束  
  2. while(!(rADCCON 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!                  

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

  1. while(!(rSRCPND (BIT_ADC)));  //check if ADC is finished with interrupt bit  
其中,x轴坐标值放入ADCDAT0[9..0],y轴坐标值放入ADCDAT1[9..0]
  1. xdata=(rADCDAT0&0x3ff);  
  2. ydata=(rADCDAT1&0x3ff);//读取转换结果,x轴坐标值放入rADCDAT0,y轴坐标值放入ADCDAT1  

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

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

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

  1. rADCTSC=rADCTSC|(1<<8); // Detect tylus up sinterrupt signal.检查触笔抬起中断  
  2.     while(1)        //to check Pen-up state  
  3.      
  4.      if(rSUBSRCPND (BIT_SUB_TC))  //check if ADC is finished with interrupt bit  
  5.           
  6.             //Uart_Printf("Stylus Up Interrupt~! ");//触笔抬起!  
  7.             break;  //if Stylus is up(1) state  
  8.          
  9.      [page]
Test_Touchpanel.c实现检测触点坐标
  1. #define REQCNT 30  
  2. #define ADCPRS    //YH 0627  
  3. #define LOOP  
  4.   
  5. void __irq AdcTsAuto(void);  
  6.   
  7. int count=0;  
  8. volatile int xdata, ydata;  
  9.       
  10. void Test_Touchpanel(void)  
  11.  
  12.      
  13.     rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms  
  14.     rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value  
  15.   
  16.     Uart_Printf("ADC touch screen test ");  
  17.   
  18.     rADCTSC=0xd3;  //[0:7]Wfait,XP_PU(在等待中断模式下,上拉电阻要有效),XP_Dis,XM_Dis,YP_Dis,YM_En  
  19.   
  20.     pISR_ADC (int)AdcTsAuto;  
  21.     rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear,enable ADCint  
  22.     rINTSUBMSK=~(BIT_SUB_TC);//enable sub  ADCint   
  23.   
  24.     Uart_Printf(" Type any key to exit!!! ");  
  25.     Uart_Printf(" Stylus Down, please......  ");  
  26.     Uart_Getch();  
  27.   
  28.     rINTSUBMSK|=BIT_SUB_TC;//get key then mask  sub ADCint ;exit  
  29.     rINTMSK|=BIT_ADC;//mask ADCint  
  30.     Uart_Printf("Touch Screen Test is Finished!!! ");  
  31.   
  32.  
  33.   
  34.   
  35. void __irq AdcTsAuto(void)  
  36.  
  37.     int i;  
  38.     U32 saveAdcdly;  
  39.   
  40.     if(rADCDAT0&0x8000)  
  41.      
  42.         //Uart_Printf(" Stylus Up!! ");  
  43.         rADCTSC&=0xff;  // Set stylus down interrupt bit  
  44.      
  45.     //else   
  46.         //Uart_Printf(" Stylus Down!! ");  
  47.   
  48.     rADCTSC=(1<<3)|(1<<2);         //Pull-up disable,(在触发中断后,上拉电阻要无效) Seq. X,Y postion measure.  
  49.     saveAdcdly=rADCDLY;             //save ADCDLY(启动延时)  
  50.     rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms  
  51.   
  52.     rADCCON|=0x1;                   //start ADC  
  53.   
  54.         while(rADCCON 0x1);       //check if Enable_start is low,转换开启结束  
  55.         while(!(rADCCON 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!  
  56.                                             //conversion over  
  57.             while(!(rSRCPND (BIT_ADC)));  //check if ADC is finished with interrupt bit,等待中断清零?  
  58.   
  59.             xdata=(rADCDAT0&0x3ff);  
  60.             ydata=(rADCDAT1&0x3ff);//读取转换结果,x轴坐标值放入rADCDAT0,y轴坐标值放入ADCDAT1  
  61.   
  62.      //YH 0627, To check Stylus Up Interrupt.  
  63.      rSUBSRCPND|=BIT_SUB_TC;  
  64.      ClearPending(BIT_ADC);//清楚中断标志位  
  65.      rINTSUBMSK=~(BIT_SUB_TC);//使能中断?  
  66.      rINTMSK=~(BIT_ADC);  
  67.                
  68.      rADCTSC =0xd3;    //Waiting for interrupt//[0:7]Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En  
  69.      rADCTSC=rADCTSC|(1<<8); // Detect tylus up sinterrupt signal.检查触笔抬起中断  
  70.   
  71.             while(1)        //to check Pen-up state  
  72.              
  73.              if(rSUBSRCPND (BIT_SUB_TC))  //check if ADC is finished with interrupt bit  
  74.                   
  75.                     //Uart_Printf("Stylus Up Interrupt~! ");//触笔抬起!  
  76.                     break;  //if Stylus is up(1) state  
  77.                  
  78.                 
  79.   
  80.     Uart_Printf("count=d  XP=d, YP=d ", count++, xdata, ydata);    //X-position Conversion data              
  81.   
  82.     rADCDLY=saveAdcdly; //恢复ADCDLY原值  
  83.     rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.检查触笔落下中断(下一次检测)  
  84.     rSUBSRCPND|=BIT_SUB_TC;  
  85.     rINTSUBMSK=~(BIT_SUB_TC);   // Unmask sub interrupt (TC)//使能中断       
  86.     ClearPending(BIT_ADC);  
  87.  

效果图:

关键字:S3C2440  触摸屏 引用地址:S3C2440之触摸屏

上一篇:S3C2440裸奔触摸屏
下一篇:运行时域和加载时域(运行地址和加载地址)

推荐阅读最新更新时间:2024-03-16 14:31

美国开发出“隐形触摸屏” 可多点触控
  美国德克萨斯州农业科技大学的研究者最近研制了这款没有触摸屏的“触摸屏”框架,该框架四周安装有红外感应器,密集的红外线形成了无形的射线矩阵,当有人在框架内移动手指或笔时,红外矩阵会追踪物体的轨迹并将这些动作输入电脑,从而实现“真空无屏”操作。这款框架还可贴于普通触屏电脑上,进而实现多点触控。研究人员正在努力探究提高其识别分辨率的方法,希望可以尽快将其投入生产。
[家用电子]
赛普拉斯联手NV 打造高性能触摸屏设计
赛普拉斯的单芯片 TrueTouch® 触摸屏控制器与 NVIDIA Tegra 移动超级芯片相结合,为新款 Android 平板电脑带来了便捷快速的触摸屏设计 2011 年 7 月 27日,北京讯,加州圣何塞讯——赛普拉斯半导体公司(纳斯达克股票代码:CY)日前宣布其正与 NVIDIA 通力合作,共同开发面向下一代的 Android 平板电脑的触摸屏实施方案。该设计采用赛普拉斯可支持高达 11.6 英寸的大尺寸触摸屏的单芯片 TrueTouch® 解决方案和 NVIDIA® Tegra™ 移动超级芯片。 NVIDIA Tegra 前所未有的强大体验引领了新一波超级手机和平板电脑的浪潮。采用全球首款移动双核 CPU,Tegra
[手机便携]
ST推出多点触感电阻式触摸屏控制器
      由于最新的高科技设备如智能手机、移动互联网设备和上网本均采用多点触摸屏,以支持日益复杂的应用和视频游戏,意法半导体(ST)推出一款先进的多点触感“电阻式”触摸屏控制器芯片,以优化支持这项先进功能的电子元器件的材料成本。STM32TS60 是意法半导体最新STMTouch系列产品的首款产品,此系列为客户提供应用广泛的解决方案,包括多点触感元件和接近传感器及触控键传感器。       新的多点触感控制器可检测多达10个同时发生的手指、指甲或触控笔的触摸操作,让应用设计人员用更加直接和自然的用户控制图标取代复杂的菜单序列。多点触感功能使很多操作变得更加容易,例如,浏览和选择选项、手写和数据输入、窗口排列和缩放、图片拾起和
[网络通信]
s3c2440时钟+nandflash拷贝至SDRAM+开启mmu
涉及6个文件 head.S,init.c,main.c,makefile,nand.c,out.lds head.S .text .global _start _start: b Reset HandleUndef: b HandleUndef HandleSWI: b HandleSWI HandlePrefetchAbort: b HandlePrefetchAbort HandleDataAbort: b HandleDataAbort HandleNotUsed: b HandleNotUsed b HandleIRQ HandleFIQ: b HandleFIQ R
[单片机]
"魔指"传感器诞生 任何表面都可变为触摸屏
“魔指”配备了一个微型摄像头和光量传感器,使触摸屏更加普及   加拿大科技人员本月研发出了一个名为“魔指”(Magic Finger)的装置,只要把它戴在手指头上,你就可以让任何表面变成一个触摸屏,从而滑动使用。据悉,该装置配备了一个微型摄像头和光量传感器,以识别服务并检测用户手指的移动。把“魔指”的尼龙指环套在手指上后,你可以使用一些手势来操作电脑了。   该研发团队希望进一步缩小“魔指”的大小,让它成为一个完全独立的设备——可以安装在一个戒指上,或者嵌入指甲下面,甚至是嵌入手指尖。平时它处于休眠状态,需要的时候就可以立刻派上用场。   酷吧?目前的“魔指”装备还仅仅概念设计。但也许不久,它就是一个指尖科技设备—
[家用电子]
S3C2440输入/输出端口
端口控制描述(详细见S3C2440的数据手册) 端口配置寄存器(GPACON至GPJCON) 端口数据寄存器(GPADAT至GPJDAT) 端口上拉寄存器(GPBUP至GPJUP) 杂项控制寄存器 外部中断控制寄存器 用一个实例(LED流水灯)来学习下输入/输出端口 (在TQ2440开发板中 是用GPB5~8控制LED1~4) #include 2440addr.h #define LED1_ON (rGPBDAT &=~(1 5)) #define LED1_OFF (rGPBDAT |=(1 5) ) #define LED2_ON (rGPBDAT &=~(1 6))
[单片机]
<font color='red'>S3C2440</font>输入/输出端口
S3C2440裸机------异常与中断__定时器中断程序示例
1.定时器的工作原理 注意当TCNTn=TCMPn时不会产生中断。 2.代码 2.1 timer.c 首先是根据上面的两个寄存器设置时钟; /* 设置TIMER0的时钟 */ /* Timer clk = PCLK / {prescaler value+1} / {divider value} = 50000000/(99+1)/16 = 31250 */ TCFG0 = 99; /* Prescaler 0 = 99, 用于timer0,1 */ TCFG1 &= ~0xf; TCFG1 |= 3; /* MUX0 : 1/16 */ 然后根据上图的寄存器设置初始值。 /*
[单片机]
<font color='red'>S3C2440</font>裸机------异常与中断__定时器中断程序示例
基于Linux NFS的Web数码相框设计
   O 引言   随着数码相机和互联网的普及,越来越多的家庭拥有自己的媒体库。媒体库中既包含有自己拍摄的影像文件,也有从网络上下载的影像资料。然而展示影像资料的手段单一,主要通过PC来实现。因此未来构建以媒体库为中心的家庭多媒体网络,把多媒体资料在各式各样的家庭网络媒体终端上展示出来,将成为一种必然的趋势。媒体终端包括Web数码相框、网络数字电视等。   Web数码相框的提出正是为了设计一种家庭嵌入式网络媒体终端,但目前市场上常见的数码相框的网络可扩展性差,本设计方案的提出正是为了能够弥补这方面的不足,提高网络可扩展性。并在本设计方案的基础上构建网络数字电视等其他多功能终端实体。    1 技术方案   Web数
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved