日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
VFD的實(shí)現(xiàn)原理和驅(qū)動(dòng)設(shè)計(jì)
VFD的實(shí)現(xiàn)原理和驅(qū)動(dòng)設(shè)計(jì)
 更新時(shí)間:2008-7-26 19:45:01  點(diǎn)擊數(shù):3
【字體: 字體顏色

VFD 的簡(jiǎn)單介紹

VFD 是指真空熒光顯示器,是 Vacuum Fluorescent Display 的縮寫(xiě),利用電子撞擊玻璃基板上的熒光粉而發(fā)光,通過(guò)VFD上面的各個(gè)亮點(diǎn)的組合一起發(fā)亮來(lái)顯示字符,數(shù)字,特定的圖標(biāo)等等。由于VFD的顯示,清晰 明亮 低工耗等特點(diǎn)被廣泛用于家用電器,儀器設(shè)備,自動(dòng)動(dòng)化設(shè)備等上面,用來(lái)顯示數(shù)字信息如溫度,字符信息 如:名稱 和一些標(biāo)記指示信息。有關(guān)VFD的硬件結(jié)構(gòu),工作原理,在網(wǎng)上有很多的介紹,在官方網(wǎng)站可以很容易的找到非常準(zhǔn)確的介紹。VFD原理及使用請(qǐng)?jiān)诒菊鞠螺d

DVD視盤機(jī)的VFD顯示典型硬件電路

VFD的硬件電路可根據(jù)VFD屏的SPEC了解其需要驅(qū)動(dòng)的段,位,選擇相應(yīng)的驅(qū)動(dòng)IC,常用的包括PT6312,PT6311,PT6311相對(duì)驅(qū)動(dòng)的段,位多些,可連接的按鍵也多些。驅(qū)動(dòng)電路的外圍元件參數(shù)參照PT6311,PT6312的SPEC即可,需要注意的是,6312,6311有很多品牌均可通用,不同品牌的驅(qū)動(dòng)注意其振蕩電阻阻值的差異,其余基本相同,另外在電路半設(shè)計(jì)中驅(qū)動(dòng)電壓+5V的去藕電容盡量靠近IC,驅(qū)動(dòng)數(shù)據(jù)線(DATA,STB,CLK)各連接一個(gè)101瓷片到地,保證IC,數(shù)據(jù)線不受干擾或減輕干擾。

VFD顯示屏的供電

VFD顯示屏的供電包括交流~3V3燈絲電壓和驅(qū)動(dòng)芯片需要的-21V~-27V以及+5V,上圖是典型的變壓器次級(jí)供電處理電路。
還有一種方法是用直流逆變得到或者使用開(kāi)關(guān)電源,現(xiàn)在市場(chǎng)上很多專門的DVD開(kāi)關(guān)電源,滿足DVD解碼板以及VFD顯示的電源要求,電源組包括:+5V,±12V,-21V,~3V3,有些還帶常用集成功放的電源,使用他們也非常方便。筆者設(shè)計(jì)的TOPAV-2008開(kāi)發(fā)平臺(tái),其VFD供電采用了直流逆變交流的方式,結(jié)構(gòu)非常簡(jiǎn)潔,使用方便,詳細(xì)可到單片機(jī)音響技術(shù)網(wǎng)了解。

VFD 的軟件控制驅(qū)動(dòng)設(shè)計(jì)

前面說(shuō)過(guò)VFD用途廣泛,所以就非常有必要搞清楚如何通過(guò)軟件去驅(qū)動(dòng)它了,怎樣讓VFD顯示我們要顯示的內(nèi)容,這就是一個(gè)程序員要思考的問(wèn)題了,也是本文的目力所在。市場(chǎng)上有很多電子產(chǎn)品都要用到VFD,其中目前比較火熱的數(shù)字電視,機(jī)頂盒(DVB)還有DVD上面都在使用VFD顯示。要想讓VFD正常的工作還要依賴一個(gè)工作的平臺(tái),比如說(shuō),你是在 Sunplus平臺(tái)上,還是在Cheertek,Ali,ST,MTK,ESS的等平臺(tái)上做。要讓程序能高效的工作,并且具備最大可能性的移植和擴(kuò)展性是非常重要的,例如讓一個(gè)VFD的驅(qū)動(dòng)模塊同時(shí)可以在 Sunplus,cheertek,Ali等多個(gè)平臺(tái)上工作,也可以能在其它單片機(jī)上工作,只要它能支持 C語(yǔ)言編程。為了讓整個(gè)模塊更加的模塊化,我們就需要對(duì)整個(gè)模塊進(jìn)行進(jìn)一步的細(xì)份。哎!廢話少說(shuō),太激動(dòng)了。

