2440触摸屏的设置

发布者:gamma13最新更新时间:2016-12-01 来源: eefocus关键字:触摸屏  设置 手机看文章 扫描二维码
随时随地手机看文章

一、触摸屏原理:

    可以参考相关资料,本人参考的是阿南的<<>入门与实践>>中有关触摸屏的内容。

二、2440触摸屏的设置

   1、ADCON: ADC 控制寄存器

#define ADCPRS 24

   rADCCON=(1<<14)+(ADCPRS<<6);

   使能读启动操作。

   AD转换器的预分频值为24,注意:

   AD转换频率=PCLK/(分频值+1),且AD的最高频率为2.5M,这里PCLK=50M,所以AD的转换频率为2M.

  2、ADCTSC ADC 触摸屏控制寄存器

   rADCTSC=0xd3;

当笔尖落下时触摸屏控制器产生中断 (INT_TC) 信号。

YM输出驱动器使能

YP输出驱动器禁止

XM输出驱动器禁止

XP输出驱动器禁止

等待中断模式

注意:自动x,y方向测量是指当测完x跟y后产生ADC中断。

 3、ADCDLY ADC 启动或初始化延时寄存器

   rADCDLY=50000;

   设置一个适当的便可

 4、设置中断服务函数

pISR_ADC = (int)AdcTsAuto;  //设置中断函数地址

rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear

       rINTSUBMSK=~(BIT_SUB_TC); //触摸屏中断

三、触摸屏检测及校正

1、触摸屏的检测思路类似于按键检测,以下为检测一个点的思路:

(1)、设置等待中断,按下有效

(2)、按下进入中断后读取x,y数据

(3)、读取完成后设置成弹起中断,等待一个动作结束

(4)、结束后进入下一次准备。


   程序如下:

void __irq AdcTsAuto(void)

{

    //解摸屏按下,产生中断

       U32 saveAdcdly;

       if(rADCDAT0&0x8000)

              rADCTSC&=0xff;  // Set stylus down interrupt bit

    //关闭XP上拉,启动自动顺序x/y转换

       rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.

    //设置延时时间

       saveAdcdly=rADCDLY;

       rADCDLY=40000; 

               

    //开始AD转换

       rADCCON|=0x1;                   //start ADC

    //AD转换启动后开始位会被清0

       while(rADCCON & 0x1);             //check if Enable_start is low

    //等待转换结束

       while(!(rADCCON & 0x8000));  //check if EC(End of Conversion) flag is high, This line is necessary~!!

       //查询INT_ADC中断,直到查到结束中断标志     

       while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit

    //产生中断标志说明x,y已经转换结束,读取数据。

       xdata=(rADCDAT0&0x3ff);

      ydata=(rADCDAT1&0x3ff);

       //按下标志

       touchedflag=TRUE;

       //check Stylus Up Interrupt.

    //清中断,并且重开中断,再次设置等待中断,这一次设置等待弹起中断。

       rSUBSRCPND|=BIT_SUB_TC;

       ClearPending(BIT_ADC);

       rINTSUBMSK=~(BIT_SUB_TC);

       rINTMSK=~(BIT_ADC);

                      

       rADCTSC =0xd3;    //Waiting for interrupt

       rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

    //查询等待弹起中断标志,直到查到弹起。

       while(1)         //to check Pen-up state

       {

              if(rSUBSRCPND & (BIT_SUB_TC))    //check if ADC is finished with interrupt bit

              {

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

                     break;     //if Stylus is up(1) state

              }

       }    

 

   //此时,一个触摸屏动作检测已经完成,输出坐标信息。

       Uart_Printf("count=%03d  XP=%d, YP=%d\n", count++, xdata, ydata);    //X-position Conversion data           

 

    //再次设置成按下中断,等待下一次动作

       rADCDLY=saveAdcdly;

       rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.

       rSUBSRCPND|=BIT_SUB_TC;

       rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC)    

       ClearPending(BIT_ADC);

}

 

2、触摸屏的校正

触摸屏校正的目的是为了把触摸屏上的坐标跟LCD上坐标一一对应起来。


