|
30黑币
- /**************************************************************************************
- * 电位器AD实验 *
- 实现现象: 具体接线操作请参考视频
- 下载程序后数码管前4位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受
- 你供电电压的影响.
- 注意事项:
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include"XPT2046.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 disp[4];
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函数名 :datapros()
- * 函数功能 :数据处理函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void datapros()
- {
- u16 temp;
- static u8 i;
- if(i==50)
- {
- i=0;
- temp = Read_AD_Data(0x94); // AIN0 电位器
- }
- i++;
- disp[0]=smgduan[temp/1000];//千位
- disp[1]=smgduan[temp%1000/100];//百位
- disp[2]=smgduan[temp%1000%100/10];//个位
- disp[3]=smgduan[temp%1000%100%10];
- }
- /*******************************************************************************
- * 函数名 :DigDisplay()
- * 函数功能 :数码管显示函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- }
- P0=disp[i];//发送数据
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- while(1)
- {
- datapros(); //数据处理函数
- DigDisplay();//数码管显示函数
- }
- }
复制代码- #include"XPT2046.h"
- /****************************************************************************
- *函数名:SPI_Write
- *输 入:dat:写入数据
- *输 出:无
- *功 能:使用SPI写入数据
- ****************************************************************************/
- void SPI_Write(uchar dat)
- {
- uchar i;
- CLK = 0;
- for(i=0; i<8; i++)
- {
- DIN = dat >> 7; //放置最高位
- dat <<= 1;
- CLK = 0; //上升沿放置数据
- CLK = 1;
- }
- }
- /****************************************************************************
- *函数名:SPI_Read
- *输 入:无
- *输 出:dat:读取 到的数据
- *功 能:使用SPI读取数据
- ****************************************************************************/
- uint SPI_Read(void)
- {
- uint i, dat=0;
- CLK = 0;
- for(i=0; i<12; i++) //接收12位数据
- {
- dat <<= 1;
- CLK = 1;
- CLK = 0;
- dat |= DOUT;
- }
- return dat;
- }
- /****************************************************************************
- *函数名:Read_AD_Data
- *输 入:cmd:读取的X或者Y
- *输 出:endValue:最终信号处理后返回的值
- *功 能:读取触摸数据
- ****************************************************************************/
- uint Read_AD_Data(uchar cmd)
- {
- uchar i;
- uint AD_Value;
- CLK = 0;
- CS = 0;
- SPI_Write(cmd);
- for(i=6; i>0; i--); //延时等待转换结果
- CLK = 1; //发送一个时钟周期,清除BUSY
- _nop_();
- _nop_();
- CLK = 0;
- _nop_();
- _nop_();
- AD_Value=SPI_Read();
- CS = 1;
- return AD_Value;
- }
复制代码- #ifndef __XPT2046_H_
- #define __XPT2046_H_
- //---包含头文件---//
- #include<reg52.h>
- #include<intrins.h>
- //---重定义关键词---//
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- #ifndef ulong
- #define ulong unsigned long
- #endif
- //---定义使用的IO口---//
- sbit DOUT = P3^7; //输出
- sbit CLK = P3^6; //时钟
- sbit DIN = P3^4; //输入
- sbit CS = P3^5; //片选
- uint Read_AD_Data(uchar cmd);
- uint SPI_Read(void);
- void SPI_Write(uchar dat);
- #endif
复制代码
1.#include"XPT2046.h"中的DOUT的数据为什么一开始就为1,这个的数据从什么地方来的?
|
最佳答案
查看完整内容
因为芯片未工作时输出就是高阻态(未选中)。
而你读它是通过IO口的,IO口可入可出,将它置1,不会影响XPT2046.DOUT的输出(无论它输出是0是1),而置0,则会将这根线强行拉低,无法再读到1信号,因为:当信号两端一1一0时,1干不过0。
|