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);
} |