feiyingdan 发表于 2010-10-19 22:13:51

玩过触摸屏的同志请进来

void __irq ADCTs(void)
{

rADCTSC = (1<<3)|(1<<2); //上拉电阻无效,自动连续XY坐标转换模式开启
rADCCON|=0x1; //开始A/D转换
while(rADCCON & 0x1); //检查A/D转换是否开始
while(!(rADCCON & 0x8000)); //等待A/D转换的结束
while(!(rSRCPND & ((unsigned int)0x1<<31))); //判断A/D中断的悬挂位
xdata=(rADCDAT0&0x3ff); //读取X轴坐标
ydata=(rADCDAT1&0x3ff); //读取Y轴坐标
flagTS = 1; //置标志

rADCDLY = 100000; //延时
rSUBSRCPND|=0x1<<9; //清中断挂起
rSRCPND = 0x1<<31; //
rINTPND = 0x1<<31; //
rINTSUBMSK=~(0x1<<9); //清A/D中断标志,开启A/D中断
rINTMSK=~(0x1<<31);


rADCTSC =0xd3; //再次设置等待中断模式


if(num<3) //仅取三点做较正需做提笔检验
{
rADCTSC=rADCTSC|(1<<8); //设置触笔抬起中断

while(1) //等待触笔的抬起
{
if(rSUBSRCPND & (0x1<<9)) //检查A/D触摸屏中断悬挂
{
break; //如果触笔抬起,则跳出该循环
}
}

rADCDLY=5000;
rSUBSRCPND|=0x1<<9; //写1清除标志
rINTSUBMSK=~(0x1<<9); //清0中断使能,ADC的子中断
rSRCPND = 0x1<<31; //写1清除标志
rINTPND = 0x1<<31; //再次清A/D中断
rADCTSC =0xd3; //设置等待光标按下中断模式,为下一次触笔的落下做准备
//01101 0011--// XP_PU, XP_Dis, XM_Dis, YP_Dis, YM_En.
num++;
}
else
num=3;

}


以上是A/D中断代码,驱动过程为,先在主程序中设置为等待中断模式,先进行触摸屏较准,即在屏上取三个点进行较准算法(取以上三点时须用笔抬起中断。而后边的测试目的为做一个写字板,但遇到一个怪问题是右边的屏正常而左边屏不能显示出连续笔划只能出现一个个的点,好像又是在检查笔抬起中断,但不应该再有这种现像才对啊?难道触摸屏左右两边会不同吗?(屏为MICRO2440所配之统宝3.5寸屏).具体代码见附件,有兴趣的朋友帮忙看看,诚求解答或做过类似驱动的源代码,TKS!!!

鬼鬼一哈 发表于 2010-10-20 16:52:17

在看这部分,MARK下!

feiyingdan 发表于 2010-10-20 20:04:09

没人来帮忙解答吗???

史丹佛 发表于 2012-1-3 20:13:08

请问你这个问题解决了吗?我也遇到这个问题了,能告诉我怎么解决的么?你的程序附件不能下,能不能发一份到我的邮箱,John_zhangsc@yahoo.cn,谢谢啦!

史丹佛 发表于 2012-1-3 21:09:47

rINTPND = 0x1<<31,这就话注释掉,就能,但出现了新的问题。

史丹佛 发表于 2012-1-4 13:58:03

史丹佛 发表于 2012-1-3 21:09 static/image/common/back.gif
rINTPND = 0x1

void __irq AdcTsAuto(void)
{
   U32 saveAdcdly;
   if(! (rADCDAT0&0x8000) )
   {

    rADCUPDN=0x0;
    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=(1000-(rADCDAT1&0x3ff))*0.48;//xdata=(1000-(rADCDAT1&0x3ff))*0.48-240;
        ydata=(((rADCDAT0&0x3ff))*0.272);//ydata=0-(((rADCDAT0&0x3ff))*0.272-135);
       rSUBSRCPND|=BIT_SUB_TC;
                rINTSUBMSK=~(BIT_SUB_TC);
        rINTMSK=~(BIT_ADC);
        rADCTSC =0xd3;
      Uart_Printf("Touch Screen Test is Finished!!!\n");
    PutPixel(xdata,ydata,(0x1f<<11) | (0x00<<5) | (0x00));

   }
   if ( rADCDAT0&0x8000 )   //现在是up
{
    rADCUPDN=0;
rADCCON=(1<<14)+(9<<6);       //设置A/D预分频
    rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);
rADCTSC =0xd3;
Uart_Printf("\nzhangshuaicheng\n");


}

}

史丹佛 发表于 2012-1-4 13:58:50

这样就好了。(如上程序)
页: [1]
查看完整版本: 玩过触摸屏的同志请进来