主题 : 关于触摸屏一边不正常的提问 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 30450
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2010-10-16
最后登录: 2010-11-27
楼主  发表于: 2010-10-19 21:46

 关于触摸屏一边不正常的提问

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!!!
描述:源代码
附件: Touch_Panel_test_1.rar (495 K) 下载次数:36
学习ing
级别: 新手上路
UID: 30450
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2010-10-16
最后登录: 2010-11-27
1楼  发表于: 2010-10-20 19:54
没有谁能回答吗?还是没人遇到过类似情况呢?自己先顶一下!!!
学习ing
Stay hungry,stay foolish !
级别: 侠客
UID: 22221
精华: 1
发帖: 54
金钱: 290 两
威望: 64 点
综合积分: 128 分
注册时间: 2010-05-28
最后登录: 2013-01-04
2楼  发表于: 2010-10-21 09:21
我之前也遇到和你类似的问题,不过我的现象是:屏幕上半部分有我们想要的连续画点的效果,下半部分就只有单个点的响应。一直没找到原因...
级别: 新手上路
UID: 30450
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2010-10-16
最后登录: 2010-11-27
3楼  发表于: 2010-10-22 23:54

 回 2楼(wi100sh) 的帖子

咱们的就是一个问题啦,你试着把X,Y的位置反一下,就变成了我这种情况了,我也还没有解决呢。找到了问题原因的放麻烦分享一下!
学习ing
级别: 新手上路
UID: 38926
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
综合积分: 10 分
注册时间: 2011-03-03
最后登录: 2014-07-18
4楼  发表于: 2011-03-03 09:39

 回 楼主(feiyingdan) 的帖子

请问楼主这个问题是怎么解决的,我现在也是这个问题,谢谢
级别: 新手上路
UID: 61654
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2012-01-04
最后登录: 2012-01-05
5楼  发表于: 2012-01-05 17:30
这样可以
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");

  
}

}