如上图,假设LCD与触摸屏的点是一一对应的,LCD上四个角的点为人为设置的点(实际只需要上左上跟右下两个点就可以了,还有两个点是用来做平均的),触摸屏上四个角的点为LCD上四个点对应转换来的数值。(ax,ay)为正常工作时点击的点,(x,y)为(ax,ay)对应的坐标。

那么LCD与触摸屏的关系为:

x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0)

y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0)

具体步骤:

以320*240的屏举例:

(1)、设置四个LCD点(30,30)、(30,210)、(290,210)、(290,30)

(2)、在屏幕上依次画出这四个点(以四个点为中心点的十字形),并且依次点击这四个点,分别记下四个点转换出来的数值。(ax0,ay0),(ax0,ax1),(ax1,ay1),(ax1,ay0)

(3)、由x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0),可以把(x1-x0)/(ax1-ax0)转换成常量系数Kx,那么

x=x0+(ax-ax0)*Kx,Kx=(x1-x0)/(ax1-ax0) ,这样只需记下x0,ax0,Kx三个值便可。

同样的:

y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0), y=y0+(ay-ay0)*Ky, Ky=(y1-y0)/(ay1-ay0),只需记下y0,ay0,Ky便可.

(4)、校正完成,正常工作时当点击触摸屏时产生(ax,ay),则

x=x0+(ax-ax0)*Kx

y=y0+(ay-ay0)*Ky

便可以很容易求出实际坐标。

 

校正程序如下:

//触摸屏校正

//x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0)

//x=x0+(ax-ax0)*Kx

//Kx=(x1-x0)/(ax1-ax0)

//x0,ax0,Kx

//同理

//y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0)

//y=y0+(ay-ay0)*Ky

//Ky=(y1-y0)/(ay1-ay0)

//y0,ay0,Ky

volatile U32 touchedflag=FALSE;

//必要的参数

typedef struct cali

{

       int   x0;

       int   ax0;

       float       Kx;

       int   y0;

       int   ay0;

       float Ky;

      

}TCpara;

typedef struct Point

{

       int x;

       int y;

}POINT;

//LCD四个校正点

POINT LCDPoint[4]=

{

       30    ,30,    //左上

       30    ,210,   //左下

       290  ,210,   //右下

       290  ,30    //右上

};

TCpara TCcal;

void touchsrc_calibration()

{    

       U32 i;

       //int x=30,y=30;

       //int LCDx1=30,LCDy1=30,LCDx2=30,LCDy2=150,LCDx3=290,LCDy3=210;

       //TCx3=0,TCy3=0,TCx4=0,TCy4=0;

       //float A,B,C,D,E,F,K;

       //float K

       Lcd_ClearScr(0);

       for(i=0;i<4;i++)

       {

       //分别画出四个点         Glib_Line(LCDPoint[i].x-10,LCDPoint[i].y,LCDPoint[i].x+10,LCDPoint[i].y,(U32)(255<<11));

       Glib_Line(LCDPoint[i].x,LCDPoint[i].y-10,LCDPoint[i].x,LCDPoint[i].y+10,(U32)(255<<11));

       //等待按下

              while(!touchedflag);

              touchedflag=FALSE;

       //分别记下LCD四个点对应的触摸屏的值,因为TQ2440触摸屏的x,接到了控制器的y上,y接到了x上,所以这里反过来记。

              switch(i)

              {

                     case 0:

                     TCx0+=ydata;

                     TCy0+=xdata;

                     break;

                    

                     case 1:

                     TCx0+=ydata;

                     TCy1+=xdata;

                     break;

                    

                     case 2:

                     TCx1+=ydata;

                     TCy1+=xdata;

                     break;

                    

                     case 3:

                     TCx1+=ydata;

                     TCy0+=xdata;

                     break;

                    

                     default:

                     break;

              }

              Lcd_ClearScr(0);

       }

       //得出左上与右下两个点的AD值,注意,其余两个点是为左上与右下两个点服务的。

       TCx0=TCx0>>1;

       TCx1=TCx1>>1;

       TCy0=TCy0>>1;

       TCy1=TCy1>>1;

       //记下LCD初始点

       TCcal.x0 =LCDPoint[0].x;

       TCcal.y0 =LCDPoint[0].y;

       //记下触摸屏初始点

       TCcal.ax0=TCx0;

       TCcal.ay0=TCy0;

    //算出Kx,Ky

       TCcal.Kx =(float)(LCDPoint[2].x-LCDPoint[0].x)/(TCx1-TCx0);

       TCcal.Ky =(float)((LCDPoint[2].y)-LCDPoint[0].y)/(TCy1-TCy0);//(TCy0-TCy1);

       Uart_Printf("TCcal.x0=%d,TCcal.y0=%d\n",TCcal.x0,TCcal.y0);

       Uart_Printf("TCcal.ax0=%d,TCcal.ay0=%d\n",TCcal.ax0,TCcal.ay0);

       Uart_Printf("TCcal.Kx=%d,TCcal.Ky=%d\n",TCcal.Kx,TCcal.Ky);

 

}

 

