简介

XPT2046是一款四线制电阻触摸屏控制芯片,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。

所谓逐步逼近型,就是输入一个模拟量,其与1000 0000 0000 对应的模拟量进行比较,大则高位取1,小则高位取0。这种思想相当于折半查询,所以可以依次从高位到低位确定所有值,以此来确定模拟量对应的数字量。

控制位命令

引脚说明

2 —》DIN 数据输入端:也是写芯片的控制位命令
3----》CS 片选信号 :也是使能端 0时,芯片能正常写读
4----》DCLK 外部时钟信号: 也是单片机控制时钟 ,允许芯片依次读或者写。
16----》Dout 数据输出端 :也是数字量输出给单片机的数字量。12位或者8位。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

时序图

在这里插入图片描述

在这里插入图片描述

底层封装代码 (未含mian)

可以做好调用

xpt2046.c 文件

#include "xpt2046.h"
#include "intrins.h"

/*******************************************************************************
* 函 数 名       : xpt2046_wirte_data
* 函数功能		 : XPT2046写数据
* 输    入       : dat:写入的数据(向芯片写数据)
* 输    出    	 : 无
*******************************************************************************/
void xpt2046_wirte_data(unsigned char dat)
{
	unsigned char i;

	CLK = 0;
	_nop_();
	for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节
	{
		DIN = dat >> 7;//先传高位再传低位
		dat <<= 1;//将低位移到高位
		CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据
		_nop_();	
		CLK = 1;
		_nop_();
	}
}

/*******************************************************************************
* 函 数 名       : xpt2046_read_data
* 函数功能		 : XPT2046读数据(向芯片读取AD 数值)
* 输    入       : 无
* 输    出    	 : XPT2046返回12位数据
*******************************************************************************/
unsigned int	xpt2046_read_data(void)
{
	unsigned char i;
	unsigned int dat=0;

	CLK = 0;
	_nop_();
	for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是unsigned int
	{
		dat <<= 1;
		CLK = 1;
		_nop_();
		CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
		_nop_();
		dat |= DOUT;//先读取高位,再读取低位。	
	}
	return dat;	
}

/*******************************************************************************
* 函 数 名       : xpt2046_read_adc_value
* 函数功能		 : XPT2046读AD数据(0-4096)12位大小
* 输    入       : cmd:指令
* 输    出    	 : XPT2046返回AD值 (12位-》4096)
*******************************************************************************/
unsigned int xpt2046_read_adc_value(unsigned char cmd)
{
	unsigned char i;
	unsigned int adc_value=0;

	CLK = 0;//先拉低时钟
	CS  = 0;//使能XPT2046
	xpt2046_wirte_data(cmd);//发送命令字
	for(i=6; i>0; i--);//延时等待转换结果
	CLK = 1;
	_nop_();
	CLK = 0;//发送一个时钟,清除BUSY
	_nop_();
	adc_value=xpt2046_read_data();
	CS = 1;//关闭XPT2046
	return adc_value;
}


/*========== main.c  调用======================

main()
{
	...
	while(1)
	{
		...
		···
		adc_value=xpt2046_read_adc_value(0xA4);  //测量光敏电阻	0xA4芯片控制位命令,adc_value :AD数据值
		...
		···
	}
}
*//==========================================

xpt2046.H 文件

#ifndef _xpt2046_H
#define _xpt2046_H
#include "reg52.h"

//管脚定义
sbit DOUT = P3^7;	  //输出---芯片输出AD数子量
sbit CLK  = P3^6;	  //时钟---向芯片写时钟引脚
sbit DIN  = P3^4;	  //输入---向芯片输入cmd 数据
sbit CS   = P3^5;	  //片选--- 使能芯片脚


//函数声明
unsigned int xpt2046_read_adc_value(unsigned  char cmd);

#endif


Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