关于ADS7843的驱动
前几天用AVR驱动了一块带触摸TFT屏,这天想用msp430f149驱动,但是一样的程序,能在TFT上显示但是触摸不行了,按下去的时候ADS7843的PEN引脚根本没有变低,但是触摸屏幕,返回的x y值还会变化,下面是程序:#include "ADS7843.h" //包含位操作的头文件
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//触摸控制接口
#defineDCLK_H P6OUT|=(1<<0)
#defineDCLK_L P6OUT&=~(1<<0)
#defineCS_H P6OUT|=(1<<1)
#defineCS_L P6OUT&=~(1<<1)
#defineDIN_L P6OUT|=(1<<2)
#defineDIN_H P6OUT&=~(1<<2)
#defineBUSY_OK P6IN&0x08 //为0表示不繁忙可读数据
#defineDOUT P6IN&0x10 //触摸屏的数据输出
#definePenirq P6IN&0x20 //触碰触摸屏时,ADS7843Penirq引脚由未触摸时的高电平变为低电平
struct struct1 coordinate;//定义一个名为Tp_pix的结构变量,用于存放触摸点采样结果
unsigned intlx,ly; //根据采集到的参数转换为TFT上的实际坐标值
//Xmin、max和Ymin、Ymax分别是触摸屏横纵坐标的最小/最大值,如果偏差大时,用户可重新标定
#define Xmin 0x0133
#define Xmax 0x0EDA
#define Ymin 0x00D0
#define Ymax 0x0E2F
//================================================================================================
//实现功能: ADS7843启动
//================================================================================================
void start_7843()
{
CS_H;
DIN_L;
DCLK_L;
}
//================================================================================================
// 实现功能:写8位命令到触摸控制IC
// 输入参数:temp 需要写入的8位控制命令
//================================================================================================
void Write_7843(unsigned char temp) //SPI写8位命令到触摸控制IC
{
unsigned char i=0;
DCLK_L;
delay_us(2);
for(i=0;i<8;i++) //循环8次写入一字节
{
if(temp&0x80)
DIN_H;
else
DIN_L; //判断最高位是否为1,为1则向数据位写1
DCLK_H;
delay_us(2);
DCLK_L;
delay_us(2);
temp<<=1;
}
}
//================================================================================================
// 实现功能:从触摸控制IC读8位数据到控制器
// 返回参数:temp 需要写入的8位控制命令
//================================================================================================
unsigned int Read_7843() //SPI 读数据
{
unsigned char i=0;
unsigned int temp=0;
P6DIR&=~(1<<4); //设置数据位为输入
DCLK_H;
delay_us(2);
for(i=0;i<12;i++) //循环12次读取12位结果
{
temp<<=1; //temp左移一位,准备读取下一位
DCLK_L;
delay_us(2);
DCLK_H;
delay_us(2);
if((P6IN&0x10)==0x10)
temp++; //判断控制IC送出的一位数据是否为1,如果为1,赋给temp的最低位
}
DCLK_L;
delay_us(2);
P6DIR|=(1<<4); //设置数据位为输出
return(temp); //返回结果
}
//================================================================================================
// 实现功能:读取触摸点X轴和Y轴电压值
// 返回参数:pix 读取到的触摸点电压值
//================================================================================================
struct struct1 AD7843()
{
struct struct1 pix;
CS_L;
Write_7843(0x90); //送控制字 10010000 即用差分方式读X坐标,详细请见有关资料
pix.y=Read_7843();
Write_7843(0xD0); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
pix.x=Read_7843();
CS_H;
return pix;
}
主程序中先用start_7843(); 然后不停地AD7843(),关键是PEN引脚不变低,就说没有按下去,但是在AVR上正常,请教高手我这个程序有问题吗?谢谢
页:
[1]