驅(qū)動(dòng)三步走

我們把VFD的驅(qū)動(dòng)分成三步或三部分來(lái)實(shí)現(xiàn),各個(gè)部分實(shí)現(xiàn)相應(yīng)的功能:

第一步:上層接口,用于適應(yīng)市場(chǎng)上不同公司和種類的VFD。
第二步:中間層 ,VFD各中顯示功能的的實(shí)現(xiàn),用語(yǔ)滿足顯示需求。例如:一般顯示,閃動(dòng), 滾動(dòng),旋轉(zhuǎn),等....
第三步:平臺(tái)接口,用于實(shí)現(xiàn)和各個(gè)平臺(tái)之間的接口,主要是和CPU的通信。
基于上面的構(gòu)想,下面就來(lái)分步實(shí)現(xiàn)它

簡(jiǎn)單的介紹一下實(shí)現(xiàn)環(huán)境:

編譯環(huán)境:GCC

語(yǔ)言 :C

測(cè)試平臺(tái):Cheertek(CT219,909),和Ali(Ali3330,3329)(DVB的外部顯示,用來(lái)顯示電臺(tái)名稱等等…)

VFD硬件:CS16312。

第一步:建立通用接口:用于適應(yīng)市場(chǎng)上不同公司和種類的VFD 8段編碼在開(kāi)始寫(xiě)成程序?qū)崿F(xiàn)之前,先了解字符顯示的原理,字符是根據(jù)8段編碼的方式在VFD上面顯示的,當(dāng)然也有更多段的編碼方式。8段編碼用一個(gè)字節(jié)來(lái)描述一個(gè)ASCII字符,對(duì)擴(kuò)展的ASCII 碼如包含德語(yǔ),法語(yǔ)等就要用到更多段的編碼,也就是用多個(gè)字節(jié)來(lái)表示一個(gè)字符。

在一個(gè)八段編碼的VFD中,把8段分別定義為 a,b,c,d,e,f,g,h段,用一個(gè)字節(jié)來(lái)表示就是
h g f e d c b a
h是字節(jié)的最高位,a是字節(jié)的最低位。
顯示字符的原理如下:

VFD常用字母的寫(xiě)法
“米”字8和8的區(qū)別請(qǐng)注意有不同根據(jù)上面的原理,0 表示熄滅,1 表示點(diǎn)亮,可以得出,8段分別點(diǎn)亮后的對(duì)應(yīng)編碼是:

8段的每一段對(duì)應(yīng)一個(gè)字節(jié)的一個(gè)位的:

h : 1000 0000 ---> 0x80
g : 0100 0000 ---> 0x40
f : 0010 0000 ---> 0x20
e : 0001 0000 ---> 0x10
d : 0000 1000 ---> 0x08
c : 0000 0100 ---> 0x04
b : 0000 0010 ---> 0x02
a : 0000 0001 ---> 0x01
根據(jù)上面的每段編碼,如果要顯示字符 'A' 需要同時(shí)點(diǎn)亮a,b,c,e,f,g段并且d段熄滅,這樣一個(gè) 'A' 的字符輪廓就出來(lái)了,如上圖”AbCd”中的'A',所以的字母A的編碼是0111 0111 也就是把相應(yīng)要點(diǎn)亮的段編碼或起來(lái)就可以了'A'的編碼值 = a|b|c|e|f|g 各個(gè)段的對(duì)應(yīng)關(guān)系如下:

7 6 5 4 3 2 1 0
h g f e d c b a
0 1 1 1 0 1 1 1

通過(guò)上面的分析可以在程序中用如下宏來(lái)重新定義VFD的8段

#define SEG_A 0x01
#define SEG_B 0x02
#define SEG_C 0x04
#define SEG_D 0x08
#define SEG_E 0x10
#define SEG_F 0x20
#define SEG_G 0x40
#define SEG_H 0x80
通過(guò)上面的分析和段定義可以為字符'A' 做如下定義:

#define CHAR_A SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G

根據(jù)上面的分析定義,我可以為26個(gè)字母,和10個(gè)數(shù)字字符做完整的定義 如下:

