DX能否帮我分析下这段TouchScreen的代码操作流程 ?

[复制链接]
 楼主| playlinus 发表于 2009-5-22 09:28 | 显示全部楼层 |阅读模式
DX能否帮我分析下这段TouchScreen的代码操作流程&nbsp;?<br /><br />/*****************************************<br />&nbsp;&nbsp;NAME:&nbsp;Touchpanel.c<br />&nbsp;&nbsp;DESC:&nbsp;ADC&nbsp;&&nbsp;Touch&nbsp;screen&nbsp;test<br />&nbsp;&nbsp;HISTORY:<br />&nbsp;&nbsp;2003.09.23:Leon&nbsp;YH&nbsp;KIM:&nbsp;draft&nbsp;ver&nbsp;1.0<br />*****************************************/<br />#include&nbsp;&quot;def.h&quot;<br />#include&nbsp;&quot;2440addr.h&quot;<br />#include&nbsp;&quot;2440lib.h&quot;<br /><br /><br />#define&nbsp;REQCNT&nbsp;30<br />#define&nbsp;ADCPRS&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;//YH&nbsp;0627<br />#define&nbsp;LOOP&nbsp;1<br /><br />void&nbsp;__irq&nbsp;AdcTsAuto(void);<br /><br />int&nbsp;count=0;<br />volatile&nbsp;int&nbsp;xdata,&nbsp;ydata;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;Test_Touchpanel(void)<br />{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCDLY=50000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Normal&nbsp;conversion&nbsp;mode&nbsp;delay&nbsp;about&nbsp;(1/3.6864M)*50000=13.56ms<br />&nbsp;&nbsp;&nbsp;&nbsp;//Touch&nbsp;down&nbsp;to&nbsp;conversion&nbsp;delay&nbsp;time&nbsp;width&nbsp;,&nbsp;X&nbsp;coordinate&nbsp;&&nbsp;Y&nbsp;coordinate&nbsp;conversion&nbsp;time&nbsp;width&nbsp;setting&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCCON=(1&lt&lt14)+(ADCPRS&lt&lt6);&nbsp;&nbsp;&nbsp;//ADCPRS&nbsp;En,&nbsp;ADCPRS&nbsp;Value<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;A/D&nbsp;converter&nbsp;prescaler&nbsp;enable&nbsp;,&nbsp;PRSCVL&nbsp;value&nbsp;setting&nbsp;,&nbsp;A/D&nbsp;Frequency&nbsp;=&nbsp;PCLK&nbsp;/&nbsp;(PRSCVL&nbsp;+&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;ADC&nbsp;touch&nbsp;screen&nbsp;test
&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC=0xd3;&nbsp;&nbsp;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En<br />&nbsp;&nbsp;&nbsp;&nbsp;//Detect&nbsp;stylus&nbsp;down&nbsp;interrupt&nbsp;signal&nbsp;,&nbsp;YM&nbsp;Enable&nbsp;,&nbsp;YP&nbsp;Disable&nbsp;,&nbsp;XM&nbsp;Disable,&nbsp;XP&nbsp;Disable&nbsp;,&nbsp;XP&nbsp;Pull-up&nbsp;enable&nbsp;,&nbsp;Normal&nbsp;ADC&nbsp;Conversion&nbsp;,&nbsp;Waiting&nbsp;for&nbsp;interrupt&nbsp;mode&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_ADC&nbsp;=&nbsp;(int)AdcTsAuto;//将中断处理程序名放入中断向量表中对应地址<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=~BIT_ADC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ADC&nbsp;Touch&nbsp;Screen&nbsp;Mask&nbsp;bit&nbsp;clear<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK=~(BIT_SUB_TC);//Touch&nbsp;Screen&nbsp;Mask&nbsp;bit&nbsp;clear<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
Type&nbsp;any&nbsp;key&nbsp;to&nbsp;exit!!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
Stylus&nbsp;Down,&nbsp;please......&nbsp;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Getch();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK|=BIT_SUB_TC;//Touch&nbsp;Screen&nbsp;Mask&nbsp;bit&nbsp;set<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK|=BIT_ADC;//ADC&nbsp;Touch&nbsp;Screen&nbsp;Mask&nbsp;bit&nbsp;set<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Touch&nbsp;Screen&nbsp;Test&nbsp;is&nbsp;Finished!!!
&quot;);<br /><br />}<br /><br /><br />void&nbsp;__irq&nbsp;AdcTsAuto(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;saveAdcdly;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(rADCDAT0&0x8000)//判断&nbsp;updown&nbsp;bit&nbsp;,如果提起则<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Uart_Printf(&quot;
Stylus&nbsp;Up!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&=0xff;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;stylus&nbsp;down&nbsp;interrupt&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Uart_Printf(&quot;
Stylus&nbsp;Down!!
&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC=(1&lt&lt3)|(1&lt&lt2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//XP&nbsp;Pull-up&nbsp;disable,&nbsp;Seq.&nbsp;X,Y&nbsp;postion&nbsp;measure.<br />&nbsp;&nbsp;&nbsp;&nbsp;saveAdcdly=rADCDLY;<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCDLY=40000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Normal&nbsp;conversion&nbsp;mode&nbsp;delay&nbsp;about&nbsp;(1/50M)*40000=0.8ms<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rADCCON|=0x1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//start&nbsp;ADC&nbsp;&nbsp;AD转换开始且该位在开始后清零<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rADCCON&nbsp;&&nbsp;0x1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;if&nbsp;Enable_start&nbsp;is&nbsp;low<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!(rADCCON&nbsp;&&nbsp;0x8000));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;if&nbsp;EC(End&nbsp;of&nbsp;Conversion)&nbsp;flag&nbsp;is&nbsp;high,&nbsp;This&nbsp;line&nbsp;is&nbsp;necessary~!!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!(rSRCPND&nbsp;&&nbsp;(BIT_ADC)));&nbsp;&nbsp;//check&nbsp;if&nbsp;ADC&nbsp;is&nbsp;finished&nbsp;with&nbsp;interrupt&nbsp;bit<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xdata=(rADCDAT0&0x3ff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ydata=(rADCDAT1&0x3ff);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//YH&nbsp;0627,&nbsp;To&nbsp;check&nbsp;Stylus&nbsp;Up&nbsp;Interrupt.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rSUBSRCPND|=BIT_SUB_TC;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClearPending(BIT_ADC);//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK=~(BIT_SUB_TC);//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=~(BIT_ADC);//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&nbsp;=0xd3;&nbsp;&nbsp;&nbsp;&nbsp;//Waiting&nbsp;for&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC=rADCTSC|(1&lt&lt8);&nbsp;//&nbsp;Detect&nbsp;stylus&nbsp;up&nbsp;interrupt&nbsp;signal.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//to&nbsp;check&nbsp;Pen-up&nbsp;state<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rSUBSRCPND&nbsp;&&nbsp;(BIT_SUB_TC))&nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;if&nbsp;ADC&nbsp;is&nbsp;finished&nbsp;with&nbsp;interrupt&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Uart_Printf(&quot;Stylus&nbsp;Up&nbsp;Interrupt~!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;Stylus&nbsp;is&nbsp;up(1)&nbsp;state<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;count=%03d&nbsp;&nbsp;XP=%04d,&nbsp;YP=%04d
&quot;,&nbsp;count++,&nbsp;xdata,&nbsp;ydata);&nbsp;&nbsp;&nbsp;&nbsp;//X-position&nbsp;Conversion&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rADCDLY=saveAdcdly;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC=rADCTSC&~(1&lt&lt8);&nbsp;//&nbsp;Detect&nbsp;stylus&nbsp;Down&nbsp;interrupt&nbsp;signal.<br />&nbsp;&nbsp;&nbsp;&nbsp;rSUBSRCPND|=BIT_SUB_TC;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK=~(BIT_SUB_TC);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Unmask&nbsp;sub&nbsp;interrupt&nbsp;(TC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ClearPending(BIT_ADC);<br />}<br /><br /><br />自己看单句还基本看明白了,可整个流程不了解,如果我要多次采集一个点,又该如何处理呢,有没有裸奔玩触摸屏的朋友指导一二&nbsp;....
l0p0c 发表于 2009-5-22 13:08 | 显示全部楼层

不知道你要什么结果?

  
zhousd 发表于 2009-5-22 16:49 | 显示全部楼层

如果用操作系统,那就按专用的驱动格式

编写就是了(很程式化),别人都有例程,直接移过去就得了,还在此细节上浪费时间,不值得。<br /><br />楼主要学习触摸屏原理,大可用裸奔的方法。
 楼主| playlinus 发表于 2009-5-23 19:10 | 显示全部楼层

楼上,我是想裸奔,但以上两段程序的思想方法不太了解,能否

  
zhousd 发表于 2009-5-24 09:41 | 显示全部楼层

楼主完全不懂触摸屏的工作原理,

这些代码对楼主来说就象看天书,若果商家做好的驱动有BUG,那就找商家好了。<br /><br />楼主先把触摸屏的工作原理详细写出来,让大家看看楼主的资质如何。
 楼主| playlinus 发表于 2009-5-25 17:11 | 显示全部楼层

算了,这些老鸟都不会花些时间在问题上,还是自己看书研究...

....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

518

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

102

主题

518

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部