//打印坐标

void PrintTouchSrcPoint()

{

       int TCx,TCy,x,y;

    //等待按下

       while(!touchedflag);

       touchedflag=FALSE;

       TCx=ydata;

       TCy=xdata;

       //算出x,y坐标

       x=TCcal.x0+(TCx-TCcal.ax0)*TCcal.Kx;

       y=TCcal.y0+(TCy-TCcal.ay0)*TCcal.Ky;

       if((x>=0 && x<320) && (y>=0 && y<240))

       {

       //y=239-y;

       Glib_Rectangle(x-1,y-1,x+1,y+1,(U32)(255<<11));

       Glib_FilledRectangle(x-1,y-1,x+1,y+1,(U32)(255<<11));

       }

       Uart_Printf("x=%d,y=%d\n",x,y);

}

小结:

1、  通过本章学习,理解了四线电阻式触摸屏的原理。并且完成触摸屏检测与校正的实验。

2、  参考了阿南的<<>入门与实践>>中触摸屏部分以及网络资源。


关键字:触摸屏  设置 引用地址:2440触摸屏的设置

上一篇:ucos II+ucGUI+s3c2410+LCD+触摸屏整合
下一篇:s3c2440硬件篇之八:ADC和触摸屏接口

推荐阅读最新更新时间:2024-03-16 15:22