#define NUM_0 SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F
#define NUM_1 SEG_B|SEG_C
#define NUM_2 SEG_A|SEG_B|SEG_D|SEG_E|SEG_G
#define NUM_3 SEG_A|SEG_B|SEG_C|SEG_D|SEG_G
#define NUM_4 SEG_B|SEG_C|SEG_F|SEG_G
#define NUM_5 SEG_A|SEG_C|SEG_D|SEG_F|SEG_G
#define NUM_6 SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
#define NUM_7 SEG_A|SEG_B|SEG_C
#define NUM_8 SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
#define NUM_9 SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G

#define CHAR_A SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G
#define CHAR_a CHAR_A
#define CHAR_B SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
#define CHAR_b CHAR_B
#define CHAR_c SEG_D|SEG_E|SEG_G
#define CHAR_C SEG_A|SEG_D|SEG_E|SEG_F
#define CHAR_d SEG_B|SEG_C|SEG_D|SEG_E|SEG_G
#define CHAR_D CHAR_d
#define CHAR_E SEG_A|SEG_D|SEG_E|SEG_F|SEG_G
#define CHAR_e CHAR_E
#define CHAR_F SEG_A|SEG_E|SEG_F|SEG_G
#define CHAR_f CHAR_F
#define CHAR_g NUM_9
#define CHAR_G NUM_9
#define CHAR_H SEG_B|SEG_C|SEG_E|SEG_F|SEG_G
#define CHAR_h CHAR_H
#define CHAR_I NUM_1
#define CHAR_i NUM_1
#define CHAR_L SEG_D|SEG_E|SEG_F
#define CHAR_l CHAR_L
#define CHAR_N SEG_A|SEG_B|SEG_C|SEG_E|SEG_F
#define CHAR_n SEG_B|SEG_C|SEG_E|SEG_F|SEG_H
#define CHAR_O NUM_0
#define CHAR_o SEG_C|SEG_D|SEG_E|SEG_G
#define CHAR_P SEG_A|SEG_B|SEG_E|SEG_F|SEG_G
#define CHAR_p LETT_P
#define CHAR_r SEG_E|SEG_G
#define CHAR_R CHAR_r
#define CHAR_S SEG_A|SEG_C|SEG_D|SEG_F|SEG_G
#define CHAR_t SEG_D|SEG_E|SEG_F|SEG_G
#define CHAR_T LETT_t
#define CHAR_U SEG_B|SEG_C|SEG_D|SEG_E|SEG_F
#define CHAR_Y SEG_B|SEG_C|SEG_D|SEG_F|SEG_G
#define CHAR_G SEG_G
#define CHAR_BLANK 0x00
上面為基本的字符數(shù)字都做了編碼定義,以后就可以通過(guò)編碼來(lái)指代這些字符,如一個(gè)字符串 “Hello world” 等于 CHAR_H+CHAR_e+CHAR_l+CHAR_l+CHAR_BLANK+CHAR_w+CHAR_O

CHAR_r+CHAR_l+CHAR_d.
用數(shù)組表示:

char str_hw[11]={CHAR_H,CHAR_e,CHAR_l,CHAR_l,CHAR_BLANK,CHAR_w,CHAR_O
CHAR_r,CHAR_l,CHAR_d};

顯示原理

到目前為止,我們還只是對(duì)基本字符和數(shù)字進(jìn)行了邏輯上的編碼,和怎樣生成一個(gè)字符串,這些多還僅僅是個(gè)開(kāi)始,要想在VFD上面顯示”hello world” 還有很多事情要做,接下來(lái)我們就要了解 VFD是如何顯示字符的。
VFD要顯示字符還要通過(guò)一塊VFD驅(qū)動(dòng)芯片來(lái)實(shí)現(xiàn),VFD本身只能顯示就像電腦的顯示器一樣,要想讓它顯示內(nèi)容還要通過(guò)驅(qū)動(dòng)芯片加上周邊驅(qū)動(dòng)電路共同來(lái)完成顯示的任務(wù)。在DVB,DVB和其它用到VFD的電子產(chǎn)品中都會(huì)有一塊VFD的電路板,通常叫VFD板(VFD panel)或前面板(Front panel)這塊電路板就是由VFD驅(qū)動(dòng)芯片,周邊驅(qū)動(dòng)電路和VFD組成。在目前的市場(chǎng)中VFD驅(qū)動(dòng)芯片種類很多,但標(biāo)準(zhǔn)一樣。VFD通過(guò)驅(qū)動(dòng)電路與驅(qū)動(dòng)芯片相連,來(lái)完成驅(qū)動(dòng)芯片的顯示任務(wù),而驅(qū)動(dòng)芯片的的任務(wù)是通過(guò)平臺(tái)系統(tǒng)(如 Ali的 3329主芯片)獲得的。在實(shí)際的編程過(guò)中,只需要通過(guò)平臺(tái)系統(tǒng)上的主芯片(CPU)來(lái)控制VFD板上的驅(qū)動(dòng)芯片從而完成一個(gè)顯示任務(wù),或其他任務(wù),平臺(tái)系統(tǒng)上的主芯片(CPU)一般是通過(guò)一個(gè)標(biāo)準(zhǔn)的三線串口來(lái)與VFD驅(qū)動(dòng)芯片連接。上面簡(jiǎn)單的介紹了主板CPU,驅(qū)動(dòng)芯片和VFD之間的關(guān)系,具體的細(xì)節(jié)可以在相應(yīng)的DATA SHEET或spec.中找到,或從硬件工程師那看到詳細(xì)的電路連接狀況,對(duì)相互協(xié)調(diào)工作就會(huì)有比較深刻的認(rèn)識(shí)。哎!又羅嗦了

