普中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();//数码管显示函数		
	}		
}


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

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

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
XPT2046是一款线制电阻触摸屏控制芯片,由深圳市矽普特科技有限公司研发生产,被广泛的应用于触摸屏驱动,堪称经典之作!他内12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。 连接方法: 说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚单片机SPI引脚,11接单片机某个引脚。 工作原理: 把XPT2046第11引脚接到STM32单片机引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。 关于触摸校准: 触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。 对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于触摸屏的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。 首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图: 大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个 看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。 看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。 从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了? XPT2046与MCU连接: XPT2046单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。 除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。 XPT2046的SPI时序 最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。 来看看触摸画板的效果吧

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不知何人

万分感谢诸位观看

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

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

打赏作者

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

抵扣说明:

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

余额充值