打印

四 ARM9(S3C2440)的ADC和触摸屏控制——理论知识及程序实例

[复制链接]
4345|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mizhongqin|  楼主 | 2011-9-13 00:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
概述
10 位CMOS ADC(模/数转换器)是一个8 通道模拟输入的再循环类型设备。其转换模拟输入信号为10 位二
进制数字编码,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电
模式的操作。
触摸屏接口可以控制/选择触摸屏X、Y 方向的引脚(XP,XM,YP,YM)的变换。触摸屏接口包括触摸屏引
脚控制逻辑和带中断发生逻辑的ADC 接口逻辑。
触摸屏接口模式
1. 普通转换模式
单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)初始化并且通过读写
ADCDAT0(ADC 数据寄存器0)就能够完成。
2. 分离的X/Y 方向转换模式
触摸屏控制器可以工作在两个转换模式之一。方向转换模式如下方法操作。X 方向模式写X 方向转换数据到
ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y 方向模式写Y 方向转换数据到ADCDAT1,故触摸屏接口产
生中断源给中断控制器。
3. 自动(顺序)X/Y 方向转换模式
自动(顺序)X/Y 方向转换模式操作如下。触摸屏控制器顺序变换触摸X 方向和Y 方向。在自动方向转变模式中触摸
控制器在写入X 测量数值到ADCDAT0 和写入Y 测量数值到ADCDAT1 后,触摸屏接口产生中断源给中断控制器。
4. 等待中断模式
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为rADCTSC=0xd3; // XP_PU,XP_Dis,
XM_Dis,YP_Dis,YM_En
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。(XY_PST 设置到无操作模式)
待机模式
当ADCCON [2]被设置为'1'时激活待机模式。此模式中,停止A/D 转换操作并且ADCDAT0、ADCDAT1 寄存
器包含的是先前转换的数据。
寄存器的功能可以看一下数据手册
下面是结合FL2440开发板的触摸屏操作实例:
触摸屏工作流程以及程序设计流程:
一、触摸屏初始化:
  1、设置触摸屏接口为中断等待模式(ADCTSC寄存器),等待触摸笔按下
  2、清除源挂起寄存器(SRCPND)、中断挂起寄存器(INTPND)、子源挂起寄存器
(SUBSRCPND)
  3、程序入口函数,关中断屏蔽寄存器和子中断屏蔽寄存器(INTMSK,INTSUBMSK),中断
模式和中断优先级默认即可
二、触摸屏中断服务子程序:
   一)触摸笔按下中断
     4、如果中断发生,设置x,y坐标为自动转换模式
     5、启动AD转换,然后检测AD转换是否启动
     6、检测AD转换是否结束,若结束,获取x,y坐标的值
     7、对几个寄存器写1清零,防止反复发生中断(这里的中断是笔尖按下中断)
   二)触摸笔抬起中断
     8、设置触摸屏即可为等待中断模式,等待触摸笔抬起(ADCTSC,关键是要设置触摸
笔抬起中断信号)
     9、如果发生中断,不做任何操作,只打印出一句触摸笔抬起中断信息
     10、触摸笔抬起之后,把得到的x,y坐标值发送给PC机,显示出具体数值
   三)再次设置触摸屏为等待中断模式,等待下次触摸屏被按下

#include"2440addr.h"
#include"def.h"
//void Touch_Screen_Off(void);
int key=0,xdata,ydata;
void __irq ADC_ISR(void) ;
void ledcontrol();
void Touch_Screen_Init(void)
{
    rADCDLY=50000;    //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
    // Enable Prescaler=39,Prescaler A/D converter freq. = 50 MHz/(39+1) = 1.25MHz
    //Conversion time = 1/(1.25MHz / 5cycles) = 1/250 kHz = 4 us  
    //AIN0,Normal,Disable read start,No operation
   
    rADCCON = (1<<14)|(39<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
    //YM=GND,YP=AIN5,XM=Hi-z,XP=AIN7,XP pullup En,Normal ADC,Waiting for interrupt mode  
     
    rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
   
    pISR_ADC    = (unsigned)ADC_ISR; //中断服务函数地址赋给中断指针
  
   
    ClearSubPending(BIT_SUB_TC);//清子挂起寄存器
    ClearSubPending(BIT_SUB_ADC);
    ClearPending(BIT_ADC);//清挂起寄存器
    EnableSubIrq(BIT_SUB_TC); //使能子中断
    EnableIrq(BIT_ADC);    //使能中断
}

void __irq ADC_ISR(void)
{

U32 saveAdcdly;
    if(rADCDAT0&0x8000)//顺序X 方向、Y 方向测量
    {
  rADCTSC&=0xff; // Set stylus down interrupt bit
    }
rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
saveAdcdly=rADCDLY;
rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms
rADCCON|=0x1;                   //start ADC
  while(rADCCON & 0x1);  //check if Enable_start is low
  while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!
  
            while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit
            xdata=(rADCDAT0&0x3ff);//读取x坐标数据
            ydata=(rADCDAT1&0x3ff);//读取y坐标数据
  //YH 0627, To check Stylus Up Interrupt.
  rSUBSRCPND|=BIT_SUB_TC;//清除相应的寄存器
  ClearPending(BIT_ADC);
  rINTSUBMSK=~(BIT_SUB_TC);
  rINTMSK=~(BIT_ADC);
   
  rADCTSC =0xd3;    //Waiting for interrupt
  rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
   while(1)  //to check Pen-up state
   {
    if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
     {
     break; //if Stylus is up(1) state
    }
   }

    ledcontrol();        
rADCDLY=saveAdcdly;
rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
    rSUBSRCPND|=BIT_SUB_TC;
    rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC)   
    ClearPending(BIT_ADC);
}


void ledcontrol()//根据点击的触摸屏的位置来判断控制哪一个led的亮灭
{

if((xdata>100)&&(xdata<500)&&(ydata>500)&&(ydata<900))
      
      {
       key=1;
      
      }
      else if((xdata>500)&&(xdata<900)&&(ydata>500)&&(ydata<900))
       {
        key=2;
       }
       else if((xdata>100)&&(xdata<500)&&(ydata>100)&&(ydata<500))
        {
         key=3;
        }
        else if((xdata>500)&&(xdata<900)&&(ydata>100)&&(ydata<500))
        {
         key=4;
        }
      
    switch(key){
      
      case 1:
        rGPBDAT^=(1<<5);
        key=0;//将i清零防止下次收到其他数据时干扰
        break;
      case 2:
        rGPBDAT^=(1<<6);
        key=0;
        break;
      case 3:
        rGPBDAT^=(1<<8);
        key=0;
        break;
      case 4:
        rGPBDAT^=(1<<10);
        key=0;
        break;
      default:break;
      }         
}
void Touchmain(void)
{
rGPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出
rGPBDAT|=0x560;//4个LED全灭  
Touch_Screen_Init();
while(1);
}

相关帖子

沙发
zou_sky| | 2011-10-8 19:09 | 只看该作者
:)  good!!!!!!!!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

67

帖子

1

粉丝