透過(guò)CPU控制VFD驅(qū)動(dòng)芯片,VFD驅(qū)動(dòng)芯片(16312)的內(nèi)部框圖如下:

在上面的框圖中,可以看到一個(gè)顯示存儲(chǔ)器(Display RAM)正是通過(guò)這個(gè)顯示寄存器來(lái)實(shí)現(xiàn)顯示功能的,顯示寄存器中的一個(gè)字節(jié)可以描述一個(gè)字符,顯示寄存器中的一位映射到VFD顯示屏中的一個(gè)亮點(diǎn),也就是說(shuō)如果向顯示寄存器中的一個(gè)被映射的位寫(xiě) 1,那么在VFD顯示屏中的相應(yīng)的亮點(diǎn)就會(huì)被點(diǎn)亮,相反寫(xiě) 0 VFD顯示屏中的相應(yīng)的亮點(diǎn)就會(huì)被熄滅。通過(guò)向顯示寄存器中寫(xiě)入一個(gè)字節(jié),來(lái)顯示一個(gè)基本字符,寫(xiě)入若干個(gè)字節(jié)可以顯示一個(gè)字符串。顯示寄存器透過(guò)段位在芯片外引出引腳然后連到VFD上,顯示寄存器到VFD的映射就是這樣通過(guò)硬件連接來(lái)實(shí)現(xiàn)的,通常由于驅(qū)動(dòng)芯片的各個(gè)引腳可以根據(jù)自己的需要有選擇的選用,線路的連接會(huì)有細(xì)微的變化,使得VFD的各個(gè)亮點(diǎn)映射到顯示寄存器的具體的地址也會(huì)有一些細(xì)微差別,想要在VFD上任意位置為開(kāi)始顯示一個(gè)任意一個(gè)字符串,和點(diǎn)亮VFD上面的任意一點(diǎn),程序員必須就必須知道和計(jì)算出在一塊確定的VFD驅(qū)動(dòng)板上,VFD上的每個(gè)亮點(diǎn)映射到了顯示寄存器中的什么地址位,從而決定向顯示寄存器的什么地址寫(xiě)數(shù)據(jù),所以定義VFD上面的每個(gè)亮點(diǎn)在DISPLAY RAM中的地址,從右往左,VFD上面的所有亮點(diǎn)由若干個(gè)8段和icon組成:例如:

下面 N1_ 代表第一個(gè)8段

#define N1_SEG_A_ADDR 0x02
#define N1_SEG_A_DATA 0x04
//上面定義的意思是:
//1. 8段中 A 段在顯示寄存器中的字節(jié)地址即這個(gè)亮點(diǎn)映射到了顯示存儲(chǔ)器中的第幾個(gè)字// 節(jié) (例如 0x02 第二個(gè)字節(jié)).

//2. A段映射到顯示寄存器的某個(gè)字節(jié)的第幾位(例如:0x04 即 0000 0100 8位中的第//
三位,也就是有置 1 的位)
//上面的定義描述了,從左往右,VFD第一個(gè)8段中的
A段映射到顯示寄存器中第2個(gè)字節(jié)中的//第三位,也就說(shuō),如果把顯示寄存器中的第二個(gè)字節(jié)中的第三位置
1,那么VFD第一個(gè)8段中//的 A段就會(huì)被點(diǎn)亮,即向顯示寄存器中的 N1_SEG_A_ADDR 地址處 寫(xiě)入N1_SEG_A_DATA。

