野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14663|回复: 6

关于触摸屏AD采集数据的问题

[复制链接]
发表于 2015-10-15 23:37:07 | 显示全部楼层 |阅读模式
我用的是野火mini的板子,液晶是3.2寸的。下面的我是移植野火的驱动程序,我自己也写了一套,发现有问题,但是调用野火的驱动程序也发现了同样的问题。
static void XPT2046_WriteCMD(unsigned char cmd)//D′Ãüáî chx=0xd0 chy=0x90
{
    unsigned char buf;
    unsigned char i;
//     TP_CS(1);
    TP_DIN(0);
    TP_DCLK(0);
//     TP_CS(0);
    for(i=0;i<8;i++)
    {
        buf=(cmd>>(7-i))&0x1;
        TP_DIN(buf);
        //Delayus(5);
      DelayUS(5);
        TP_DCLK(1);
        //Delayus(5);
      DelayUS(5);
        TP_DCLK(0);
    }
}
static unsigned short XPT2046_ReadCMD(void)  //&#182;á&#195;üá&#238;
{
    unsigned short buf=0,temp;
    unsigned char i;
    TP_DIN(0);
    TP_DCLK(1);
    for(i=0;i<12;i++)
    {
        TP_DCLK(0);         
        temp= (TP_DOUT) ? 1:0;
        buf|=(temp<<(11-i));
        TP_DCLK(1);
    }
    buf&=0x0fff;

    return(buf);
}
uint16_t XPT2046_ReadAdc(uint8_t _ucCh)  //&#209;&#161;&#212;&#241;ò&#187;&#184;&#246;í¨μà£&#172;·μ&#187;&#216;adcμ&#196;&#214;μ
{
回复

使用道具 举报

 楼主| 发表于 2015-10-15 23:37:47 | 显示全部楼层

uint16_t XPT2046_ReadAdc(uint8_t _ucCh)  //&#209;&#161;&#212;&#241;ò&#187;&#184;&#246;í¨μà£&#172;·μ&#187;&#216;adcμ&#196;&#214;μ
{
          //uint16_t usAdc;

    XPT2046_WriteCMD(_ucCh);

        return         XPT2046_ReadCMD();
}
void Touch_GetAdXY(int *x,int *y)   //&#182;áè&#161;ADμ&#196;&#214;μ£&#172;12bit ×&#238;′ó&#206;a4096
{
    int adx,ady;
    //adx=Read_X();
    adx = XPT2046_ReadAdc(0xd0);
  
    DelayUS(1);
    //ady=Read_Y();
    ady = XPT2046_ReadAdc(0x90);
///  if(INT_IN_2046==SET)
                       
    *x=adx;
    *y=ady;
}
/******************************************************
* oˉêy&#195;&#251;£oRead_2046
* &#195;èê&#246;  £oμ&#195;μ&#189;&#194;&#203;2¨&#214;&#174;oóμ&#196;X Y
* ê&#228;è&#235;  : &#206;T
* ê&#228;3&#246;  £oCoordinate&#189;á11ì&#229;μ&#216;&#214;·
* &#190;ùày  £o&#206;T
* ×¢òa  £o&#203;ù&#182;è&#207;à&#182;&#212;±è&#189;&#207;&#194;y
*********************************************************/   
typedef        struct POINT
{
   uint16_t x;               
   uint16_t y;
}Coordinate;
/* 2&#238;&#214;μ&#195;&#197;&#207;T */
#define THRESHOLD 2
u8 Read_2046(void)
{
   // static Coordinate  screen;
    int m0,m1,m2,TP_X[1],TP_Y[1],temp[3];
    uint8_t count=0;
               
                /* ×&#248;±êXoíY&#189;&#248;DD9′&#206;2é&#209;ù*/
    int buffer[2][9]={{0},{0}};         
    do
    {                  
        Touch_GetAdXY(TP_X,TP_Y);  
        buffer[0][count]=TP_X[0];  
        buffer[1][count]=TP_Y[0];
        count++;
                                 
    }        /*ó&#195;&#187;§μ&#227;&#187;÷′¥&#195;t&#198;áê±&#188;′TP_INT_IND&#197;o&#197;&#206;aμí 2¢&#199;ò count<9*/
    while(!INT_IN_2046&& count<9);  
   
               
                /*è&#231;1&#251;′¥±êμˉ&#198;e*/
                if(INT_IN_2046 ==1)
    {
        /*&#214;D&#182;&#207;±ê&#214;&#190;&#184;′&#206;&#187;*/
                                touch_flag =0;                                               
    }

                /* è&#231;1&#251;3é1|2é&#209;ù9′&#206;,&#189;&#248;DD&#194;&#203;2¨ */
    if(count==9)                                                                  
    {  
        /* &#206;a&#188;&#245;éù&#212;&#203;&#203;&#227;á&#191;,·&#214;±e·&#214;3×éè&#161;&#198;&#189;&#190;ù&#214;μ */
        temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;
        temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;
        temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3;
        
        /* &#188;&#198;&#203;&#227;3×éêy&#190;Yμ&#196;2&#238;&#214;μ */
        m0=temp[0]-temp[1];
        m1=temp[1]-temp[2];
        m2=temp[2]-temp[0];
        
        /* &#182;&#212;é&#207;ê&#246;2&#238;&#214;μè&#161;&#190;&#248;&#182;&#212;&#214;μ */
        m0=m0>0?m0-m0);
        m1=m1>0?m1-m1);
        m2=m2>0?m2-m2);
        
        /* &#197;D&#182;&#207;&#190;&#248;&#182;&#212;2&#238;&#214;μê&#199;·&#241;&#182;&#188;3&#172;1y2&#238;&#214;μ&#195;&#197;&#207;T£&#172;è&#231;1&#251;&#213;a3&#184;&#246;&#190;&#248;&#182;&#212;2&#238;&#214;μ&#182;&#188;3&#172;1y&#195;&#197;&#207;T&#214;μ£&#172;&#212;ò&#197;D&#182;¨&#213;a′&#206;2é&#209;ùμ&#227;&#206;aò°μ&#227;,&#197;×&#198;ú2é&#209;ùμ&#227;£&#172;2&#238;&#214;μ&#195;&#197;&#207;Tè&#161;&#206;a2 */
        if( m0>THRESHOLD  &&  m1>THRESHOLD  &&  m2>THRESHOLD )
            return 0;
        
        /* &#188;&#198;&#203;&#227;&#203;ü&#195;&#199;μ&#196;&#198;&#189;&#190;ù&#214;μ£&#172;í&#172;ê±&#184;3&#214;μ&#184;&#248;screen */
        if(m0<m1)
        {
            if(m2<m0)
               curr.adx=(temp[0]+temp[2])/2;
            else
                curr.ady=(temp[0]+temp[1])/2;       
        }
        else if(m2<m1)
            curr.adx=(temp[0]+temp[2])/2;
        else
            curr.adx=(temp[1]+temp[2])/2;
        
        /* í&#172;é&#207; &#188;&#198;&#203;&#227;Yμ&#196;&#198;&#189;&#190;ù&#214;μ */
        temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;
        temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;
        temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3;
        m0=temp[0]-temp[1];
        m1=temp[1]-temp[2];
        m2=temp[2]-temp[0];
        m0=m0>0?m0-m0);
        m1=m1>0?m1-m1);
        m2=m2>0?m2-m2);
        if(m0>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD)
            return 0;
        
        if(m0<m1)
        {
            if(m2<m0)
                curr.ady=(temp[0]+temp[2])/2;
            else
                curr.ady=(temp[0]+temp[1])/2;       
        }
        else if(m2<m1)
            curr.ady=(temp[0]+temp[2])/2;
        else
            curr.ady=(temp[1]+temp[2])/2;
        
        return  1;
    }
   
    else if(count>1)
    {
        curr.adx=buffer[0][0];
        curr.ady=buffer[1][0];
        return 1 ;
    }  
    return 0;
}


