OpenEdv-开源电子网

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

触摸屏的问题

[复制链接]

81

主题

185

帖子

0

精华

高级会员

Rank: 4

积分
534
金钱
534
注册时间
2013-7-4
在线时间
13 小时
发表于 2013-7-9 13:09:32 | 显示全部楼层 |阅读模式
这几天要把ucos+uCGUI移植,可是移植触摸板的时候出现问题,按不按下去都返回一些莫名其妙的数值完全没有规律,希望大大能帮帮忙
#include "Touch_s.h"

u16 lx,ly;
u16 TP_X,TP_Y;   
u16 TX[5];
u16 TY[5];
u8  Touch_flag,lvbo=0;//触摸软件滤波
u16 T_X,T_Y;

/****************************说明************************/
//经测试,触摸屏四角坐标值(x,y)分别是:
//左上:(130,115 ) 右上:(1880,115 )
//左下:(130,1850) 右下:(1880,1850)
//山寨图标最底边Y=1990
void delays(u16 d)
{
 while(d--);
}
void Touch_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5  |GPIO_Pin_7  ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;   // 推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   // 最高输出速率50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;      
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}

//**********************************************************
void WriteCharTo7843(u8 num)          //SPI写数据
{
u8 count=0;
DCLK_0;
for(count=0;count<8;count++)
{
if((num&0x80)==0x00)
DIN_0;
else
DIN_1;
num<<=1;                //上升沿有效
DCLK_1;                 //上升沿有效
delays(10);
DCLK_0; 
}
}
//**********************************************************
u16 ReadFromCharFrom7843(void)             //SPI 读数据
{
u8 count=0;
u16 Num=0;
for(;count<12;count++)
{
Num<<=1; 
DCLK_1;
delays(10);
DCLK_0;
if(DOUT!=0) 
Num++;

}

return(Num);
}
void AD7843(void)             
{
TCS_0;
//delays(3);                     //中断后延时以消除抖动,使得采样数据更准确
//while(BUSY);                //如果BUSY信号不好使可以删除不用
delays(5);
WriteCharTo7843(0x90);        //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
//while(BUSY);               //如果BUSY信号不好使可以删除不用delays(3);
DCLK_1; 
delays(10);
DCLK_0; 
TP_Y=ReadFromCharFrom7843();
WriteCharTo7843(0xD0);       //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
DCLK_1;
delays(10);
DCLK_0;
TP_X=ReadFromCharFrom7843();
TCS_1;
}
void get_place(void)
{
  if(TP_Y<360) ly=0;
else if(TP_Y>3700) ly=320;
else ly=(u16)((TP_Y-360)/10.4);
if(TP_X>3800) lx=0;
else if(TP_X<240) lx=480;
else lx=(u16)((TP_X-240)/7.4);
lx = 480 - lx;
}
int Get_TouchX(void)
{
  u16 min,temp; //使用选择法排序
u8 h,k;
AD7843();
  get_place();  
TX[lvbo]=lx;
lvbo++;
 if(lvbo==5)
  {
   lvbo=0;
 Touch_flag=1;
   for(h=0;h!=5;h++)
{
 min=h;
 for(k=h+1;k!=5;k++)
 {if(TX[min]>TX[k]) min=k;}
   temp=TX[h];
   TX[h]=TX[min];
   TX[min]=temp;
   }
   T_X=(TX[1]+TX[2]+TX[3])/3;
  }
return T_X;
}
int Get_TouchY(void)
{
  u16 min,temp; //使用选择法排序
u8 h,k;
AD7843();
  get_place();  
TY[lvbo]=ly;
lvbo++;
 if(lvbo==5)
  {
   lvbo=0;
 Touch_flag=1;
   for(h=0;h!=5;h++)
{
 min=h;
 for(k=h+1;k!=5;k++)
{if(TY[min]>TY[k]) min=k;}
   temp=TY[h];
   TY[h]=TY[min];
   TY[min]=temp;
}
   T_Y=(TY[1]+TY[2]+TY[3])/3;
  }
return T_Y;
}



#ifndef __Touch_s_H
#define __Touch_s_H
#include "stm32f10x.h"

#define T_DATA     GPIOA
#define DCLK_0   T_DATA->BRR  = GPIO_Pin_5
#define DCLK_1   T_DATA->BSRR = GPIO_Pin_5
#define TCS_0      GPIOG->BRR  = GPIO_Pin_9
#define TCS_1      GPIOG->BSRR = GPIO_Pin_9
#define DIN_0     T_DATA->BRR  = GPIO_Pin_7
#define DIN_1     T_DATA->BSRR = GPIO_Pin_7

#define DOUT    (T_DATA->IDR  & GPIO_Pin_6)
extern u16 T_X,T_Y;
// #define Touch_IRQ (T_DATA->IDR & GPIO_Pin_4)

void Touch_GPIO_Init(void);
void delays(u16 d);
void WriteCharTo7843(u8 num);
u16  ReadFromCharFrom7843(void);
void AD7843(void) ;
void get_place(void);
int Get_TouchX(void);
int Get_TouchY(void);
#endif












正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

185

帖子

0

精华

高级会员

Rank: 4

积分
534
金钱
534
注册时间
2013-7-4
在线时间
13 小时
 楼主| 发表于 2013-7-9 15:18:18 | 显示全部楼层
最新的进展是,能读出点的值不过是随机值,但是使用断点检测的时候却没有问题(不知道为什么y的默认值变成了FFE),然后一取消断点就又随机乱跳了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-9 16:52:42 | 显示全部楼层
你的delays(10);
这个函数如何实现的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

81

主题

185

帖子

0

精华

高级会员

Rank: 4

积分
534
金钱
534
注册时间
2013-7-4
在线时间
13 小时
 楼主| 发表于 2013-7-14 17:02:50 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
额...找到原因了,因为老板给错板子了...SPI1是复用的,所以才变这样
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 11:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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