触摸屏ADS7846驱动
用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 片选脚是直接接地的,不知会会有影响???
液晶屏已经正常工作了,下子几张图片进去,挺好玩的....
![]() 图片是用image2lcd生成的.
中文字模用HZDotReader,和ZIMO软件. 本文出自 51CTO.COM技术博客 |




easylwl
博客统计信息
热门文章
最新评论
友情链接