OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6608|回复: 14

stm32触摸屏问题

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
发表于 2012-3-22 11:03:22 | 显示全部楼层 |阅读模式
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);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-22 11:19:21 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-22 11:21:37 | 显示全部楼层
我没有你们的代码我都不知道我的代码是哪里来的,最初代码是用spi  但是我硬件不能用spi 然后再那个基础上自己改了个io模拟的
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-22 11:22:13 | 显示全部楼层
一般这种问题都出在什么地方呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-22 11:28:02 | 显示全部楼层
回复【4楼】ff8zgs:
---------------------------------
先能不能读触摸屏控制IC的数据吧.这个要能读了,才开始下一步.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-22 12:26:16 | 显示全部楼层
刚试了,无论点屏幕哪里,串口打印出来都是x=22 y=17
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-22 12:35:24 | 显示全部楼层
回复【6楼】ff8zgs:
---------------------------------
说明你代码有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-22 15:12:04 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我检查了一下程序是有一个地方不对,现在改过来只是现在,读ads7843给的都是255了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-22 15:58:21 | 显示全部楼层
那还是有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-22 17:22:34 | 显示全部楼层
 下午用示波器看了下波形,只有在输出口配置成通用推挽才有波形,但是波形却是尖波,这是为什么呢回复【9楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-22 18:05:36 | 显示全部楼层
输出当然要配置成推挽输出了.你说的尖波是什么意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-23 08:15:48 | 显示全部楼层
 就是高电平立马变低电平,高电平没有维持的时间,但是我所有的电平变换都给了延时的,这是为什么呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-23 09:19:41 | 显示全部楼层
回复【12楼】ff8zgs:
---------------------------------
你的延时有问题吧.用jtag仿真下看看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-22
在线时间
4 小时
 楼主| 发表于 2012-3-23 09:30:18 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
延时应该没问题我将一部分在touch.c文件中的语句直接移到main函数中 波形就正常了。延时也是用的相同的延时。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-7-3 17:23:30 | 显示全部楼层
请问原子哥,为什么我用mini板的,下载你的代码进去,按键校准不了,一直停在RST的这个界面,校准没用????
思维创造财富,知识独立人格,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 13:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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