文章目录
- 一、简介
- 二、原理图以及手册
- 三、接线
- 四、选择数码管芯片原理讲解
- 五、代码
一、简介
本文介绍了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; }
所有资料和代码已打包放资源栏了,欢迎各位指正错误,阅读此文,非常感谢。
今天的文章
普中A6开发版——XPT2046四引脚切换测量(含详细教程以及原理图等资料)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80641.html