目录
- 简介
- 封装
- 接线(单端)
- 时序以及命令字
- 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-4096XPT2046_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);}
}