Touch_GetAdXY(int *x,int *y) 我在主函数调用这个函数的时候,出现这样的情况,不过我要的效果是不触摸的时候数据是(0,0,),触摸的时候数据可以改变到0-4096,x数据是准的,y数据都超过了4096.手放开的时候数据可以返回到(0,0)点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 23:39:08 | 显示全部楼层
IMG_20151015_232032.jpg
IMG_20151015_232032.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 23:42:20 | 显示全部楼层
然后调用了Read_2046(void)这个函数,带滤波的,然后数据是不发生抖动了,还是看图片吧! IMG_20151015_232156.jpg IMG_20151015_232207.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 23:43:57 | 显示全部楼层
我想要的就是可以触摸下数据可以从0-4096之间改变,放开时候数据可以恢复到(0,0),求大神指导啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 23:44:28 | 显示全部楼层
我的主函数:
int main()
{
          u8 st;
    LCD_Init();
          Lcd_GramScan(1);
          LCD_Clear(0,0,240,320,BLUE);
          USART1_Config();
   // SPI_FLASH_Init();
    touch_init();
       
         while(1)
         {
                        if(touch_flag==1)
                                 {
                                               
                                                st= Read_2046();;
                                          if(st==1)
                                                 {
                                                         //read_continousx();                                                 
                                                         show_touch(10,30);
                                                         show_touch1(10,10);
                                                        //        touch_flag=0;                                                         
                                                 }                                 
                                 }
   }

}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-16 15:52:45 | 显示全部楼层
没人吗?。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 21:54 , Processed in 0.033578 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表