找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2841|回复: 1
打印 上一主题 下一主题
收起左侧

单片机+XTP2046芯片DOUT数据为何一开始为1

[复制链接]
跳转到指定楼层
楼主
ID:590549 发表于 2019-11-23 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
  1. /**************************************************************************************
  2. *                              电位器AD实验                                                                                                  *
  3. 实现现象:        具体接线操作请参考视频
  4.                         下载程序后数码管前4位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受
  5.                         你供电电压的影响.
  6. 注意事项:                                                                                                                                                                  
  7. ***************************************************************************************/

  8. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  9. #include"XPT2046.h"        

  10. typedef unsigned int u16;          //对数据类型进行声明定义
  11. typedef unsigned char u8;

  12. sbit LSA=P2^2;
  13. sbit LSB=P2^3;
  14. sbit LSC=P2^4;

  15. u8 disp[4];
  16. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  17. /*******************************************************************************
  18. * 函 数 名         : delay
  19. * 函数功能                   : 延时函数,i=1时,大约延时10us
  20. *******************************************************************************/
  21. void delay(u16 i)
  22. {
  23.         while(i--);        
  24. }

  25. /*******************************************************************************
  26. * 函数名         :datapros()
  27. * 函数功能                 :数据处理函数
  28. * 输入           : 无
  29. * 输出                  : 无
  30. *******************************************************************************/
  31. void datapros()
  32. {
  33.         u16 temp;
  34.         static u8 i;
  35.         if(i==50)
  36.         {
  37.                 i=0;
  38.                 temp = Read_AD_Data(0x94);                //   AIN0 电位器
  39.         }
  40.         i++;
  41.         disp[0]=smgduan[temp/1000];//千位
  42.         disp[1]=smgduan[temp%1000/100];//百位
  43.         disp[2]=smgduan[temp%1000%100/10];//个位
  44.         disp[3]=smgduan[temp%1000%100%10];               
  45. }


  46. /*******************************************************************************
  47. * 函数名         :DigDisplay()
  48. * 函数功能                 :数码管显示函数
  49. * 输入           : 无
  50. * 输出                  : 无
  51. *******************************************************************************/
  52. void DigDisplay()
  53. {
  54.         u8 i;
  55.         for(i=0;i<4;i++)
  56.         {
  57.                 switch(i)         //位选,选择点亮的数码管,
  58.                 {
  59.                         case(0):
  60.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  61.                         case(1):
  62.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  63.                         case(2):
  64.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  65.                         case(3):
  66.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位        
  67.                 }
  68.                 P0=disp[i];//发送数据
  69.                 delay(100); //间隔一段时间扫描        
  70.                 P0=0x00;//消隐
  71.         }               
  72. }

  73. /*******************************************************************************
  74. * 函 数 名       : main
  75. * 函数功能                 : 主函数
  76. * 输    入       : 无
  77. * 输    出             : 无
  78. *******************************************************************************/
  79. void main()
  80. {        
  81.         while(1)
  82.         {
  83.                 datapros();         //数据处理函数
  84.                 DigDisplay();//数码管显示函数               
  85.         }               
  86. }

复制代码
  1. #include"XPT2046.h"

  2. /****************************************************************************
  3. *函数名:SPI_Write
  4. *输  入:dat:写入数据
  5. *输  出:无
  6. *功  能:使用SPI写入数据
  7. ****************************************************************************/

  8. void SPI_Write(uchar dat)
  9. {
  10.         uchar i;
  11.         CLK = 0;
  12.         for(i=0; i<8; i++)
  13.         {
  14.                 DIN = dat >> 7;          //放置最高位
  15.                 dat <<= 1;
  16.                 CLK = 0;                        //上升沿放置数据

  17.                 CLK = 1;

  18.         }
  19. }
  20. /****************************************************************************
  21. *函数名:SPI_Read
  22. *输  入:无
  23. *输  出:dat:读取 到的数据
  24. *功  能:使用SPI读取数据
  25. ****************************************************************************/

  26. uint SPI_Read(void)
  27. {
  28.         uint i, dat=0;
  29.         CLK = 0;
  30.         for(i=0; i<12; i++)                //接收12位数据
  31.         {
  32.                 dat <<= 1;

  33.                 CLK = 1;
  34.                 CLK = 0;

  35.                 dat |= DOUT;

  36.         }
  37.         return dat;        
  38. }

  39. /****************************************************************************
  40. *函数名:Read_AD_Data
  41. *输  入:cmd:读取的X或者Y
  42. *输  出:endValue:最终信号处理后返回的值
  43. *功  能:读取触摸数据
  44. ****************************************************************************/
  45. uint Read_AD_Data(uchar cmd)
  46. {
  47.         uchar i;
  48.         uint AD_Value;
  49.         CLK = 0;
  50.         CS  = 0;
  51.         SPI_Write(cmd);
  52.         for(i=6; i>0; i--);         //延时等待转换结果
  53.         CLK = 1;          //发送一个时钟周期,清除BUSY
  54.         _nop_();
  55.         _nop_();
  56.         CLK = 0;
  57.         _nop_();
  58.         _nop_();
  59.         AD_Value=SPI_Read();
  60.         CS = 1;
  61.         return AD_Value;        
  62. }
复制代码
  1. #ifndef          __XPT2046_H_
  2. #define   __XPT2046_H_

  3. //---包含头文件---//
  4. #include<reg52.h>
  5. #include<intrins.h>

  6. //---重定义关键词---//
  7. #ifndef uchar
  8. #define uchar unsigned char
  9. #endif

  10. #ifndef uint
  11. #define uint  unsigned int
  12. #endif

  13. #ifndef ulong
  14. #define ulong  unsigned long
  15. #endif

  16. //---定义使用的IO口---//
  17. sbit DOUT = P3^7;          //输出
  18. sbit CLK  = P3^6;          //时钟
  19. sbit DIN  = P3^4;          //输入
  20. sbit CS   = P3^5;          //片选

  21. uint Read_AD_Data(uchar cmd);
  22. uint SPI_Read(void);
  23. void SPI_Write(uchar dat);

  24. #endif





复制代码



1.#include"XPT2046.h"中的DOUT的数据为什么一开始就为1,这个的数据从什么地方来的?

xpt2046中文.pdf

1.26 MB, 下载次数: 17

最佳答案

查看完整内容

因为芯片未工作时输出就是高阻态(未选中)。 而你读它是通过IO口的,IO口可入可出,将它置1,不会影响XPT2046.DOUT的输出(无论它输出是0是1),而置0,则会将这根线强行拉低,无法再读到1信号,因为:当信号两端一1一0时,1干不过0。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-11-23 21:18 | 只看该作者
因为芯片未工作时输出就是高阻态(未选中)。
而你读它是通过IO口的,IO口可入可出,将它置1,不会影响XPT2046.DOUT的输出(无论它输出是0是1),而置0,则会将这根线强行拉低,无法再读到1信号,因为:当信号两端一1一0时,1干不过0。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表