历史上的今天
返回首页

历史上的今天

今天是:2024年10月20日(星期日)

正在发生

2021年10月20日 | mini2440裸机编程--------触摸屏驱动

2021-10-20 来源:eefocus

mini2440上连接的是一个电阻式触摸屏,电阻式触摸屏是基于AD转换实现的,即某个位置按下之后,这点的电压会发生改变,通过电压就可以判断出是哪一个点被按下了,arm可以得到这个点的坐标。因为触摸屏和lcd是两个设备,因此,触摸屏得到的坐标一般不能够与lcd上的坐标对应起来,所以需要我们在程序中手动的进行校正(虽然不对应,但是他们之间的关系式线性的,因此通过三个点的采样,就可以把系数确定下来。)


s3c2440是不支持中断嵌套的。


arm与触摸屏通过tsxptsxm  tsyptsym 四根线相连接,数据手册中有一句话:When Touch Screen device is used; XM or PM is only connected ground for Touch Screen I/F.s3c2440一共有4种触摸屏接口模式,其中,自动(连续)XY坐标转换模式和等待中断模式是我们用到的。


(1)等待中断模式是在触笔落下时产生一个中断,在这种模式下,A/D触摸屏控制寄存器ADCTSC的值应为0xD3,在系统响应中断后,XY坐标的测量模式必须为无操作模式,即寄存器ADCTSC的低两位必须清零。


(2)自动(连续)XY坐标转换模式是系统依次转换触点的X轴坐标和Y轴坐标,其中X轴坐标值写入寄存器ADCDAT0的低10位中,Y轴坐标写入寄存器ADCDAT1的低10位中,在这种模式下,系统同样会产生中断信号。


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


与触摸屏的功能实现相关的有两个中断:int_adc和int_tc,这两个中断源属于subinterrupt source,都属于int_adc,因此在配置中断的时候就需要按照sub中断源的配置方法进行配置。其中,int_tc是在触摸屏被按下或被释放时产生,一个时刻只能检测其中一种事件,具体是检测触摸屏按下还是释放,需要我们在寄存器ADCTSC的第8位能够设置。int_adc是在ad转换完成之后产生的。


寄存器ADCTSC的第3位可以选择上拉电阻的使能,在等待中断模式下,上拉电阻要有效,在触发中断后,上拉电阻要无效。寄存器ADCTSC的第2位用于选择自动(连续)XY坐标转换模式。触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断。A/D延时寄存器ADCDLY可以设置开始中断到真正开始A/D转换这段时间的延时长度,它的时钟源频率为3.68MHz。


实现触摸屏功能的流程是这样的:


1. 设置触摸屏为等待中断模式,配置ADCTSC为检测触摸屏被按下 产生中断。


2. 产生中断后,证明触摸屏被按下。在中断函数中修改ADCTSC和ADCCON,配置触摸屏为连续转换功能。同时要屏蔽int_adc中断。因为我们是在中断函数中,所以,通过while循环检测srcpnd 和 subsrcpnd寄存器来检测是否产生了adc转换完成的中断。也就是屏蔽中断,但是通过检测是否产生中断,来判断adc转换是否完成。


3. adc转换结束后,提取想要的数据。然后配置ADCSTC为检测触摸屏被释放产生中断,同时也要继续屏蔽中断。通过检测srcpnd和subsrcpnd来判断是否产生了触摸屏被释放的中断。当检测到触摸屏被释放后,结束中断函数。


当然,采用其他方法来实现我觉也是可以的,比如说检测到触摸屏被按下后,就结束中断函数。也就是把上面的三个步骤,分别在三个中断函数中实现,也是可行的。



此外,涉及到触摸屏的校正,转载赵老师的方法如下:


比较常见的校正方法是三点校正法,它的原理是:


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


XD=A×XT+B×YT+C


YD=D×XT+E×YT+F


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


K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)


那么这六个参数分别为:


              A=[(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2)] / K


              B=[(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2)] / K


              C=[YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+YT2×(XT1×XD0-XT0×XD1)] / K


              D=[(YD0-YD2)×(YT1-YT2)-(YD1-YD2)×(YT0-YT2)] / K


              E=[(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2)] / K


              F=[YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+YT2×(XT1×YD0-XT0×YD1)] / K


具体操作,就是先在lcd上显示三个点,然后等用于点击这三个点之后,采集这三个点的实际坐标和理论坐标,这样就可以计算得到上面的参数。



下面附上我的代码。


static void __irq touchscreen_irq(void)

{

   int xdata, ydata;

   rADCTSC = (1<<3)|(1<<2);         //上拉电阻无效,自动连续XY坐标转换模式开启

       rADCDLY = 40000;                    //延时

      

       rADCCON|=0x1;                 //开始A/D转换

 

       while(rADCCON & 0x1);               //检查A/D转换是否开始

       while(!(rADCCON & 0x8000));        //等待A/D转换的结束

             

       while(!(rSRCPND & (BIT_ADC))) ;     //判断A/D中断的悬挂位

 

       xdata=(rADCDAT0&0x3ff);                //读取X轴坐标

   ydata=(rADCDAT1&0x3ff);                //读取Y轴坐标

 

   uart_printf("xdata = %x,  ydata = %x adcdata0 = %x ", xdata, ydata, rADCDAT0);

   

       rSUBSRCPND|=BIT_SUB_TC;

   ClearPending(BIT_ADC);

                     

       rADCTSC =0xd3;               //再次设置等待中断模式,这一次是判断触笔的抬起

       rADCTSC = rADCTSC|(1<<8);      //设置触笔抬起中断

 

       while(1)         //等待触笔的抬起

       {

              if(rSUBSRCPND & (0x1<<9))     //检查A/D触摸屏中断悬挂

              {

                     break;                   //如果触笔抬起,则跳出该循环

              }

       }    

    uart_printf("adcdata0 = %x ", rADCDAT0);

rSUBSRCPND = 1<<9;

ClearPending(BIT_ADC); 

uart_printf("irq finishrn");

rADCTSC=0xd3;  // important here

}

 

 