//下面可以依次定義VFD上面的各個(gè)亮點(diǎn)和ICON。
//注意:關(guān)于宏定義的值(如:0x02,0x04)從哪里來(lái),將會(huì)在后面講到,其實(shí)是要再寫(xiě)程序//來(lái)測(cè)試出各個(gè)亮點(diǎn)對(duì)應(yīng)的地址,或從相關(guān)SPEC中得到。驅(qū)動(dòng)完成以后,對(duì)于不不同的VFD只//要添上值就可以了。

#define N1_SEG_B_ADDR 0x02
#define N1_SEG_B_DATA 0x08

#define N1_SEG_C_ADDR 0x02
#define N1_SEG_C_DATA 0x40

#define N1_SEG_D_ADDR 0x03
#define N1_SEG_D_DATA 0x08

#define N1_SEG_E_ADDR 0x03
#define N1_SEG_E_DATA 0x04

#define N1_SEG_F_ADDR 0x03
#define N1_SEG_F_DATA 0x40

#define N1_SEG_G_ADDR 0x03
#define N1_SEG_G_DATA 0x30

#define N1_SEG_H_ADDR 0x00
#define N1_SEG_H_DATA 0x00

............................

// Icon Define
#define VFD_TITLE_ADDR 0x00
#define VFD_TITLE 0x00

#define VFD_CHAPTER_ADDR 0x00
#define VFD_CHAPTER 0x00

#define VFD_HOUR_ADDR 0x00
#define VFD_HOUR 0x00
#define VFD_HOUR_COL_ADDR 0x02
#define VFD_HOUR_COL 0x01

...............................

上面對(duì)VFD上的各個(gè)亮點(diǎn)做了定義,但我們還需要建立一個(gè)映射表方便在調(diào)用各個(gè)段定義。

BYTE ADDRESS_MAPPING[] =

{ N1_SEG_A_ADDR, N1_SEG_B_ADDR, N1_SEG_C_ADDR, N1_SEG_D_ADDR,N1_SEG_E_ADDR,
N1_SEG_F_ADDR,N1_SEG_G_ADDR,0,
N1_SEG_A_DATA, N1_SEG_B_DATA, N1_SEG_C_DATA, N1_SEG_D_DATA,N1_SEG_E_DATA,
N1_SEG_F_DATA,N1_SEG_G_DATA,0,

.................
.................
};
根據(jù)三部分的驅(qū)動(dòng)設(shè)計(jì)思想,我們把VFD驅(qū)動(dòng)芯片通過(guò)串行接口與CPU的通信劃分到整個(gè)驅(qū)動(dòng)設(shè)計(jì)的第三部分,第一步所要做的是建立一個(gè)邏輯上與硬件無(wú)關(guān)公共接口。根據(jù)上面對(duì)顯示寄存器的分析,我們可以建立一個(gè)數(shù)組用來(lái)映射驅(qū)動(dòng)芯片中的顯示寄存器,上面的 16 X 11 顯示存儲(chǔ)器可以顯示 22 個(gè)字節(jié),所以我們可以做如下定義:

BYTE 16312_DisplayRam[22];

第二步:中間層 :VFD各種顯示功能的的實(shí)現(xiàn),用于滿足顯示需求。
在這部分主要根據(jù)第一層的公共接口和在第三層的驅(qū)動(dòng)的基礎(chǔ)上來(lái)實(shí)現(xiàn)VFD的各種顯示功能,所以這部分主要是調(diào)用第三層的驅(qū)動(dòng)函數(shù)來(lái)處理第一層的數(shù)據(jù),或著說(shuō)是將第一層的信息根據(jù)顯示需求通過(guò)第三層發(fā)送給VFD驅(qū)動(dòng)芯片中去。對(duì)于一個(gè)VFD首先要具備對(duì)一個(gè)條信息的基本顯示功能,下面將介紹如何顯示一個(gè)字符串”Hello world”,要想同時(shí)完全顯示這個(gè)字符串,首先VFD上面必須要有11個(gè)8段,就是硬件支持同時(shí)顯示11個(gè)字符的VFD,如果不夠后面的字符就回丟失。

實(shí)現(xiàn)一個(gè)過(guò)程將字符串解析到 16312_DisplayRam 中。

