文章目录
- 一、简介
- 二、原理图以及手册
- 三、接线
- 四、选择数码管芯片原理讲解
- 五、代码
一、简介
本文介绍了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;
}
所有资料和代码已打包放资源栏了,欢迎各位指正错误,阅读此文,非常感谢。