从控制器角度看感应电容触控系统设计
简介 自2007年iPhone®出现后,感应电容触摸屏的应用范围就在不断扩大。尽管如此,真正把感应电容触摸屏集成到设备中仍存在着很大的挑战,尤其在液晶显示器(LCD)、外围器件产生干扰及嘈杂的环境中。有效的解决方案之一是使用高信噪比(SNR)的触摸屏控制器来对抗噪声。一个高信噪比控制器还会有其它优势,下面将会详细描述。 SNR定义为信号(有用的信息)和噪声(无用信号)的功率比。如果信号和噪声在相同的负载下测量,SNR可以通过计算幅度均方根(RMS)的平方获得。功率比的值(PS/PN)通常很大,通常用对数(dB)来描述。SNR可以表示为: SNRdB = 10log10(PS/PN) = 10log10(RMSS/RMSN)²
[单片机]
从控制器角度看感应电容触控系统设计
2017深圳国际全触与显示展全新起航
2017上海国际全触与显示展、国际新型显示技术展在上海世博展览馆成功落下帷幕,3天展会共接待观众22, 000余名。并吸引到了京东方、天马、信利、和辉光电、维信诺、维业达、康得新等业内一线品牌企业现场展示最新产品与技术,各展位前人头攒动、盛况空前。下面就随手机便携小编一起来了解一下相关内容吧。 纵览全球,光电显示领域正发生深刻的技术变革,恰逢国家“一带一路”战略实施期间,印尼、越南、巴基斯坦、捷克、波兰、德国、阿联酋等“一带一路”沿线国家市场全面对华开放, 为中国触摸屏和光电显示企业进一步扩大国际合作,拓展海外市场带来了无限可能。在国内光电显示企业在多项关键技术实现突破之际,作为国际光电显示技术发展的风向标、拓展国内外贸易的
[手机便携]
AVR单片机端口设置
DDRA=OXFF; PORTA=OXFF; 与 PORTA=OXFF; DDRA=OXFF; 是有区别的,这两种顺序对应IO口的电平变化是不一样的。这个区别是在产品性能上面的,从表面上看不出明显区别,没有一定电路功底的可能不太好理解。DDRA、PORTA、在上电时默认都为0x00;如果你设方向DDRA后设PORTA的话,设定为输出方向的全部输出低电平、再设定电平,这个时候输出高电平,那么在输出高电平的这个IO口上面,就会有一个从低电平到高电平的瞬间变化,因为在变化期间IO口方向已经为输出,所以这个信号是有一定能量的,会产生一定的干扰。如果先设电平再设方向的话:上面说的瞬间变化就不会发生了。 ATMEGA8单片机I
[单片机]
S3C2440的RAM和启动过程!
2440自带的RAM是:16K Instruction cache + 16K data cache + 4K Boot Internal SRAM。但是我们能用到的只有4K Boot Internal SRAM;2440不自带ROM。 2440的启动方式有两种,norflash和nandflash,怎么选择? OM = 01,10为norflash启动,分别对应16bit和32bit,OM = 00为nandflash启动。 两种启动方式:先贴张图。 可以观察到,s3c2440总共有8个内存banks,6个内存bank可以当作ROM或者SRAM来使用,留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM
[单片机]
S3C<font color='red'>2440</font>的RAM和启动过程!
Trio运动控制器在检测设备上的应用
1.系统要求 1)设计一检测系统,它能控制检测头沿着物体表面0.5mm的距离运动,并且在运动同时时刻保证检测头垂直于物体表面。 2)系统可控制两个直线轴(X Z1)和一个回转轴(B),其中两个直线轴(X Z1)和回转轴(B)可以联动,回转轴(B)的方向保持与X Z1运行轨迹的法线保持一致。为了增加检测速度,再增加一Z2轴检测工件的直线部分。 3)可通过手动、自动方式对4个轴进行控制。 4)提供10个零件的运行轨迹,各零件的工作起始点可以通过手动方式确定。 5)可通过触摸屏进行手动操作。 2.硬件构成 检测头是针形结构。旋转轴通过减速器控制检测头旋转。二维十字平台控制旋转轴的平面运
[工业控制]
iar输出s19用于stvp下载的设置方法
iar输出s19用于stvp下载的设置方法
[单片机]
iar输出s19用于stvp下载的<font color='red'>设置</font>方法
Jlink烧写JZ2440的Nor Flash
一、需要Jlink烧写Nor Flash。 这只能在windows下操作。 a.开发板设置为Nor Flash启动,连接电脑,上电。 b.启动j-flash。J-flash操作如下: 在J-Flash里操作: 1.选择菜单“File - Open - Open Project…”,打开附件里的s3c2440.jflash。 图 打开S3C2440工程 2.选择菜单“Target - Connect” 图 连接开发板 3. 选择菜单“File - Open”,打开要烧写的二进制文件,比如u-boot.bin,并且在“Start address”里输入0。 图 打开bin文件 4. 选择菜单“
[单片机]
Jlink烧写JZ<font color='red'>2440</font>的Nor Flash
如何为波特图设置频率响应分析仪
  环路增益是描述开关模式电源特性的一个重要参数。使用频率分析仪来测定环路增益能让您稳定电源并优化瞬态响应。   在测定波特图之前,您需先断开环路并在断点处插入一个小型电阻器,如图1所示。该频率分析仪有一个信号源,可跨该小型电阻器注入交流(AC)干扰信号vds。   图1:典型的波特图测定设置   其结果是,AC波动出现在跨该断点的两个节点(A和B)处。该频率分析仪具有两个接收器,能测量节点A和节点B处的信号vA和vB。您可用方程式1计算出该系统环路增益TV:   方程式1   为了准确测量TV,该分析仪必须准确测量vA和vB。频率分析仪接收器已限制了信号测量分辨率。在本文中,笔者将用来自AP Instruments公司
[测试测量]
如何为波特图<font color='red'>设置</font>频率响应分析仪
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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