这几天要把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
|