目录
- 简介
- 封装
- 接线(单端)
- 时序以及命令字
- SPI时序
- 命令字
- 程序
- XPT2046.C
- XPT2046.h
- main.c
- 测试
简介
XPT2046是一款4线电阻式触摸屏控制器,采用12位125 kHz采样SAR类型A / D转换器。XPT2046工作电压低至2.2V,支持1.5V至VCC的数字I/O接口电压以便连接低电压uP。XPT2046可以通过进行两次A/D转换来检测按下的屏幕位置。XPT2046还可以量触摸屏压力。片上VREF可用于模拟辅助输入;温度测量和电池监测,能够测量从0V到5V的电压。XPT2046也有一个片上温度传感器,XPT2046采用16引脚QFN薄封装(0.75mm高),具有工作温度范围-40°C至+85°C
XPT2046多用于触摸屏,这里只作为AD模块采集模拟电压
封装
接线(单端)
XPT2046 | STC |
---|---|
VCC | VCC |
XN | GND |
YN | GND |
GND | GND |
VREF | VCC |
IOVDD | VCC |
DCLK | P20 |
CS | P21 |
DIN | P22 |
DOUT | P23 |
时序以及命令字
SPI时序
命令字
程序
XPT2046.C
#include <STC89C5xRC.H>
sbit XPT2046_DCLK = P2^0;
sbit XPT2046_CS = P2^1;
sbit XPT2046_DIN = P2^2;
sbit XPT2046_DOUT = P2^3;
unsigned int XPT2046_ReadAD(unsigned char command)//command 命令字
{
unsigned char i=0;
unsigned int AD=0x00;//返回的数据 8位是0-255 12位是0-4096
XPT2046_DCLK = 0;
XPT2046_CS = 0;
for(;i<8;i++)
{
XPT2046_DIN = command&(0x80>>i);
XPT2046_DCLK = 1;
XPT2046_DCLK = 0;
}
for(i=0;i<16;i++)
{
XPT2046_DCLK = 1;
XPT2046_DCLK = 0;
if(XPT2046_DOUT){AD |= (0x8000>>i);}
}
XPT2046_CS = 1;
if(command&0x08)
{
return AD>>8;//8位
}else
{
return AD>>4;//12位
}
}
XPT2046.h
#ifndef __XPT2046_H__
#define __XPT2046_H__
//8位命令字
#define XPT2046_XP 0x9C
#define XPT2046_YP 0xDC
#define XPT2046_VBAT 0xAC
#define XPT2046_AUX 0xEC
//12位命令字 = 8位命令字-8
unsigned int XPT2046_ReadAD(unsigned char command);
#endif
main.c
#include <STC89C5xRC.H>
#include <delay.h>
#include <uart.h>
#include <XPT2046.H>
//int数据转字符数组
void IntToString_X(unsigned char Bit,unsigned char *str,unsigned int dat)//Bit:几位ad str:字符数组地址 dat:int数据
{
unsigned char i = 0;
unsigned int buf[8];
//简略取最小分辨单位 因此有一定误差
if(Bit == 8){dat *= 196;}//0-5V 8位
else if(Bit == 12){dat *= 12;}//0-5V 12位
do { //先转换成 低位在前的十进制数组 将低位高位互换
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
while (i-- > 0) //将数组值转换为 ASCII 码反向拷贝到接收指针上
{
*str++ = buf[i] + '0';
}
*str = '\0';
}
void main()
{
unsigned char arr[8];
char * P = arr;
uart_init();
while(1)
{
IntToString_X(8,P,XPT2046_ReadAD(XPT2046_XP));
UART_Send(P);
Delay_x_ms(1000);
}
}