mini2440裸机之Touchpanel

article from : http://blog.sina.com.cn/s/blog_684e87fa0101005c.html


#include "def.h"
#include "2440addr.h"
#include "2440lib.h"

#define REQCNT 30
#define ADCPRS 9                                //YH0627,AD转换器预分频器值
#define LOOP 1
 
void __irq AdcTsAuto(void);       //中断程序
 
int count=0;                                    //触摸屏次数的记录
volatile int xdata, ydata;          //x、y坐标
       
void Test_Touchpanel(void)
{   
;ADC转换之前Touch Screen使用3.68MHZ的X-TAL CLOCK作为时钟信号源
;ADC转换延迟时间设置
;那么延迟时间为(1/3.68M)*rADCDLY
开始中断前的第一步(延迟):
       rADCDLY=50000;      //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms,即ADC延时寄存器,设置等待转换测量时间(从中断开始,到转换开始时间)
开始中断前的第二步(使能):
       rADCCON=(1<<14)+(ADCPRS<<6);      //预分频:PCLK/10,分频位使能,A/D 转换器频率 = PCLK / (预分频值+1);//转换时间 = 1/(AD转换频率/ 5 周期)
       Uart_Printf("ADC touch screen test\n");   
开始中断前的第三步(配置):           
       rADCTSC=0xd3;    //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En.为等待触笔按下中断模式
开始中断前的第四步(开中断):
       pISR_ADC = (int)AdcTsAuto;      //安装中断处理程序,把真正的中断函数写进去
       rINTMSK=~BIT_ADC;          //ADC中断屏蔽位无效,ADC总中断INT_ADC开启
       rINTSUBMSK=~(BIT_SUB_TC);   //ADC触摸屏子中断开启
       Uart_Printf("\nType any key to exit!!!\n");
       Uart_Printf("\nStylus Down, please...... \n");
       Uart_Getch();    //该函数作用在于等待用户的触摸,然后触发中断,其实为等待触摸中断,直到用户从键盘随便输入一个字符后,结束该死循环,然后往下继续执行
最后关闭中断:
       rINTSUBMSK|=BIT_SUB_TC;  //关闭ADC触摸屏子中断
       rINTMSK|=BIT_ADC;          //关闭ADC总中断
       Uart_Printf("Touch Screen Test is Finished!!!\n");
}
==============================================================================
中断开始了!!!!
==============================================================================
;进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换,一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束.
void __irq AdcTsAuto(void)
{
  int i;                                 
  U32 saveAdcdly;
        1.设置为按下触发中断
       if(rADCDAT0&0x8000)    //ADCDAT0[15]=1光标提起状态,ADCDAT0[15]=0光标按下状态
       {
      //Uart_Printf("\nStylus Up!!\n");
    rADCTSC&=0xff;                // Set stylus down interrupt bit
       }
        //else 
     //Uart_Printf("\nStylus Down!!\n");
   2.重新配置
   rADCTSC=(1<<3)|(1<<2);    //得到转换数据,XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
    saveAdcdly=rADCDLY;
   rADCDLY=40000;                    //Normal conversion mode delay about (1/50M)*40000=0.8ms,即重设等待转换测量时间
    rADCCON|=0x1;                                      //start ADC
   
   while(rADCCON & 0x1);          //检测ADC转换是否开始,开始后,该位会被自动清零
    while(!(rADCCON & 0x8000));      //等待转换结束,可以读取转换后的数值了
  
                       while(!(rSRCPND & (BIT_ADC)));    //判断ADC的中断悬挂位BIT_ADC,若为1,则说明该中断已经产生,可以处理按下的数据了
                       xdata=(rADCDAT0&0x3ff);    //读取X方向的转换数值     
                       ydata=(rADCDAT1&0x3ff);
    //YH 0627, To check Stylus Up Interrupt.
   rSUBSRCPND|=BIT_SUB_TC;    //清除子中断标志
   ClearPending(BIT_ADC);
   rINTSUBMSK=~(BIT_SUB_TC);  //重新打开中断,为触摸笔抬起中断做准备
   rINTMSK=~(BIT_ADC);
    //这一次的中断设为触笔抬起中断,触摸笔抬起了,一个触摸中断才算结束,才可以读取数据 
       
   rADCTSC =0xd3;      //再设为等待中断模式
   rADCTSC=rADCTSC|(1<<8);  //设置为触笔抬起中断,但不读取此中断的数据,因为按下和抬起是同一点,上面已经处理了按下的数据
      while(1)    //等待触笔的抬起
      {
       if(rSUBSRCPND & (BIT_SUB_TC))    //判断ADC子中断 BIT_SUB_TC       
     {
          //Uart_Printf("Stylus Up Interrupt~!\n");
          break;  //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据 ,跳出循环
        }
      } 
       Uart_Printf("count=d   XP=d, YP=d\n", count++, xdata, ydata);   //输出坐标信息
       rADCDLY=saveAdcdly;                  //延时,等待串口输出
       rADCTSC=rADCTSC&~(1<<8);        //重新设为触摸笔按下中断,为下次的触摸做准备
       rSUBSRCPND|=BIT_SUB_TC;          //清除中断标志
       rINTSUBMSK=~(BIT_SUB_TC);      //重新开启中断
       ClearPending(BIT_ADC);
}

你可能感兴趣的:(mini2440裸机之Touchpanel)