• 普中A6开发版——XPT2046四引脚切换测量(含详细教程以及原理图等资料)



    一、简介

    本文介绍了XPT2046的使用方法以及普中A6开发版的接线等,并从原理图以及手册中摘选了详细的介绍,充分理解其工作原理。XPT2046本来是一个电阻式触摸屏控制器,但是也可以单独测引脚电压。我看CSDN上并没有其命令的详细讲解,就从头梳理一遍。

    二、原理图以及手册

    我们可以从下图XPT2046的手册中看到其命令格式,由于我选择的是切换显示四个引脚电压,所以选择了单端模式,第7位是开始位,肯定要选择为1,456位对应测量不同的引脚,稍后讲解,3位根据个人需求选择转换速率,2位选择单端为1,1位和0位选择功率模式。

    在这里插入图片描述

    根据下图单端配置表,可以看出000和111检测TEMP,001和011均检测XP,010测VBAT,100测YN,101测YP,110测AUX。这些引脚功能不一,需要从原理图上看出其对应功能。

    在这里插入图片描述

    对应到原理图上,可以看到:
    X+,也就是刚刚配置的XP对应AIN0,AIN0对应滑动电阻。
    Y+,也就是刚刚配置的YP对应AIN1,AIN0对应热敏电阻。
    AUX对应AIN3,开发板上这个引脚单独引出来了。
    VBAT对应AIN2,AIN2对应光敏电阻。
    我选择测量这四个引脚的电压,那么输入的命令对应就是。
    0x94:滑动电阻,0xA4:光敏电阻,0xD4:热敏电阻,0xE4:AUX引脚

    在这里插入图片描述

    三、接线

    AD/DAC
    P34–>DI
    P35–>CS
    P36–>CL
    P37–>DO
    数码管
    J22–>J6
    P22–>J9(A)
    P23–>J9(B)
    P24–>J9©
    静态数码管8根线接P1口8个引脚

    P20对应按键控制当前显示引脚

    请添加图片描述

    四、选择数码管芯片原理讲解

    这个开发板并没有连接好线路,我们需要自行连线,在连接数码管的时候,P20、P21、P22三个引脚接到了74HC138译码器上,这个译码器将3位输入对应到8位输出,也就是J10那一排引脚,然后通过跳线帽,将J10与J1相连接,就可以位选数码管了,而段选数码管显示数字就靠P0口,接到J6的引脚上,但是驱动电流不足,我们可以看到J6通往数码管的路上有个U4(74HC245),用来加强驱动电流。

    五、代码

    main文件

    		  
    
    #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;
    sbit P20=P2^0;
    
    u8 flag = 0;	//引脚标号
    u8 disp[4];
    u8 code t_display[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};		//数码管0-9
    
    void delay(u16 i)	//延时i*10us
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函数名         :Nixie_dis()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Nixie_dis()
    {
    	u8 i;
    	for(i=0;i<4;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSC=0;LSB=0;LSA=0; break;//显示第0位
    			case(1):
    				LSC=0;LSB=0;LSA=1; break;//显示第1位
    			case(2):
    				LSC=0;LSB=1;LSA=0; break;//显示第2位
    			case(3):
    				LSC=0;LSB=1;LSA=1; break;//显示第3位
    		}
    		P0=disp[i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    /*******************************************************************************
    * 函数名         :Data_dis()
    * 函数功能		 :数据处理函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Data_dis()
    {
    	u16 temp;
    	u8 i;
    	
    	if(P20==0)		//松手检测
    	{
    		while(P20==0)
    		{
    			Nixie_dis();		//卡这里的时候也可以显示原先的数字
    		}
    		flag++;
    		if(flag == 4)
    			flag = 0;
    	}
    
    	if(i==50)
    	{
    		i=0;
    		switch(flag)
    		{
    			case 0:	temp = Read_AD_Data(0x94);break;		//(0x94/0xB4)电位器
    			case 1: temp = Read_AD_Data(0xA4);break;		//光敏电阻
    			case 2: temp = Read_AD_Data(0xD4);break;		//热敏电阻
    			case 3: temp = Read_AD_Data(0xE4);break;		//AUX
    		}
    	}
    	i++;
    	disp[0]=t_display[temp/1000];//千位
    	disp[1]=t_display[temp%1000/100];//百位
    	disp[2]=t_display[temp%1000%100/10];//个位
    	disp[3]=t_display[temp%1000%100%10];
    	P1 = ~t_display[flag];		//静态数码管
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	while(1)
    	{
    		Data_dis();	 //数据处理函数
    		Nixie_dis();//数码管显示函数		
    	}		
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107

    xpt2046.h文件

    #ifndef	  __XPT2046_H_
    #define   __XPT2046_H_
    
    //---包含头文件---//
    #include
    #include
    
    //---重定义关键词---//
    #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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    xpt2046.c文件

    #include"XPT2046.h"
    /****************************************************************************
    *函数名:TSPI_Start
    *输  入:无
    *输  出:无
    *功  能:初始化触摸SPI
    ****************************************************************************/
    
    void SPI_Start(void)
    {
    	CLK = 0;
    	CS  = 1;
    	DIN = 1;
    	CLK = 1;
    	CS  = 0;		
    }
    /****************************************************************************
    *函数名: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;		//拉低使能XPT2046
    	SPI_Write(cmd);		
    	for(i=6; i>0; i--); 	//延时等待转换结果
    	CLK = 1;	  //发送一个时钟周期,清除BUSY
    	_nop_();
    	_nop_();
    	CLK = 0;
    	_nop_();
    	_nop_();
    	AD_Value=SPI_Read();
    	CS = 1;		//关闭XPT2046
    	return AD_Value;	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    所有资料和代码已打包放资源栏了,欢迎各位指正错误,阅读此文,非常感谢。

  • 相关阅读:
    MySQL视图
    编写OpenCL程序的基本步骤
    [Python]从入门到入门
    GPIO子系统(三)
    C# 使用Microsoft.Office.Interop.Excel库操作Excel
    评估指标Pre\Rec\F1\AUC
    万物互联时代到来,猿代码领衔先计算机赋数据化转型
    机器人编程学习有哪些好处?
    Go语言代码断行规则详解
    E. Expenditure Reduction(思维+预处理+蛮力)
  • 原文地址:https://blog.csdn.net/qq_56225568/article/details/126918563