void ParseStringToRamMapping(char *Str,BYTE Strcount)
{
BYTE i,j;
for(i=0;i {
for(j=0;j<8;j++)
{
if(Str[i+1] & (0x01 << j))
16312_DisplayRam[ ADDRESS_MAPPING[i*16+j] ] |= ADDRESS_MAPPING[i*16+8+j];
else
16312_DisplayRam[ ADDRESS_MAPPING[i*16+j] ] &= ~ADDRESS_MAPPING[i*16+8+j];
}
}
}

//得到當(dāng)前在VFD上正在顯示的信息
void ParseRamMappingToString()
{

}
//將"Hello world"解析到16312_DisplayRam中。
ParseStringToRamMapping(str_hw,11);

//將 16312_DisplayRam 寫(xiě)到 VFD的RAM中去。
Write_Datas(16312_DisplayRam,NULL,22);
在主程序 polling的時(shí)候 呼叫Write_Datas方法將16312_DisplayRam最終寫(xiě)到VFD驅(qū)動(dòng)芯片的顯示RAM中之后,在調(diào)用 Start_VFD();VFD上就會(huì)顯示出 “Hello world” 了。

在第二層中的內(nèi)容主要是顯示功能的實(shí)現(xiàn)和邏輯控制,程序?qū)懫饋?lái)可以根據(jù)實(shí)際需求靈活多變,而第一部分和第三部分的內(nèi)容則相對(duì)穩(wěn)定。所以也可以實(shí)現(xiàn)類似下面的函數(shù)來(lái)實(shí)時(shí)控制VFD的顯示:

void ShowMessagesOnVFD(char *Str,BYTE Strcount)
{
ParseStringToRamMapping(Str, Strcount);
Write_Datas(16312_DisplayRam,NULL,22);
Start_VFD();
}
或者
void PrintMessagesOnVFD(char *Str,BYTE Strcount)
{
ParseStringToRamMapping(Str, Strcount);
Write_Datas(16312_DisplayRam,NULL,22);
Start_VFD();
}

第三步:平臺(tái)接口:用于實(shí)現(xiàn)和各個(gè)平臺(tái)之間的接口,主要是和CPU的通信。
在第三部分主要實(shí)現(xiàn)CPU與VFD驅(qū)動(dòng)芯片通過(guò)串行接口通信的問(wèn)題。
CPU通過(guò)串行接口控制VFD的關(guān)閉和顯示,VFD的亮度,顯示存儲(chǔ)器的讀寫(xiě),按鍵掃描等。在上面的圖中可以看到,串口有四線,STB,CLK,Din,Dout但在實(shí)際電路中 Din和Dout連接在一起使用,所有又叫三線串口。

STB :片選信號(hào)線 在上升或下降沿初始化串行接口隨后等待接收
指令STB 為低后的第一個(gè)字節(jié)作為指令,當(dāng)處
理指令時(shí)當(dāng)前其它處理被終止,當(dāng)STB 為高
時(shí)CLK被忽略。

CLK :時(shí)鐘信號(hào)線。在上升沿讀取串行數(shù)據(jù)下降沿輸出數(shù)據(jù)。
Din :數(shù)據(jù)輸入。
Dout :數(shù)據(jù)輸出。
串口通信 和 GPIO

了解VFD 用到的 IO 口,通過(guò)一臺(tái)整機(jī)的電路圖,或從PCB板上用萬(wàn)能表測(cè)出VFD串行接口連接到CPU上的引腳,然后根據(jù)CPU的SPEC得到映射到的IO接口,完整的說(shuō)應(yīng)該是GPIO(General Purpose Input/Output的縮寫(xiě)即通用輸入輸出接口,支持 I2C, 串行總線等協(xié)議 )。

如:Ali 3330
#define GPIO_VFD_STB 17
#define GPIO_VFD_SDA 22 //Din 和 Dout
#define GPIO_VFD_CLK 16

上面的定義可以理解為:VFD STB 連接到了 主板CPU 上的IO 17
VFD SDA 連接到了 主板CPU 上的IO 22
VFD CLK 連接到了 主板CPU 上的IO 16
知道了連接所用的IO后,就可以同過(guò)VFD串行接口向VFD驅(qū)動(dòng)芯片發(fā)送收據(jù)和控制信息,向顯示寄存器,鍵掃寄存器讀寫(xiě)數(shù)據(jù)但,但首先要能夠通過(guò)軟件控制各個(gè)IO接口,也就是可以通過(guò)軟件設(shè)置各個(gè)GIO的電位,例如:把 GPIO 17 拉高到+5伏,或拉低到-5伏,如果有確定的平臺(tái)系統(tǒng),則相應(yīng)的平臺(tái)會(huì)提供相應(yīng)的GPIO操作接口