void touchscreen_init(void)

{

rADCDLY=50000;               //设置延时

    rADCCON=(1<<14)+(9<<6);              //设置A/D预分频

 

    rADCTSC=0xd3;                 //设置触摸屏为等待中断模式。

 

    pISR_ADC = (U32)touchscreen_irq;

 

rINTSUBMSK &= ~(BIT_SUB_TC);

rSUBSRCPND = 1<<9;

ClearPending(BIT_ADC);

EnableIrq(BIT_ADC);

}

void touchscreen_test(void) 

{

   touchscreen_init();

}

推荐阅读

史海拾趣

Glenair公司的发展小趣事
使用万用表等工具检查电路中的关键元件是否损坏或性能下降,如电压比较器、继电器、可控硅等。
E-Switch公司的发展小趣事

随着公司的发展,E-Switch不断推出新产品,以满足不同客户的需求。从最初的轻触开关,到后来的防破坏按钮、摇杆开关、滑动开关等多种类型,E-Switch的产品线逐渐丰富起来。同时,公司也积极拓展市场,将产品销往全球各地,进一步提升了品牌影响力。

泽耀科技(Ashining)公司的发展小趣事

随着企业规模的扩大和影响力的提升,泽耀科技(Ashining)开始积极承担社会责任,推动可持续发展。公司注重环保和节能技术的应用,致力于生产环保型电子产品,减少生产过程中的能源消耗和环境污染。同时,泽耀科技还积极参与社会公益事业,为社会的发展贡献自己的力量。

这些故事展示了泽耀科技(Ashining)在电子行业中的发展历程和取得的成就,也体现了公司不断创新、追求卓越的精神。未来,泽耀科技将继续秉持这一精神,为电子行业的发展贡献更多的力量。

Gilway Technical Lamp公司的发展小趣事
如启动器损坏、过载保护器跳闸、温控器失灵等,都可能导致冰箱无法正常运行或制冷效果不佳。
Crystal Semiconductor Corp公司的发展小趣事

随着市场竞争的加剧,Crystal Semiconductor Corp意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高端人才。经过数年的努力,公司成功开发出了一种新型的半导体制程工艺,大幅提高了晶体管的性能和可靠性。这一创新不仅为公司带来了丰厚的利润,也为整个半导体行业树立了新的标杆。

ARBOR公司的发展小趣事

面对日益激烈的市场竞争,ARBOR公司始终坚持创新驱动的发展策略。公司不断加大研发投入,引进高素质的研发人才,加强与国内外科研机构的合作。通过不断创新,ARBOR公司成功推出了一系列具有自主知识产权的新产品和技术。这些创新成果不仅提升了公司的核心竞争力,也为公司的未来发展注入了新的动力。

虽然这些故事是虚构的,但它们反映了电子行业公司可能面临的挑战和机遇。通过不断的技术创新、市场拓展和合作共赢,ARBOR公司或类似的电子企业可以不断壮大并引领行业的发展。

问答坊 | AI 解惑

求助:请帮忙分析一下这个电路

请帮忙分析一下这个电路,IC2用哪个芯片比较合适。…

查看全部问答>

欧洲半导体原厂招聘高级FAE-上海.深圳,详情请进

Senior FAE Scope  Responsible for providing advanced product and system level knowledge relevant for the applications ams are targeting. Working closely with the business units, sales teams, distributors and customers the ro ...…

查看全部问答>

运算放大器应用设计的几个技巧

运算放大器在电路中发挥重要的作用,其应用已经延伸到汽车电子、通信、消费等各个领域,并将在支持未来技术方面扮演重要角色。在运算放大器的实际应用中,设计工程师经常遇到诸如选型、供电电路设计、偏置电路设计、PCB设计等方面的问题。在电子工 ...…

查看全部问答>

特殊74系列芯片资料

我们平时的设计用得比较多的是74LS和74HC两个系列的芯片。这里为大家提供一些特殊的74系列芯片资料。 主要包括16个子系列,这些子系列虽然不常用的,但却是很有用的,如果用普通的LS和HC系列满足不了设计需要,不妨看一看这些系列的芯片,很有可能 ...…

查看全部问答>

evc 的exe 文件掉电后为什么不能运行

我把evc 的exe copy到nand 里面,再上电就不能运行了是真么回事呢?谢谢…

查看全部问答>

求好心的高手帮我解决下程序问题:!

第一个程序是:单片机与PC进行通信,用MAX232实现电平转换,所实现功能是下载的功能,即从PC机上传递数据给单片机.这个程序应该怎么写啊? 第二个程序是:DAC0832的程序,所实现功能就是,输出电压..就OK. 我程序实在是 ...…

查看全部问答>

Allegro 正负片的设置

我在ALLEGRO里边画了一个四层板,我的四层均为走线层,请问我把四层均设为正片,做出来的板子能够正常工作吗?…

查看全部问答>

虚心请教大家一个问题

本帖最后由 dontium 于 2015-1-23 13:39 编辑 我在用TMS320F206这个芯片做电机控制,它要与PCI9054芯片相连接,但是F206没有HPI接口,这样互连怎样实现,希望得到大家的指点`~谢谢` …

查看全部问答>