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

文章目录

  • 一、简介
  • 二、原理图以及手册
  • 三、接线
  • 四、选择数码管芯片原理讲解
  • 五、代码


一、简介

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

二、原理图以及手册

我们可以从下图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();//数码管显示函数		
	}		
}


xpt2046.h文件

#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






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;	
}

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知何人

万分感谢诸位观看

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值