Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128559
  • 博文数量: 64
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 18:44
文章分类

全部博文(64)

文章存档

2014年(64)

我的朋友

分类: 嵌入式

2014-04-26 19:08:12

原文地址:mini2440裸机之Touchpanel 作者:

/**********************************************************************************
  NAME: Touchpanel.c
  DESC: ADC & Touch screen test
  HISTORY:
  2003.09.23:Leon YH KIM: draft ver 1.0
 ***********************************************************************************/
#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=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);  //输出坐标信息
    rADCDLY=saveAdcdly;         //延时,等待串口输出
    rADCTSC=rADCTSC&~(1<<8);    //重新设为触摸笔按下中断,为下次的触摸做准备
    rSUBSRCPND|=BIT_SUB_TC;     //清除中断标志
    rINTSUBMSK=~(BIT_SUB_TC);   //重新开启中断
    ClearPending(BIT_ADC);
}
参考网址:
阅读(1128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~