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

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

我们该如何去用这个芯片,来完成将一个模拟量转换成数字量呢?

初学者确实有很大的困难,我们需要学会怎么去看它的芯片手册。

上图是它的一个封装图,是不是看得很乱?

别急,这时候还要看看它每个管脚的功能描述

如下图

这时候,我们可以大致了解这是一个串行输入输出的芯片。

串行数据输出是DOUT(16管脚),也就是我们最终的数字量。

串行数据输入是DIN(2管脚),你会想,我们不是输入的是模拟量,怎么会要串行输入呢?

确实,你会看到6、7、8、9管脚都是输入管脚,它们就不是串行输入的,所以我们可以推测它们是不同的模拟量输入口。其实DIN管脚是模式控制输入口,就好比我们去操作寄存器一样,要写进去一个数字量,来控制寄存器的运行模式,芯片也是这样。

再看DCLK管脚,这是外部时钟输入口,既然是串行输入输出,就要有拍子来控制一个一个字节输入输出,所以这个管脚就是起到这个作用。

然后我们一定要看时序图

通过看时序图,才能了解芯片的工作方式。

首先,CS是片选,低电平有效。

首先输入一个DIN,但是由于是串行输入,所以这里就要用位运算来一位一位提取后输入到DIN管脚,而输进去的时候是发生在时钟上升沿,时钟下降沿结束输入。

所以我们可以将模式输入程序写成这样的格式:

1、获得char 型模式数字量

2、DCLK = 0.

3、提取高位并将其赋值给DIN

4、DCLK = 1.锁存当前值。

循环8次。

之后我们发现芯片进入busy阶段,我们需要给它一个小延时,让它进行AD转换,然后我们还需要再给一个时钟脉冲,清除busy.

接下来就是读取DOUT的值,原理同DIN输入。

而模式的选择需要看你的板子上是怎么外接的

我们需要用电位器来实现AD转换,所以模拟量输入接口应该选择X+(6管脚)

再看芯片手册的模式说明

所以我们模式选择为0x94,读者可以自行对照每一位看看。

综上,我就可以给出完整代码了

 #include <reg52.h>
#include<intrins.h> #define uint unsigned int
#define uchar unsigned char
#define GPIO_DUAN P0 uchar table[]={
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71
}; uchar DisplayData[];
sbit HCA = P2^;//HCA,HCB,HCC是利用了74HC138译码器来进行位选,我们动态位选了4位
sbit HCB = P2^;
sbit HCC = P2^;
sbit CLK = P1^;
sbit CS = P1^;
sbit DIN = P1^;
sbit DOUT = P1^; void DisplayDS();
void delayms(uint xms);
uint Read_AD_Data(uchar moshi);
void SPI_Write(uchar moshi);
uint GetValue(); void main()
{
uint temp, cnt = ;
while(){
if(cnt == ){//每50下读取转换值,避免数字跳动太快
temp = Read_AD_Data(0x94);
cnt = ;
}
cnt++; DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/]; DisplayDS();
}
} void DisplayDS()
{//动态扫描函数
uint i;
for(i = ; i < ; i++){
GPIO_DUAN = 0x00;
switch(i)
{
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
}
GPIO_DUAN = DisplayData[i];
delayms();
}
} void delayms(uint xms)
{
uint i, j;
for(i = ; i < xms; i++)
for(j = ; j < ; j++);
} uint Read_AD_Data(uchar moshi)
{//读取最终的数字量函数
uint i, ans;
SPI_Write(moshi);
for(i = ; i < ; i++); CLK = ;
_nop_();
_nop_();
CLK = ;
_nop_();
_nop_(); ans = GetValue();
CS = ;
return ans;
} void SPI_Write(uchar moshi)
{//写模式函数
uint i;
CS = ;
for(i = ; i < ; i++){
CLK = ;
DIN = moshi>>;
CLK = ;
moshi <<= ;
}
CLK = ;
} uint GetValue()
{//读取DOUT管脚,得到最终数字量函数
uint i, ans = ;
for(i = ; i < ; i++){
CLK = ;
ans <<= ;
ans |= DOUT;
CLK = ;
}
CLK = ;
return ans;
}