例如 Cheertek909
HAL_WriteGPIO(GPIO_VFD_STB,1); //向PGIO 17 寫(xiě) 1 輸出高電位
HAL_WriteGPIO(GPIO_VFD_STB,0); //向PGIO 17 寫(xiě) 0 輸出低電位
HAL_ReadGPIO(GPIO_VFD_SDA)?1:0; //讀GPIO

Ali3330

#define HAL_GPIO_BIT_SET(pos, val) \
do {osal_interrupt_disable(); \
((pos < 32) \
? HAL_GPIO_WRITE((HAL_GPIO_READ() & ~(1 << (pos))) | ((val) << (pos))) \
: HAL_GPIO1_WRITE((HAL_GPIO1_READ() & ~(1 << (pos - 32))) | ((val) << (pos - 32)))); \
osal_interrupt_enable(); \
} while (0)

如沒(méi)有完成的平臺(tái)系統(tǒng),沒(méi)有GPIO接口,就需要首先根據(jù)CPU的SPEC,實(shí)現(xiàn)GPIO的輸入輸出子程序,這部分程序因主IC不同而不同,也不是本文討論的重點(diǎn)。

例如: Cheertek909

void HAL_WriteGPIO(BYTE bGroup, DWORD dwPort, BYTE bValue)
{
.............
dwDesiredPort = (dwDesiredPort << 8);
.............
REG_PLAT_GPA_IO_DIR_CONTROL &= ~(dwDesiredPort);
............
}
// 909S: define GPIO registers
#define REG_PLATFORM_GPIO_BASE (IO_START+0x330)
// 80000330
#define REG_PLAT_GPA_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x00))) //
0330 (909S)
#define REG_PLAT_GPA_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x04))) //
0334 (909S)
#define REG_PLAT_GPA_IO_DIR_CONTROL (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x08))) //
0338 (909S)
#define REG_PLAT_GPIO_INT_CONFIGURATION (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x0c))) //
033c
#define REG_PLAT_GPCDE_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x10))) //
0340 (909S)
#define REG_PLAT_GPCDE_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x14))) //
0344 (909S)
#define REG_PLAT_GPCDE_IO_DIR_CONTROL (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x18))) //
0348 (909S)
#define REG_PLAT_GPF_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x1c))) //
034c (909S)
#define REG_PLAT_GPF_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x20))) //
0360 (909S)
通過(guò)上面的了解,假設(shè)現(xiàn)在用的是 ALI的平臺(tái),我們就可以定義如下的宏來(lái)操作GPIO的狀態(tài)

#Define ALI_SET_GPIO_HEIGHT(GPIO) \
HAL_GPIO_BIT_SET(GPIO,1)
#Define ALI_SET_GPIO_LOW(GPIO) \
HAL_GPIO_BIT_SET(GPIO,0)
接下來(lái)我們就可以測(cè)試上面的代碼了,可以分別對(duì)三個(gè)GPIO分別輸出高低電位,然后用示波器觀察波形,是否正確。如果工作正常,接下來(lái)就可以根據(jù)串行協(xié)議實(shí)現(xiàn)數(shù)據(jù)傳輸了。其中主要實(shí)現(xiàn)兩個(gè)函數(shù),一次傳輸一個(gè)二進(jìn)制位即一個(gè)BIT和一次傳輸一個(gè)字節(jié)。

從圖中可以看出,根據(jù)串行協(xié)議,在傳輸開(kāi)始要用STB選通,讓STB進(jìn)入低電位狀態(tài),說(shuō)明串口數(shù)據(jù)傳輸開(kāi)始,CLK有效,SDA上的數(shù)據(jù)有效果,為高電位,傳輸終止SDA,SDA無(wú)效,當(dāng)STB從一個(gè)低電位到一個(gè)高電位的過(guò)程中,SDA傳輸一個(gè)或多字節(jié),SCK為高電位時(shí)即上升沿時(shí),SDA接收數(shù)據(jù)即CPU向VFD CHIP DRIVER寫(xiě)入數(shù)據(jù),SDA傳輸一個(gè)BIT。STB控制信號(hào)控制字節(jié)的傳輸,SCK時(shí)鐘信號(hào)控制位的傳輸,一個(gè)STB周期,傳輸一個(gè)或多個(gè)字節(jié),一個(gè)CLK周期為一個(gè)BIT的讀寫(xiě)信號(hào)。根據(jù)上面的分析,我們可以寫(xiě)出如下代碼:

