打印

stm32触摸屏问题

[复制链接]
2480|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ff8zgs|  楼主 | 2012-3-22 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32触摸屏我不管点哪里都是在屏幕固定的地方
一下是我触摸屏的源码,用的是io模拟,中断服务中用绿色显示出我触摸点
求大家帮我看看问题再哪里

static void WR_CMD (unsigned char cmd)
{
    unsigned char buf;
    unsigned char i;
   
    ADS7843_CS_LOW();
    SPI2_MOSI_WR(0);   
    SPI2_SCK_LOW();
    ADS7843_CS_LOW();
    for(i=0;i<8;i++)
    {
        SPI2_SCK_LOW();
        SpiDelay(50);
        buf=(cmd>>(7-i))&0x1;
        SPI2_MOSI_WR(buf);
        SpiDelay(50);
        SPI2_SCK_HIGH();
        SpiDelay(50);
        SPI2_SCK_LOW();
        SpiDelay(50);
    }
}
/****************************************************************************
* 名    称:static void Read (void)
* 功    能:读ads7843
* 入口参数:无
* 出口参数:buf
* 说    明:buf是16位其中12位是ads测量值
* 调用方法:i=Read();
****************************************************************************/
static unsigned short Read(void)
{
    unsigned short buf=0,temp;
    unsigned char i;


    for(i=0;i<12;i++)
    {
        
        SPI2_SCK_HIGH();      
        SpiDelay(50);
        SPI2_SCK_LOW();
        SpiDelay(50);  
        temp= (SPI2_MISO_READ()) ? 1:0;
        buf|=(temp<<(11-i));
        SpiDelay(50);
        
    }
    ADS7843_CS_HIGH();
    buf&=0x0fff;
    return(buf);
}
/****************************************************************************
* 名    称:u16 TPReadX(void)
* 功    能:获取x方向的坐标
* 入口参数:无
* 出口参数:x
* 说    明:一次完整的ads操作,先写测量x指令,再获取x坐标 此处X坐标不是真实坐标只是一个12进制的数
* 调用方法:i=TPReadX();
****************************************************************************/


u16 TPReadX(void)
{
  u16 x=0;
  ADS7843_CS_LOW();
  SpiDelay(50);
  //while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
  //SPI_I2S_SendData(SPI2,CHX);
  //while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
  WR_CMD(CHX);
  SpiDelay(50);
  x = Read();
// x<<=8;
  //x = Read();
  SpiDelay(50);
  ADS7843_CS_HIGH();
  x = x>>3;
  return (x);
}
/****************************************************************************
* 名    称:u16 TPReadY(void)
* 功    能:获取x方向的坐标
* 入口参数:无
* 出口参数:x
* 说    明:一次完整的ads操作,先写测量Y指令,再获取Y坐标 此处Y坐标不是真实坐标只是一个12进制的数
* 调用方法:i=TPReadY();
****************************************************************************/
u16 TPReadY(void)
{
  u16 y=0;
  ADS7843_CS_LOW();
  WR_CMD(CHY);
  SpiDelay(50);
  y = Read();
  SpiDelay(50);
  ADS7843_CS_HIGH();
  y = y>>3;
  return (y);
}

/****************************************************************************
* 名    称:int  GUI_TOUCH_X_MeasureX(void)
* 功    能:获取x方向的坐标
* 入口参数:无
* 出口参数:x
* 说    明:连续测量10次抛去最大最小,取中间3次平均值,再计算到屏幕上的坐标值
* 调用方法:i=GUI_TOUCH_X_MeasureX();
****************************************************************************/
int  GUI_TOUCH_X_MeasureX(void)
{
    unsigned char t=0,t1,count=0;
    unsigned short int databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
    unsigned short temp=0,X=0;   
      float FX;
    while(/*GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0&&*/count<10)//循环读数10次
    {     
          ADS7843_SPI_Start();  
        databuffer[count]=TPReadX();
        count++;
    }  
    if(count==10)//一定要读到10次数据,否则丢弃
    {  
        do//将数据X升序排列
        {   
            t1=0;         
            for(t=0;t<count-1;t++)
            {
                if(databuffer[t]>databuffer[t+1])//升序排列
                {
                    temp=databuffer[t+1];
                    databuffer[t+1]=databuffer[t];
                    databuffer[t]=temp;
                    t1=1;
                }  
            }
        }while(t1);                                 
        //X=(databuffer[3]+databuffer[4]+databuffer[5])/3;
            FX=((databuffer[3]+databuffer[4]+databuffer[5])/3-256)*320/3584;
    }
    X=(u8) FX;
    return(X);  
}

/****************************************************************************
* 名    称:int  GUI_TOUCH_X_MeasureY(void)
* 功    能:获取Y方向的坐标
* 入口参数:无
* 出口参数:Y
* 说    明:连续测量10次抛去最大最小,取中间3次平均值,再计算到屏幕上的坐标值
* 调用方法:i=GUI_TOUCH_X_MeasureY();
****************************************************************************/
int  GUI_TOUCH_X_MeasureY(void)
{
      u32 t=0,t1,count=0;
    u8 databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
    u8 temp=0,Y=0;   
     float FY;
    while(/*GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0&&*/count<10)    //循环读数10次
    {   
        ADS7843_SPI_Start();         
        databuffer[count]=TPReadY();
        count++;  
    }  
    if(count==10)//一定要读到10次数据,否则丢弃
    {  
        do//将数据X升序排列
        {   
            t1=0;         
            for(t=0;t<count-1;t++)
            {
                if(databuffer[t]>databuffer[t+1])//升序排列
                {
                    temp=databuffer[t+1];
                    databuffer[t+1]=databuffer[t];
                    databuffer[t]=temp;
                    t1=1;
                }  
            }
        }while(t1);                                 
        //Y=(databuffer[3]+databuffer[4]+databuffer[5])/3;   
            FY=((databuffer[3]+databuffer[4]+databuffer[5])/3-256)*240/3584;
    }
    Y=(u8) FY;
    return(Y);
}
沙发
ff8zgs|  楼主 | 2012-3-22 13:49 | 只看该作者
都快沉了 还没人知道吗

使用特权

评论回复
板凳
lai832| | 2012-3-22 17:14 | 只看该作者
将你读到的结果,和写的结果,显示出来(值),分开查..

使用特权

评论回复
地板
ff8zgs|  楼主 | 2012-3-22 17:26 | 只看该作者
3# lai832
读出来是一直是255
下午我用示波器看了波形,只有gpio 配置成 通用推挽才有波形,但是却是尖波,不明白哪里哪里不对,我高低电平变换都给了延时的怎么会是尖波呢

使用特权

评论回复
5
lai832| | 2012-3-23 08:44 | 只看该作者
读出来一值是255?那就只有查这个方向了.(我没玩过这个,给不了实质建议你)
点不同的地方,芯片脚的信号是否不一样,不一样,再查程序----------分开芯片外(硬),内(软)查

使用特权

评论回复
6
na239152605| | 2012-4-1 13:56 | 只看该作者
学习了

使用特权

评论回复
7
676861459| | 2012-4-7 16:26 | 只看该作者
有一个问题
u16 TPReadY(void)
{
  u16 y=0;
  ADS7843_CS_LOW();
  WR_CMD(CHY);
  SpiDelay(50);
  y = Read();
  SpiDelay(50);
  ADS7843_CS_HIGH();
  y = y>>3;
  return (y);
}
为什么要右移3位??

使用特权

评论回复
8
sfpxfpcfp| | 2012-4-7 16:30 | 只看该作者
坐等砖家

使用特权

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

本版积分规则

18

主题

199

帖子

1

粉丝