一 主要知识点及分析:
1.这里是用到的XPT2046芯片,芯片详细说明自行查阅;
2.这里有两种模式,一般外设的转换用的是单端模式,在使用触摸屏的时候我们选择差分模式;
3.这张图有就是时序图,读写都需要在这上面进行编写代码,
3.1 写8位代码:主要是将传入的控制命令进行写入;
3.2 读12位代码;将模拟数据读出来;
3.3 AD数据转换代码:
二 源代码:
2.1 代码的格式:
2.2 main.c文件:
#include "public.h"
#include "smg.h"
#include "xpt2046.h"
//主函数
int main()
{
u8 acd_buf[3];
u16 acd_vloue = 0;
float acd_vol; //ACD电压值
while(1)
{
acd_vloue = xpt2046_read_adc_value(0x94); // 测量电位器
acd_vol =5.0 * acd_vloue / 4096; //将读取的 AD 值转换为电压
acd_vloue = acd_vol*10; //放大10倍,即保留小数点一位
acd_buf[0] = smg_Buf[acd_vloue/10]|0x80;
acd_buf[1] = smg_Buf[acd_vloue%10];
acd_buf[2] = 0x3e;//显示99单位 V
smg_display(acd_buf,6);
}
return 0;
}
2.3 public.c文件:
#include "public.h"
void delay_10us(u16 time_num_us) //延时函数定义, time_num_us=1;延时10us;
{
while(time_num_us--);
}
void delay_ms(u16 time_num_us) //延时函数定义, time_num_us=1;延时1ms;
{
int i = 0;
int j = 0;
for(i = 0; i < time_num_us; i++)
for(j = 101; j > 0; j--);
}
2.4 public.h文件:
#ifndef _public_H
#define _public_H
#include "reg52.h"
typedef unsigned char u8; //将系统默认的数据类型进行重定义
typedef unsigned int u16;
typedef unsigned int u32;
void delay_10us(u16 time_num_us); //10us延时函数声明
void delay_ms(u16 time_num_us); //1ms延时函数声明
#endif
2.5 smg.c文件:
#include "smg.h"
//定义动态数码管显示0-F数组
u8 smg_Buf[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//动态数码管显示函数定义
void smg_display(u8 dat[], u8 pos)
{
u8 i = 0;
u8 pos_temp = pos-1; //将输入的数码管第几位然后减1
for(i = 0; i < 8; i++)
{
switch(i)//位选
{
case 0: LSC = 1; LSB = 1; LSA = 1; break;
case 1: LSC = 1; LSB = 1; LSA = 0; break;
case 2: LSC = 1; LSB = 0; LSA = 1; break;
case 3: LSC = 1; LSB = 0; LSA = 0; break;
case 4: LSC = 0; LSB = 1; LSA = 1; break;
case 5: LSC = 0; LSB = 1; LSA = 0; break;
case 6: LSC = 0; LSB = 0; LSA = 1; break;
case 7: LSC = 0; LSB = 0; LSA = 0; break;
}
Nixie_Tube_Port = dat[i-pos_temp];//传送段选数据
delay_10us(100);//延时一段时间,等待显示稳定
Nixie_Tube_Port = 0x00;
}
}
2.6 smg.h文件:
#ifndef _smg_H
#define _smg_H
#include "public.h"
#define Nixie_Tube_Port P0//通过宏定义数码管的P0端口
sbit LSA = P2^2; //定义74HC138驱动端口
sbit LSB = P2^3;
sbit LSC = P2^4;
//动态数码管显示函数声明
void smg_display(u8 dat[], u8 pos);
//定义动态数码管显示0-F数组声明
extern u8 smg_Buf[17];
#endif
2.7 xpt2046.c文件:
#include "xpt2046.h"
#include "intrins.h"
//adc写8位函数定义
void xpt2046_adc_write(u8 dat)
{
u8 i = 0;
DCLK = 0;
_nop_();
for(i = 0; i < 8; i++) //循环 8 次,每次传输一位,共一个字节
{
DIN=dat>>7; //先传高位再传低位
dat <<= 1; //将低位移到高位
DCLK = 1; //CLK 由低到高产生一个上升沿,从而写入数据
_nop_();
DCLK = 0;
_nop_();
}
}
//adc读12位函数定义
u16 xpt2046_adc_read(void)
{
u8 i = 0;
u16 dat = 0;
DCLK = 0;
_nop_();
for(i = 0; i < 12; i++) //循环 12 次,每次读取一位,大于一个字节数,所以返回值类型是 u16
{
dat <<= 1;
DCLK = 1;
_nop_();
DCLK = 0; //CLK 由高到低产生一个下降沿,从而读取数据
_nop_();
dat |= DOUT; //先读取高位,再读取低位。
}
return dat;
}
//XPT2046读AD数据函数定义
u16 xpt2046_read_adc_value(u8 cmd) //u8 cmd这里是传入命令字节
{
u8 i = 0;
u16 acd_vloue = 0;
CS = 0; //先拉低时钟
xpt2046_adc_write(cmd); //发送命令字节
for(i = 6; i > 0; i--); //延时等待转换结果
DCLK = 1;
_nop_();
DCLK = 0; //发送一个时钟,清除BUSY
_nop_();
acd_vloue = xpt2046_adc_read();
CS = 1; //关闭xpt2046
return acd_vloue;
}
2.8 xpt2046.h文件
#ifndef _xpt2046_H
#define _xpt2046_H
#include "public.h"
sbit DOUT = P3^7;//定义ET20465端口
sbit DIN = P3^4;
sbit CS = P3^5;
sbit DCLK = P3^6;
u16 xpt2046_read_adc_value(u8 cmd);//XPT2046读AD数据函数声明
#endif