寫(xiě)一個(gè)位:
ALI_SET_GPIO_LOW(GPIO_VFD_CLK);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_SDA);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_CLK);

寫(xiě)入一個(gè)字節(jié):

void Write_OneByte(BYTE bValue)
{
BYTE i=0;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //傳輸多個(gè)字節(jié),STB控制移到函數(shù)外,即傳輸

//沒(méi)有終止。
for(i=0;i<8;i++)
{
ALI_SET_GPIO_LOW(GPIO_VFD_CLK);
if(bValue & 0x01)
ALI_SET_GPIO_HEIGHT(GPIO_VFD_SDA);
else
ALI_SET_GPIO_Low(GPIO_VFD_SDA);

ALI_SET_GPIO_HEIGHT(GPIO_VFD_CLK);
bValue>>=1;
}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB); //傳輸多個(gè)字節(jié),STB控制移到函數(shù)外。

}

一次傳輸多個(gè)字節(jié):
void Write_Datas(BYTE bcount,BYTE *pBValue)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB);
for(i=0;i {
Write_OneByte(pBValue[bcount]);

}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
}
上面的代碼實(shí)現(xiàn)了如何根據(jù)串口協(xié)議傳輸數(shù)據(jù)即向串口發(fā)送數(shù)據(jù)的過(guò)程,但這還不是一個(gè)完整的傳輸過(guò)程,一個(gè)完整的數(shù)據(jù)傳輸過(guò)程應(yīng)該是,一個(gè)具體的數(shù)據(jù)塊從一個(gè)地方傳輸?shù)揭粋(gè)指定的地方,一般數(shù)據(jù)的傳輸都是從一個(gè)芯片中的一個(gè)寄存器傳輸?shù)搅硪粋(gè)寄存器或從RAM的一個(gè)地方到另一個(gè)地方,和從不同芯片中的不同寄存器互相傳輸,通信協(xié)議用的最多的是 I2C協(xié)議這里重點(diǎn)是串口協(xié)議,無(wú)論用什么協(xié)議,多需要知道目地地址,這些都可以從相關(guān)芯片SPEC中得到,在串行協(xié)議中,一個(gè)STB的上升或下降沿初始化串行接口,當(dāng)STB為低電位后,CLK有效,SDA開(kāi)始接收數(shù)據(jù)并且第一個(gè)字節(jié)為指令。有關(guān)16312的個(gè)指令定義如下:

#define COMMAND_WRITEDISPLAY 0x40

#define COMMAND_READKEY 0x42

#define COMMAND_ADDRESS 0xc0

#define COMMAND_DISP_MODE 0x02

#define COMMAND_CTRL_MODE 0x8f

//重寫(xiě)上面的函數(shù)
void Write_Datas(BYTE *pSour,BYTE *pDest,BYTE bcount)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已經(jīng)在下降沿,移去
Write_OneByte(COMMAND_WRITEDISPLAY);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已經(jīng)在下降沿,移去
Write_OneByte(COMMAND_ADDRESS); //參數(shù)也可以由pDest取得
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
ALI_SET_GPIO_LOW(GPIO_VFD_STB);
for(i=0;i {
Write_OneByte(pBValue[bcount]);

}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
}
//設(shè)置VFD工作模式,和開(kāi)啟VFD。
void Start_VFD(void)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已經(jīng)在下降沿,移去
Write_OneByte(COMMAND_DISP_MODE);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}

ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已經(jīng)在下降沿,移去
Write_OneByte(COMMAND_DISP_MODE);
ALI_SET_GPIO_HEIGHT(COMMAND_CTRL_MODE);
for(i=0;i<4;i++){}

}
到現(xiàn)在我們已基本實(shí)現(xiàn)了串行通信的部分基本功能主要是向串口發(fā)送數(shù)據(jù),接下來(lái)將實(shí)現(xiàn)如何從串行總線上接收數(shù)據(jù)另外有關(guān)VFD的各種顯示功能將在第二部分實(shí)現(xiàn)。

VFD驅(qū)動(dòng)的完整代碼文件
詳見(jiàn)單片機(jī)音響技術(shù)網(wǎng)TOPAV-2008配套程序(51匯編代碼)

一些常用VFD驅(qū)動(dòng)IC的SPEC請(qǐng)?jiān)诒菊臼醉?yè)下載
VFD串行通信的其他擴(kuò)展功能

  • 上一篇: DS18B20溫度計(jì)制作詳細(xì)全過(guò)程
  • 下一篇: 51單片機(jī)用PWM控制LED漸亮與漸滅
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1