XPT2046是一款四線制電阻觸摸屏控制芯片,內(nèi)含12位分辨率125KHz轉(zhuǎn)換速率逐步逼近型A/D轉(zhuǎn)換器,支持從1.5V到5.25V的低電壓I/O接口。
所謂逐步逼近型,就是輸入一個(gè)模擬量,其與1000 0000 0000 對(duì)應(yīng)的模擬量進(jìn)行比較,大則高位取1,小則高位取0。 這種思想相當(dāng)于折半查詢(xún),所以可以依次從高位到低位確定所有值,以此來(lái)確定模擬量對(duì)應(yīng)的數(shù)字量。
我們?cè)撊绾稳ビ眠@個(gè)芯片,來(lái)完成將一個(gè)模擬量轉(zhuǎn)換成數(shù)字量呢?
初學(xué)者確實(shí)有很大的困難,我們需要學(xué)會(huì)怎么去看它的芯片手冊(cè)。
上圖是它的一個(gè)封裝圖,是不是看得很亂?
別急,這時(shí)候還要看看它每個(gè)管腳的功能描述
如下圖
這時(shí)候,我們可以大致了解這是一個(gè)串行輸入輸出的芯片。
串行數(shù)據(jù)輸出是DOUT(16管腳),也就是我們最終的數(shù)字量。
串行數(shù)據(jù)輸入是DIN(2管腳),你會(huì)想,我們不是輸入的是模擬量,怎么會(huì)要串行輸入呢?
確實(shí),你會(huì)看到6、7、8、9管腳都是輸入管腳,它們就不是串行輸入的,所以我們可以推測(cè)它們是不同的模擬量輸入口。 其實(shí)DIN管腳是模式控制輸入口,就好比我們?nèi)ゲ僮?a href="http://www.nxhydt.com/tags/寄存器/" target="_blank">寄存器一樣,要寫(xiě)進(jìn)去一個(gè)數(shù)字量,來(lái)控制寄存器的運(yùn)行模式,芯片也是這樣。
再看DCLK管腳,這是外部時(shí)鐘輸入口,既然是串行輸入輸出,就要有拍子來(lái)控制一個(gè)一個(gè)字節(jié)輸入輸出,所以這個(gè)管腳就是起到這個(gè)作用。
然后我們一定要看時(shí)序圖
通過(guò)看時(shí)序圖,才能了解芯片的工作方式。
首先,CS是片選,低電平有效。
首先輸入一個(gè)DIN,但是由于是串行輸入,所以這里就要用位運(yùn)算來(lái)一位一位提取后輸入到DIN管腳,而輸進(jìn)去的時(shí)候是發(fā)生在時(shí)鐘上升沿,時(shí)鐘下降沿結(jié)束輸入。
所以我們可以將模式輸入程序?qū)懗蛇@樣的格式:
1、獲得char 型模式數(shù)字量
2、DCLK = 0.
3、提取高位并將其賦值給DIN
4、DCLK = 1.鎖存當(dāng)前值。
循環(huán)8次。
之后我們發(fā)現(xiàn)芯片進(jìn)入busy階段,我們需要給它一個(gè)小延時(shí),讓它進(jìn)行AD轉(zhuǎn)換,然后我們還需要再給一個(gè)時(shí)鐘脈沖,清除busy.
接下來(lái)就是讀取DOUT的值,原理同DIN輸入。
而模式的選擇需要看你的板子上是怎么外接的
我們需要用電位器來(lái)實(shí)現(xiàn)AD轉(zhuǎn)換,所以模擬量輸入接口應(yīng)該選擇X+(6管腳)
再看芯片手冊(cè)的模式說(shuō)明
所以我們模式選擇為0x94,讀者可以自行對(duì)照每一位看看。
綜上,我就可以給出完整代碼了
1 #include 52.h>
2 #include
3
4 #define uint unsigned int
5 #define uchar unsigned char
6 #define GPIO_DUAN P0
7
8 uchar table[]={
9 0x3f, 0x06, 0x5b, 0x4f,
10 0x66, 0x6d, 0x7d, 0x07,
11 0x7f, 0x6f, 0x77, 0x7c,
12 0x39, 0x5e, 0x79, 0x71
13 };
14
15 uchar DisplayData[5];
16 sbit HCA = P2^2;//HCA,HCB,HCC是利用了74HC138譯碼器來(lái)進(jìn)行位選,我們動(dòng)態(tài)位選了4位
17 sbit HCB = P2^3;
18 sbit HCC = P2^4;
19 sbit CLK = P1^0;
20 sbit CS = P1^1;
21 sbit DIN = P1^2;
22 sbit DOUT = P1^3;
23
24 void DisplayDS();
25 void delayms(uint xms);
26 uint Read_AD_Data(uchar moshi);
27 void SPI_Write(uchar moshi);
28 uint GetValue();
29
30 void main()
31 {
32 uint temp, cnt = 50;
33 while(1){
34 if(cnt == 50){//每50下讀取轉(zhuǎn)換值,避免數(shù)字跳動(dòng)太快
35 temp = Read_AD_Data(0x94);
36 cnt = 0;
37 }
38 cnt++;
39
40 DisplayData[0] = table[temp%10000/1000];
41 DisplayData[1] = table[temp%1000/100];
42 DisplayData[2] = table[temp%100/10];
43 DisplayData[3] = table[temp%10/1];
44
45 DisplayDS();
46 }
47 }
48
49 void DisplayDS()
50 {//動(dòng)態(tài)掃描函數(shù)
51 uint i;
52 for(i = 0; i < 4; i++){
53 GPIO_DUAN = 0x00;
54 switch(i)
55 {
56 case 0 : HCC = 0; HCB = 0; HCA = 0; break;
57 case 1 : HCC = 0; HCB = 0; HCA = 1; break;
58 case 2 : HCC = 0; HCB = 1; HCA = 0; break;
59 case 3 : HCC = 0; HCB = 1; HCA = 1; break;
60 }
61 GPIO_DUAN = DisplayData[i];
62 delayms(1);
63 }
64 }
65
66 void delayms(uint xms)
67 {
68 uint i, j;
69 for(i = 0; i < xms; i++)
70 for(j = 0; j < 110; j++);
71 }
72
73 uint Read_AD_Data(uchar moshi)
74 {//讀取最終的數(shù)字量函數(shù)
75 uint i, ans;
76 SPI_Write(moshi);
77 for(i = 0; i < 5; i++);
78
79 CLK = 1;
80 _nop_();
81 _nop_();
82 CLK = 0;
83 _nop_();
84 _nop_();
85
86 ans = GetValue();
87 CS = 1;
88 return ans;
89 }
90
91 void SPI_Write(uchar moshi)
92 {//寫(xiě)模式函數(shù)
93 uint i;
94 CS = 0;
95 for(i = 0; i < 8; i++){
96 CLK = 0;
97 DIN = moshi>>7;
98 CLK = 1;
99 moshi <<= 1;
100 }
101 CLK = 0;
102 }
103
104 uint GetValue()
105 {//讀取DOUT管腳,得到最終數(shù)字量函數(shù)
106 uint i, ans = 0;
107 for(i = 0; i < 12; i++){
108 CLK = 0;
109 ans <<= 1;
110 ans |= DOUT;
111 CLK = 1;
112 }
113 CLK = 0;
114 return ans;
115 }
-
電位器
+關(guān)注
關(guān)注
14文章
1005瀏覽量
66725 -
觸摸屏
+關(guān)注
關(guān)注
42文章
2290瀏覽量
115999 -
模擬量
+關(guān)注
關(guān)注
5文章
491瀏覽量
25506 -
AD轉(zhuǎn)換
+關(guān)注
關(guān)注
3文章
167瀏覽量
45291 -
XPT2046
+關(guān)注
關(guān)注
0文章
18瀏覽量
18249
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論