触摸屏设置

1.SRCPND,INTPND 寄存器的意义:

一直不明白为什么中断服务程序最后要把SRCPND,INTPND相应位置1,还把这个过程称为CleaningPend,既然叫清除为什么不是清零呢?查了手册:当有中断源请求中断服务时,SRCPND相应位置1,裁决(判断是否响应中断)时INTPND自动置1。如果中断屏蔽,SRCPND1,但INTPND不变。当INTPND1时,响应中断服务程序。中断服务程序通过向相应位写1来清除未决断条件(pending)。

我理解是SRCPND只要有中断源请求中断就置1,可以响应中断时(未屏蔽),INTPND相应位置1,否则为0。为了使其他的中断服务程序可以执行,在中断服务程序中SRCPNDINTPND相应位应清零,否则会认为一直有中断源请求中断。而*PND寄存器的清零就是向相应位写入1(通过调试发现)。我一直理解错误,以为写入1就是把相应位置1,其实刚好相反。

2.编译问题:

头文件里定义了define BIT_ADC  (0x1<<31)

结果编译报错:

Warning :signed constant overflow “<<”

上网查了才明白原来ADS1.21当成有符号数,加上强制转换就好了。

define BIT_ADC  ((U32)0x1<<31)

 

分析中断程序:

/*中断服务程序*/

void __irq Touch_ScrISR(void)

{

      

       rINTMSK|=BIT_ADC;                       //屏蔽ADC 中断

}

      

      

       rADCTSC=(1<<3|1<<2); 

        //XP pull up disable,seq X Y position 产生中断后waiting for interrupt mode应被清除

        //这里1<<2设为自动测量模式。

       rADCDLY=40000; 

       rADCCON|=0x01;            //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);

       ydata=(rADCDAT1&0X3ff);

      

       rSUBSRCPND|=(BIT_SUB_TC); //clear pending

       rSRCPND =(BIT_ADC);                   

       rINTPND =(BIT_ADC);

      

       rINTSUBMSK=~(BIT_SUB_TC);

       rINTMSK=~(BIT_ADC);

      

       rADCTSC=(0<<8|1<<7|1<<6|0<<5|1<<4|0<<3|0<<2|3);//waiting for interrupt

      

       rADCTSC=rADCTSC|(1<<8);                           //detect stylus up 触摸屏抬起

      

while(1)         //to check Pen-up state

       {

              if(rSUBSRCPND & (BIT_SUB_TC))   //check if ADC is finished with interrupt bit

              {

                     //Uart_Printf("Stylus Up Interrupt~!/n");

                     break;     //if Stylus is up(1) state

              }

       }    

 

       Uart_Printf(" count=%03d, XP=%04d, YP=%04d/n",count++, xdata, ydata);    //X-position Conversion data 

      

       rADCDLY=40000; 

       //rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.

      

       rSUBSRCPND|=BIT_SUB_TC;

       //rINTMSK=~(BIT_SUB_TC);

       rINTSUBMSK=~(BIT_SUB_TC);

       rSRCPND =(BIT_ADC);                    //clear pending

       rINTPND =(BIT_ADC);

      

}

其中要是不加如下:

while(1)         //to check Pen-up state

       {

              if(rSUBSRCPND & (BIT_SUB_TC))   //check if ADC is finished with interrupt bit

              {

                     //Uart_Printf ("Stylus Up Interrupt~!/n");

                     break;                            //if Stylus is up(1) state

              }

       }    

触摸屏会出现抖动,按下后会出现十几个值,加上上面语句程序会停在while中,只有产生INT_TC (触摸屏源中断)中断才执行break 跳出执行其后的Uart_Printf(" count=%03d, XP=%04d, YP=%04d/n",count++, xdata, ydata);

最后还有一个现象我不明白,注意红色语句,如果屏蔽掉,则触摸屏左半边点两下才有反应,右半边正常。加上则触摸屏正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值