用ADS7846接触摸时可以有几种办法去读XY坐标,一种是中断方式,当按下触摸屏时,ADS7846会产中一个中断信号,可以利用这个中断信号来读取XY坐标.也可以用查询的方法来读入XY坐标,就是不断地读入XY坐标,然后作坐标位置判定,应该讲用中断方式是科学,但因为我的电路板上没有接这中断引脚,所以只能用查询的办法了.
       ADS7846可以设置为8位或者是12位.一般屏大于是240X128时就用12位,官方的接线图
是:
      可以看到,VREF是空的,基准电压可以设为内部2.5V,但这样会有问题,就是读到的X,Y值最大只有512,只有四分之一个屏可以用,出了这四分之一屏的地方都是512,512的坐标.原因是什么我也搞不明.有的网上文章上讲要把VREF接到VCC上,我三种方法都试过,发现,把VREF接到VCC,同抛空结果都是一样,不知为什么?
ADS7846有两种工作方式:一种是单端输入,一种是差分输入。在需要进行压力测量的时候,必须使用差分输入的工作模式。我也是采用差分输入,其实也不知两者之间有什么不同..
程序如下.
//call this routine to initialize all peripherals
void startspi(void)
{
SETDCLK;
SETDIN;
}

void WriteCharTo7846(uchar  num) //SPI写数据
{
uchar count=0;
for(count=0;count<8;count++)
{
if ((num & (0x80>>count))!=0) SETDIN; else CLRDIN;
CLRDCLK;
delay_us(10); //上升沿有效
SETDCLK;
delay_us(10);
}
}
uint ReadFromCharFrom7846(void) //SPI 读数据
{
uchar count=0;
uint Num=0;
for(count=0;count<12;count++)
{
Num<<=1;
SETDCLK;
delay_us(10);  //下升沿有效
CLRDCLK;
delay_us(10);
if(DOUT!=0) Num++;
}
return(Num);
}
 
void checkbut(void)  //外部中断0 用来接受键盘发来的数据
{
delay_ms(20); //中断后延时以消除抖动,使得采样数据更准确
startspi();
WriteCharTo7846(0x90); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
while(BUSY!=0); //如果BUSY信号不好使可以删除不用
delay_ms(2);
SETDCLK;
delay_us(10);
CLRDCLK;
delay_us(10);
positiony=ReadFromCharFrom7846();  //读Y轴坐标
WriteCharTo7846(0xD0); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
while(BUSY!=0); //如果BUSY信号不好使可以删除不用
delay_ms(2);
SETDCLK;
delay_us(10); //下降沿有效
CLRDCLK;
delay_us(10);
positionx=ReadFromCharFrom7846();  //读X轴坐标
readxy();
}
程序是参考程序匠人,多谢程序匠人,
 
调试过程中觉得测到的X,Y值不是很稳定,总有正负100左右的变化,不知算不算正常呢....??
还有我的CS 片选脚是直接接地的,不知会会有影响???
 
液晶屏已经正常工作了,下子几张图片进去,挺好玩的....
图片是用p_w_picpath2lcd生成的.
中文字模用HZDotReader,和ZIMO软件.