利用XPT2046制作一个电位器AD转换装置的更多相关文章

  1. 利用DreamweaverCS5制作一个含有动态标题的教程

    DreamweaverCS5怎么制作一个含有动态标题?做一个网页就先要做一个标题,一个好标题会让网页让人印象深刻,有动态的标题会让网页更生动,下面我就介绍一下怎么制作一个含有动态的标题   做一个网页 ...

  2. 利用Qt制作一个helloworld

    使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4 ...

  3. 利用Python制作一个只属于和她的聊天器,再也不用担心隐私泄露啦!

    ------------恢复内容开始------------ 是否担心微信的数据流会被监视?是否担心你和ta聊天的小秘密会被保存到某个数据库里?没关系,现在我们可以用Python做一个只属于你和ta的 ...

  4. 利用docker制作一个带有redis软件的镜像,供其他人使用

    1. 宿主机在etc/apt/下创建一个haha的文件夹 2.宿主机将haha文件夹映射到容器的虚拟系统中etc/apt/ 3. 此时,可以在宿主机和容器虚拟机中同步创建和删除文件 4. 将宿主机中的 ...

  5. 利用html5制作一个时钟动画

    <canvas id="clock" width="500" height="500" style="background- ...

  6. 利用Bootstrap制作一个流行的网页

    首先是html承载内容: <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset ...

  7. 利用HTML制作一个简单的界面(工具HBuilder)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...

  8. 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟

    周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...

  9. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

随机推荐

  1. express + restful

    express http://www.expressjs.com.cn/ Express 是一个基于 Node.js 平台的极简.灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 ...

  2. DUMP2 企业级电商项目

    正常设计数据库表,按照数据流向. ~~闭环核心业务 [1用户]登录 =>浏览[2分类]+浏览[3商品]=>加入[4购物车]=>结算[5订单]+[6收货地址]=>[7支付] [购 ...

  3. shell 批量检测远程端口

    [DNyunwei@YZSJHL24-209 li]$ cat port.sh #!/bin/bash # ip=`cat iplist` for i in $ip;do port=`ssh -t $ ...

  4. 405 css样式的研究 list-style-type 属性研究

    CSS 列表的样式 list-style-type.list-style-position和list-style-image 属性 在CSS中,列表元素是一个块框,列表中的每个表项也是一个块框,只是在 ...

  5. pyhton之Reportlab模块

    reportlab模块是用python语言生成pdf文件的模块 安装:pip install reportlab 模块默认不支持中文,如果使用中文需要注册 1.注册中文字体 下载自己需要的.ttf字体 ...

  6. anaconda3安装cv2模块(python3.6)

  7. Sublime text3 连接sftp/ftp(远程服务器)

    1.按下Ctrl + Shift + P调出命令面板2.在输入框中输入Sftp,按回车下载3.建一个新的文件夹放到左边的项目栏中4.右击文件夹,选中SFTP/FTP,点击Map to Remote5. ...

  8. git知识总结-1.git基础之基本术语

    1.前言 git是一种分布式版本管理工具,本文主要是通过阅读博客中几篇讲述git的优秀文章,并对文章进行整理.提炼总结得出一份git的说明文档. 本文档介绍了git的基本原理及常用操作,目标是通过阅读 ...

  9. udp/tcp流程

    udp: 1.创建套接字 socket 2.绑定本地ip/port bind 3.收发数据 sendto/recvfrom 4.关闭套接字 close tcp客户端: 1.创建套接字 socket 2 ...

  10. JavaScript入门学习笔记(一)

    W3cJavaScript教程 JS是JavaScript的缩写,而JSP是Java Server Page的缩写,后者是用于服务器的语言. JavaScript代码写在标签<script> ...