我软件模拟的SPI对7843进行操作,12位的AD转换,我测试发现读回的AD转换值x坐标最大300多,y坐标最大2000多,而且位置不准,是不是我模拟时序的问题啊?下面是程序,请教大家了,谢谢。
//触摸控制接口
#define DCLK_H P3OUT|=(1<<0)
#define DCLK_L P3OUT&=~(1<<0)
#define CS_H P3OUT|=(1<<1)
#define CS_L P3OUT&=~(1<<1)
#define DIN_L P3OUT|=(1<<2)
#define DIN_H P3OUT&=~(1<<2)
#define BUSY_OK P3IN&0x08 //为0表示不繁忙可读数据
#define DOUT P3IN&0x10 //触摸屏的数据输出
#define Penirq P3IN&0x20 //触碰触摸屏时,ADS7843Penirq引脚由未触摸时的高电平变为低电平
struct struct1 coordinate; //定义一个结构变量,用于存放触摸点采样结果
unsigned int lx,ly; //根据采集到的参数转换为TFT上的实际坐标值
void Init_2046()
{
CS_H;
DCLK_L;
DIN_L;
}
//写8位命令到触摸控制IC,模拟SPI
void Write_2046(unsigned char temp)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
if(temp&0x80)
DIN_H;
else
DIN_L;
DCLK_H;
delay_us(4);
DCLK_L;
delay_us(4);
temp<<=1;
}
}
//从触摸IC读回12位数据
unsigned int Read_2046()
{
unsigned char i=0;
unsigned int temp=0;
P3DIR&=~(1<<4); //数据口设为输入
for(i=0;i<12;i++)
{
DCLK_H;
delay_us(4);
if(DOUT)
temp++;
temp<<=1;
DCLK_L;
delay_us(4);
}
P3DIR|=(1<<4);
return temp;
}
//读取x y坐标 返回读取到的触摸点的电压值
struct struct1 AD_2046()
{
struct struct1 pix;
CS_L;
Write_2046(0x90); //送控制字
DCLK_H;
delay_us(4);
DCLK_L;
delay_us(4);
pix.y=Read_2046();
Write_2046(0xd0); //读x坐标
DCLK_H;
delay_us(4);
DCLK_L;
delay_us(4);
pix.x=Read_2046();
CS_H;
return pix;
} |