FL2440无操作系统应用程序编写测试008——TOUCH SCREEN

Subject:FL2440无操作系统应用程序编写测试008——TOUCH SCREEN

Date:   21-Nov-2011

By:        [email protected]

 

1.TOUCH SCREEN控制框图

 FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第1张图片

 

2.中断控制器控制框图

 FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第2张图片

FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第3张图片

正确理解INT_ADC中断源是编写触摸屏中断处理程序的关键。INT_ADC有二个次级中断源INT_TC及INT_ADC_S,只要任意一个次级中断源产生并且相应的SUBMASK未起作用,那么SRCPND寄存器上的INT_ADC位就会置位,对应的MASK未起作用,就会触发中断。触笔按下,会产生INT_TC中断,此时再启动ADC转换获取触笔坐标,转换结束产生INT_ADC_S中断。次级中断源信号会在SUBSRCPND对应的位上置位,而且需要手动清除。

 FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第4张图片

 

3.TOUCH SCREEN寄存器设置

static void TS_Port_Init(void){

        //ADC转换延迟时间设置

        //ADC转换之前Touch Screen使用3.68Mhz的x-tal clock作为时钟信号源

        //那么延迟时间为(1/3.68M)*rADCDLY

      FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第5张图片

       rADCDLY=5000;//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

     FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第6张图片

 

        //ADC工作方式设置

        //ADC转换频率计算(必须<PCLK/5)

        rADCCON=(1<<14)+(0x31<<6);  //ADCPRS En, ADCPRS Value

       FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第7张图片

 

        //Touch Screen工作方式设置->等待触笔按下中断模式

      FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第8张图片

       rADCTSC=0xd3; //wait for Interrupe mode,detect stylus down interrupt

      FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第9张图片

}

 

4.代码分析 Touchscreen.c

#include "2440addr.h"

#include "2440lib.h"

#include "UART.h"

#include "def.h"

#include "option.h"

 

static U32 count = 0;      //Count

 

//Touch Screen寄存器设置

static void TS_Port_Init(void){

       rADCDLY=50000;//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

       rADCCON=(1<<14)+(0x31<<6);   //ADCPRS En, ADCPRS Value

       rADCTSC=0xd3;                             //wait for Interrupe mode,detect stylus down interrupt

}

 

//Touch Screen中断处理程序

static void __irq AdcTsAuto(void){

 

       static U16  xdata=0,ydata=0;

       U32 r;

 

        EnterCritical(&r);

 

        if(rSUBSRCPND & BIT_SUB_TC)      //触笔按下产生INT_TC中断

       {

               ClearSubPending(BIT_SUB_TC); //清中断源

 

               UART0_Printf("Stylus down!\n");//输出触笔按下信息

 

               //设置转换模式

               rADCTSC |= (1<<2);                   // X,Y自动连续转换

              FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第10张图片

              //启动ADC转换

              rADCCON |= (1<<0);

             FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第11张图片

         }

 

         if(rSUBSRCPND & BIT_SUB_ADC)           //转换完成产生INT_ADC_S中断

         {  

                 ClearSubPending(BIT_SUB_ADC);      //清中断源

       

                 //获取X/Y坐标值

                 xdata=(rADCDAT0 & 0x3ff);

                 ydata=(rADCDAT1 & 0x3ff);

 

                 UART0_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata); //输出坐标信息

 

                 //Touch Screen工作方式设置->等待触笔松开中断模式

                 rADCTSC = 0xd3;

                 rADCTSC |= (1<<8);

 

                 while(1){

                      if(rSUBSRCPND & BIT_SUB_TC)      //此次中断源为触笔松开所产生

                      {

                             ClearSubPending(BIT_SUB_TC);

                             UART0_Printf("Stylus up!\n");

                             rADCTSC = 0xd3;        //重新设置为等待中断模式,等待按下。

                             break;                             //跳出循环

                      }

               }

       }

       

         ClearPending(BIT_ADC);      //清中断源

         ExitCritical(&r);

}

 

void TouchScreen_Test(void)

{

  

       TS_Port_Init();                                //Touch Screen寄存器设置

 

       pISR_ADC = (int)AdcTsAuto;       //安装中断处理程序

   

        //开中断使能

        EnableIrq(BIT_ADC);

        EnableSubIrq(BIT_SUB_TC);

        EnableSubIrq(BIT_SUB_ADC);

 

       while(UART0_GetKey()!=ESC_KEY)

       {

               UART0_Printf("Press Touch Screen...\n");

               Delay(1000);

       }

 

        //禁止中断

       DisableSubIrq(BIT_SUB_ADC);

       DisableSubIrq(BIT_SUB_TC);

       DisableIrq(BIT_ADC);

}

 

5.测试程序及结果

#include "UART.h"

#include "TOUCHSCREEN.h"

 

int Main(void){

       UART0_Port_Init(115200);    //UART端口初始化

       TouchScreen_Test();

       while(1){

               ;

       }

      return 0;

}

 

 FL2440无操作系统应用程序编写测试008——TOUCH SCREEN_第12张图片

 

 

你可能感兴趣的:(FL2440无操作系统应用程序编写测试008——TOUCH SCREEN)