基于串行同步接口的數(shù)碼管顯示電路_第1頁
基于串行同步接口的數(shù)碼管顯示電路_第2頁
基于串行同步接口的數(shù)碼管顯示電路_第3頁
基于串行同步接口的數(shù)碼管顯示電路_第4頁
基于串行同步接口的數(shù)碼管顯示電路_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第5章 基于串行同步接口的數(shù)碼管顯示電路目標(biāo)通過本章的學(xué)習(xí),應(yīng)掌握以下知識(shí) 同步串行接口的工作過程 數(shù)字電路器件功能表的使用 數(shù)字電路時(shí)序圖的使用 時(shí)序電路的觸發(fā)方式 利用移位寄存器將串行格式數(shù)據(jù)轉(zhuǎn)換為并行格式數(shù)據(jù) 位操作運(yùn)算符 多位數(shù)碼管的顯示電路 具有多個(gè)數(shù)位的數(shù)據(jù)分離為多個(gè)1位數(shù)據(jù)引言計(jì)算機(jī)的數(shù)據(jù)傳輸方式分為并行數(shù)據(jù)傳輸和串行數(shù)據(jù)傳輸兩種方式。并行數(shù)據(jù)接口具有理解工作過程簡單、數(shù)據(jù)傳輸速率快等優(yōu)點(diǎn),但是這種方式對芯片的管腳資源占用較多。上一章使用并行數(shù)據(jù)接口驅(qū)動(dòng)數(shù)碼管,每一個(gè)數(shù)碼管的發(fā)光段需要占用一個(gè)微控制器管腳,每一個(gè)數(shù)碼管需要占用一個(gè)8位并行數(shù)據(jù)接口。串行數(shù)據(jù)接口雖然數(shù)據(jù)傳輸速率慢,

2、但是對芯片的管腳資源占用較少,例如使用同步串行接口只需要占用2個(gè)管腳即可。這2個(gè)管腳一個(gè)被用來傳輸數(shù)據(jù),另一個(gè)被用來傳輸同步時(shí)鐘。如果MSP430微控制器芯片采用同步串行接口輸出數(shù)碼管的顯示代碼,這樣雖然減少了對管腳資源的消耗,但是必須設(shè)法完成將數(shù)據(jù)的串行格式轉(zhuǎn)換為并行格式以滿足數(shù)碼管的要求。8位移位寄存器(串行輸入,并行輸出)74164是一種能夠?qū)崿F(xiàn)同步串行數(shù)據(jù)格式到8位并行數(shù)據(jù)格式轉(zhuǎn)換的器件。使用MSP430微控制器芯片的2個(gè)管腳實(shí)現(xiàn)同步串行接口,使用多個(gè)8位移位寄存器74164能夠支持多個(gè)數(shù)碼管的顯示驅(qū)動(dòng)。1個(gè)數(shù)碼管只能顯示1位數(shù)據(jù),對于一個(gè)具有多個(gè)數(shù)位的數(shù)據(jù)可以將它分解為多個(gè)1位數(shù)據(jù),

3、再使用多個(gè)數(shù)碼管完成這個(gè)數(shù)據(jù)的顯示。MSP430微控制器芯片內(nèi)部包含實(shí)現(xiàn)同步串行接口的外圍模塊,本章不使用這個(gè)外圍模塊。這里采用軟件的方法實(shí)現(xiàn)同步串行接口,這樣即能更好地理解接口的工作過程,又能練習(xí)應(yīng)用程序的設(shè)計(jì)。5.1 8位移位寄存器(串行輸入,并行輸出)74164串行接口的輸出數(shù)據(jù)不能直接送入數(shù)碼管,一個(gè)明顯的原因就是串行數(shù)據(jù)通過一條線輸出,而數(shù)碼管的工作則同時(shí)需要8個(gè)輸入信號(hào)。使用8位移位寄存器(串行輸入,并行輸出)74164芯片,同步串行信號(hào)能夠轉(zhuǎn)換成數(shù)碼管所需要的并行信號(hào)以滿足數(shù)碼管的需要。8位移位寄存器74164芯片的管腳排列圖如圖5.1所示。圖5.1 8位移位寄存器74164芯片

4、管腳排列圖8位移位寄存器(串行輸入,并行輸出)74164芯片的管腳A和B(管腳1和2)為串行數(shù)據(jù)輸入管腳,管腳CLK(管腳8)為串行時(shí)鐘輸入管腳。管腳Q0Q7(管腳36和管腳1013)為并行數(shù)據(jù)輸出管腳。管腳MR(管腳9)能夠強(qiáng)制8個(gè)并行數(shù)據(jù)輸出管腳都輸出0,即它們都為低電平。芯片的功能表用來描述它的功能以及工作過程。74164芯片的功能表如表5.1所示。表5.1 74164芯片的功能表輸 入輸 出MR CLK A B Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q70 0 0 0 0 0 0 0 01 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60 Q701 1 1 1 Q00 Q

5、10 Q20 Q30 Q40 Q50 Q601 0 0 Q00 Q10 Q20 Q30 Q40 Q50 Q601 0 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60由表5.1所示的74164芯片功能表,當(dāng)74164管腳MR為低電平時(shí),即寫入數(shù)據(jù)“0”,并行輸出管腳全部清零。這時(shí)芯片的輸出與它的輸入管腳狀態(tài)無關(guān)。在功能表中,其它輸入管腳的輸入狀態(tài)無影響用符號(hào)“”來表示。正常工作時(shí),管腳MR應(yīng)為高電平,即寫入數(shù)據(jù)“1”。當(dāng)時(shí)鐘輸入管腳為低電平時(shí),即寫入數(shù)據(jù)“0”,8個(gè)并行輸出管腳將保持它們的輸出狀態(tài)。當(dāng)時(shí)鐘上跳邊沿到來時(shí),用符號(hào)“”表示,如果管腳A和B都處于高電平狀態(tài),即它們同時(shí)都被送

6、數(shù)據(jù)“1”,這時(shí)這個(gè)數(shù)據(jù)“1”將被送到并行輸出管腳Q0對應(yīng)的觸發(fā)器,使得并行輸出管腳Q0呈現(xiàn)高電平,即輸出數(shù)據(jù)“1”。時(shí)鐘的前沿還將觸發(fā)以下工作,將并行輸出管腳Q0對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q1對應(yīng)的觸發(fā)器;將并行輸出管腳Q1對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q2對應(yīng)的觸發(fā)器; ;將并行輸出管腳Q6對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q7對應(yīng)的觸發(fā)器。當(dāng)時(shí)鐘上跳邊沿到來時(shí),用符號(hào)“”表示,如果管腳A和B任意一個(gè)處于低電平狀態(tài),即它們?nèi)我庖粋€(gè)被送數(shù)據(jù)“0”,這時(shí)這個(gè)數(shù)據(jù)“0”將被送到并行輸出管腳Q0對應(yīng)的觸發(fā)器,使得并行輸出管腳Q0呈現(xiàn)低電平,即輸出數(shù)據(jù)“0”。時(shí)鐘的前沿還觸發(fā)

7、以下工作,將并行輸出管腳Q0對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q1對應(yīng)的觸發(fā)器;將并行輸出管腳Q1對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q2對應(yīng)的觸發(fā)器; ;將并行輸出管腳Q6對應(yīng)的觸發(fā)器原有的數(shù)據(jù)移到并行輸出管腳Q7對應(yīng)的觸發(fā)器。利用74164芯片驅(qū)動(dòng)1位數(shù)碼管的應(yīng)用電路連線圖如圖5.2所示。該圖按照使用面包板組裝電路來進(jìn)行設(shè)計(jì)。74164芯片需要的輸入信號(hào),串行同步時(shí)鐘信號(hào)CLK和數(shù)據(jù)信號(hào)DATA,都將由MSP430微控制器芯片產(chǎn)生。圖 5.2 基于串行輸出口的數(shù)碼管顯示電路圖5.2中,管腳MR直接與電源連接,滿足電路正常工作的要求。電路中將管腳A和B連接在一起,這樣當(dāng)時(shí)鐘上跳邊沿,“

8、”,到來時(shí),無論數(shù)據(jù)為0,或者為1,它都能送到并行輸出管腳Q0。圖中實(shí)現(xiàn)串行數(shù)據(jù)格式到并行數(shù)據(jù)格式轉(zhuǎn)換器件的名稱在這里寫為74HC164。名稱中的HC表示這種芯片采用CMOS制造工藝,強(qiáng)調(diào)它的原因是采用這種制造工藝制作芯片的工作電壓為26V,與MSP430微控制器芯片的工作電壓,1.83.6V,基本兼容。將1個(gè)字節(jié)的8個(gè)數(shù)據(jù)位,在8個(gè)時(shí)鐘信號(hào)的作用下,逐個(gè)送入移位寄存器74HC164,就能夠?qū)⑼酱袀鬏敺绞降臄?shù)據(jù)格式轉(zhuǎn)換為并行數(shù)據(jù)格式。在這個(gè)逐個(gè)送入的過程中,移位寄存器74HC164的8個(gè)并行輸出管腳的狀態(tài)處于不斷地變化中,但是如果這個(gè)傳送過程很快,眼睛實(shí)際是分辨不出數(shù)碼管對應(yīng)的變化。如果在

9、完成1個(gè)字節(jié)的8個(gè)數(shù)據(jù)位傳送以后,不再有時(shí)鐘信號(hào)到來,移位寄存器74HC164的并行輸出管腳的狀態(tài)將保持不變,數(shù)碼管就處于穩(wěn)定地顯示狀態(tài)。微控制器芯片與數(shù)碼管之間采用串行同步數(shù)據(jù)傳送方式節(jié)省了輸入/輸出管腳資源,采用74HC164鎖存數(shù)據(jù)將實(shí)現(xiàn)數(shù)碼管的靜態(tài)顯示,不再需要微控制器對其進(jìn)行進(jìn)一步的管理,這時(shí)能夠使用微控制器完成其它任務(wù)。8位移位寄存器74HC164的上邊沿具有4個(gè)輸出管腳,下邊沿具有4個(gè)輸出管腳。數(shù)碼管也是的上邊沿具有4個(gè)輸入管腳,下邊沿具有4個(gè)輸入管腳。如圖5.1所示的電路連線圖,分別將74HC164的上邊沿的4個(gè)輸出管腳分別與數(shù)碼管的上邊沿的4個(gè)輸入管腳連接在一起,分別將74H

10、C164的下邊沿的4個(gè)輸出管腳分別與數(shù)碼管的下邊沿的4個(gè)輸入管腳連接在一起,這樣將使得電路連接變得簡單和整齊。按照圖5.1所示的電路連線圖,數(shù)碼管的各個(gè)管腳與8位移位寄存器74HC164管腳的連接關(guān)系如表5.2所示。表5.2 數(shù)碼管管腳與8位移位寄存器74HC164管腳的連接關(guān)系74HC164Q7Q6Q5Q4Q3Q2Q1Q0數(shù)碼管bafgedcdp以顯示數(shù)據(jù)“0”為例,現(xiàn)在數(shù)碼管需要除過發(fā)光段g和dp之外的其它發(fā)光段都被點(diǎn)亮,即需要8位移位寄存器74HC164的并行輸出管腳除過Q4和Q0以外都輸出高電平。這樣可以獲得按照圖5.1所示的電路連線圖,數(shù)據(jù)“0”的顯示代碼,它寫成2進(jìn)制數(shù)據(jù)格式為0b

11、,寫成16進(jìn)制數(shù)據(jù)格式為0xee。采用這種方法,可以非常方便地寫出其它數(shù)據(jù)的顯示代碼。硬件是軟件的基礎(chǔ)。數(shù)碼管接收的顯示代碼就是它的控制器件數(shù)字輸出端口的輸出數(shù)據(jù),兩者不同的連接關(guān)系將會(huì)具有不同的顯示代碼。建議采用方便的連接關(guān)系來組裝電路,因?yàn)榫帉戯@示代碼比在電路板上連線方便。5.2 同步串行接口的1位數(shù)碼管驅(qū)動(dòng)函數(shù)5.2.1 1位數(shù)碼管驅(qū)動(dòng)函數(shù)對于8位移位寄存器74HC164,在時(shí)鐘信號(hào)上升沿的作用下,1個(gè)串行數(shù)據(jù)位首先被移入并行輸出管腳Q0對應(yīng)的觸發(fā)器。當(dāng)有新的串行數(shù)據(jù)位再被移入并行輸出管腳Q0對應(yīng)的觸發(fā)器,原有的數(shù)據(jù)將被移入并行輸出管腳Q1對應(yīng)的觸發(fā)器。Q1原有的數(shù)據(jù)將被移入并行輸出管腳

12、Q2對應(yīng)的觸發(fā)器。將1個(gè)顯示代碼的8位數(shù)據(jù)位全部移入8位移位寄存器74HC164,需要在8個(gè)時(shí)鐘信號(hào)的作用下,這8位數(shù)據(jù)逐個(gè)送入移位寄存器74HC164。這個(gè)數(shù)據(jù)位的傳輸過程可以使用一種稱作為時(shí)序圖的圖形描述的方法進(jìn)行敘述。時(shí)序圖能夠直觀地給出所需要信號(hào)的變化情況以及信號(hào)之間的時(shí)間關(guān)系。按照74HC164的工作過程,當(dāng)需要輸出1位數(shù)碼管的顯示代碼,MSP430微控制器需要產(chǎn)生如圖5.3所示的控制時(shí)序。這里需要強(qiáng)調(diào)的是,首先應(yīng)該送出顯示代碼字節(jié)的最高位(Most Significant Bit,MSB),最后輸出最低位(Least Significant Bit,LSB)。圖5.3 同步串行數(shù)據(jù)

13、時(shí)序圖輸出1位數(shù)碼管的顯示代碼,MSP430微控制器需要分8次將顯示代碼的各位逐個(gè)送出。對于輸出顯示代碼的每一位,首先需要使輸出串行時(shí)鐘的管腳輸出低電平,預(yù)備產(chǎn)生串行時(shí)鐘的上升沿;接著使用串行數(shù)據(jù)管腳輸出顯示代碼的一位;最后使輸出串行時(shí)鐘的管腳輸出高電平,產(chǎn)生串行時(shí)鐘的上升沿。串行數(shù)據(jù)時(shí)序圖的每1位被畫成菱形形狀。菱形的上和下兩邊表示數(shù)據(jù)的2種可能取值,0和1。菱形的左右兩邊表示數(shù)據(jù)無論從0變成1,還是從1變成0,不能立即完成狀態(tài)轉(zhuǎn)換。這個(gè)原因是管腳電容的存在,使得它的電壓不能突變。圖5.3所示的同步串行數(shù)據(jù)時(shí)序圖顯示出數(shù)據(jù)必須在時(shí)鐘上升邊沿之后才能改變,這是必須的。按照74164芯片的功能表

14、,接著是先改變串行數(shù)據(jù),還是先將串行時(shí)鐘變?yōu)榈碗娖剑@個(gè)關(guān)系不大。編寫1位數(shù)碼管顯示代碼的驅(qū)動(dòng)函數(shù)的目的就是要在MSP430微控制器芯片扮演串行數(shù)據(jù)管腳和串行時(shí)鐘管腳上產(chǎn)生圖5.3所示的波形。這里給出采用同步串行接口方式輸出1位數(shù)碼管顯示代碼的驅(qū)動(dòng)函數(shù)。該函數(shù)使用P1.7管腳輸出串行數(shù)據(jù),使用P1.6管腳輸出串行同步時(shí)鐘。/ 驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)/ P1.7 數(shù)據(jù)管腳,P1.6 同步時(shí)鐘管腳void seg7_1ms(unsigned char seg7_data) unsigned char code_seg7; / 聲明顯示代碼變量code_seg7=

15、 decoder_seg7 seg7_data;/ 數(shù)據(jù)譯碼/ 同步串行接口初始化P1OUT&=BIT6; / P1.6 輸出低電平P1OUT&=BIT7; / P1.7 輸出低電平/ 逐位輸出1個(gè)字節(jié)的8個(gè)數(shù)據(jù)位/ 輸出第1位數(shù)據(jù)(MSB) / 產(chǎn)生數(shù)據(jù)信號(hào)if(code_seg7&0x80) P1OUT|=BIT7; / P1.7 輸出高電平else P1OUT&=BIT7; / P1.7 輸出低電平/ 產(chǎn)生同步時(shí)鐘信號(hào)P1OUT|=BIT6; / P1.6 輸出高電平P1OUT&=BIT6; / P1.6 輸出低電平/ 輸出第2位數(shù)據(jù)if(code_seg7&0x40) / 輸出第8位數(shù)

16、據(jù)(LSB) / 產(chǎn)生數(shù)據(jù)信號(hào)if(code_seg7&0x01) P1OUT|=BIT7; / P1.7 輸出高電平else P1OUT&=BIT7; / P1.7 輸出低電平/ 產(chǎn)生同步時(shí)鐘信號(hào)P1OUT|=BIT6; / P1.6 輸出高電平P1OUT&=BIT6; / P1.6 輸出低電平該驅(qū)動(dòng)函數(shù)具有1個(gè)參量,參量的數(shù)據(jù)類型為unsigned char數(shù)據(jù)類型。這個(gè)參量為數(shù)碼管將要顯示的數(shù)據(jù)。驅(qū)動(dòng)函數(shù)接收將要顯示的1位數(shù)據(jù),顯示數(shù)據(jù)在函數(shù)內(nèi)部完成譯碼。接著的2條語句把輸出串行同步時(shí)鐘的管腳P1.6 和輸出串行數(shù)據(jù)的管腳P1.7都配置為低電平,準(zhǔn)備開始傳送串行數(shù)據(jù)。 由于MSP430系

17、列微控制器不支持位尋址,因此需要利于邏輯運(yùn)算的方法來分離出來將要傳送的串行數(shù)據(jù)位的狀態(tài),再利用條件語句確定輸出串行數(shù)據(jù)的管腳狀態(tài)。首先應(yīng)該輸出顯示代碼的最高位。對于顯示代碼的最高位,在條件語句的條件表達(dá)式將顯示代碼和數(shù)據(jù)0x80相與,使得條件是否成立僅決定于顯示代碼最高位的狀態(tài)。if(code_seg7&0x80) / 輸出第一位數(shù)據(jù) P1OUT|=BIT7; / P1.7 輸出高電平 else P1OUT&=BIT7; / P1.7 輸出低電平 如果顯示代碼的最高位為1,則條件成立,串行數(shù)據(jù)輸出管腳置位;如果顯示代碼的最高位為0,則條件不成立,串行數(shù)據(jù)輸出管腳清零。由于在此之前已經(jīng)使串行同步

18、時(shí)鐘的管腳P1.6為低電平,這樣利用以下2條語句P1OUT|=BIT6; / P1.6 輸出高電平 P1OUT&=BIT6; / P1.6 輸出低電平就產(chǎn)生串行同步時(shí)鐘的前沿,并再次對串行同步時(shí)鐘輸出管腳進(jìn)行了清零,為產(chǎn)生下一個(gè)時(shí)鐘前沿做好準(zhǔn)備。這樣就完成1位數(shù)據(jù)的同步串行方式輸出。采用同樣的方法即可完成其余7位數(shù)據(jù)的同步串行方式輸出。按照同步串行方式輸出的顯示代碼送到8位移位寄存器74HC164,由它將其轉(zhuǎn)換為并行數(shù)據(jù)格式輸出到數(shù)碼管。5.2.2 利用循環(huán)語句簡化1位數(shù)碼管驅(qū)動(dòng)函數(shù)/ 驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)/ P1.7 數(shù)據(jù)管腳,P1.6 同步時(shí)鐘管腳vo

19、id seg7_1ms(unsigned char seg7_data) unsigned char code_seg7; / 聲明顯示代碼變量 unsigned char serial_number; / 聲明循環(huán)變量 unsigned char serial_shift; / 聲明串行數(shù)據(jù)位存儲(chǔ)變量 code_seg7=decoder_seg7seg7_data; / 顯示數(shù)據(jù)譯碼/ 同步串行接口初始化P1OUT&=BIT6; / P1.6 輸出低電平P1OUT&=BIT7; / P1.7 輸出低電平serial_shift=0x80; / 串行數(shù)據(jù)位指向 8 位數(shù)據(jù)的最高位 for(se

20、rial_number=0; serial_number1; / 串行數(shù)據(jù)位指向數(shù)據(jù)位右移 1 位 該函數(shù)利用循環(huán)語句,通過8次循環(huán)完成1個(gè)顯示代碼中的8個(gè)數(shù)據(jù)位按照同步串行的方式逐位送出。這里循環(huán)變量serial_number用來控制一個(gè)循環(huán)完成輸出數(shù)據(jù)位的個(gè)數(shù)。前面小節(jié)中,在能夠確定顯示代碼具體數(shù)位的情況下,通過顯示代碼和一個(gè)常量數(shù)據(jù),這個(gè)常量對應(yīng)數(shù)據(jù)位為“1”,其它數(shù)據(jù)位都為“0”,相與的方法獲得條件語句是否成立?,F(xiàn)在需要利用變量,下面表達(dá)式code_seg7&serial_shift可以獲得條件語句是否成立。串行數(shù)據(jù)位存儲(chǔ)變量serial_shift的初始值為0x80,指向顯示代碼的最

21、高位。在輸出顯示代碼的最高位以后,語句serial_shift=serial_shift1;使得串行數(shù)據(jù)位存儲(chǔ)變量serial_shift中的內(nèi)容右移1位,最高位補(bǔ)0。當(dāng)變量serial_shift的原來內(nèi)容為0x80,本條語句執(zhí)行后,變量serial_shift的內(nèi)容將變?yōu)?x40,指向到顯示代碼的次高位。在變量serial_shift的內(nèi)容變?yōu)?x40,在第二個(gè)循環(huán)中,條件語句就能夠根據(jù)顯示代碼次高位的狀態(tài)來確定輸出串行數(shù)據(jù)管腳的狀態(tài)。依次類推,循環(huán)語句每完成一次循環(huán),使得串行數(shù)據(jù)位存儲(chǔ)變量serial_shift中的內(nèi)容右移1位,最高位補(bǔ)0,為條件語句下一次的判斷做好準(zhǔn)備。小節(jié)5.2.1

22、中給出的1位數(shù)碼管驅(qū)動(dòng)函數(shù)雖然較長,但是直觀地描述了同步串行格式的一個(gè)字節(jié)數(shù)據(jù)的傳輸過程。本小節(jié)給出的1位數(shù)碼管驅(qū)動(dòng)函數(shù)結(jié)構(gòu)簡練,同時(shí)也能夠節(jié)省程序存儲(chǔ)器的資源。5.2.3 同步串行接口的1位數(shù)碼管演示程序程序示例5.1/ 程序名稱:seg1_1ms/ 程序功能:通過模擬同步串口控制 1 個(gè) 7 段共陰極數(shù)碼管/ P1.7 數(shù)據(jù)管腳,P1.6 同步時(shí)鐘管腳#include / 包含名稱定義和對應(yīng)地址或數(shù)據(jù)的頭函數(shù)void delay_1s(void); / 聲明 1s 延遲函數(shù)void seg7_1ms(unsigned char seg7_data);/ 聲明驅(qū)動(dòng) 1 位數(shù)碼管的驅(qū)動(dòng)函數(shù)co

23、nst unsigned char decoder_seg718= 0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6,0xde,0x3e,0x6c,0x9e,0x7c,0x78,0x00,0xff;/ 按表 5.2 所示連接關(guān)系共陰極數(shù)碼管顯示代碼int main(void) / 主函數(shù) unsigned char data_seg7; / 聲明顯示數(shù)據(jù)變量 WDTCTL=WDTPW+WDTHOLD; / 關(guān)閉看門狗 P1SEL&=BIT7; / 設(shè)置 P1.7 端口為并行數(shù)字輸入 / 輸出口 P1DIR|=BIT7; / 設(shè)置 P1.7 端口

24、為輸出口 P1SEL&=BIT6; / 設(shè)置 P1.6 端口為并行數(shù)字輸入 / 輸出口 P1DIR|=BIT6; / 設(shè)置 P1.6 端口為輸出口 while(1) / 重復(fù)執(zhí)行 for(data_seg7=0x00; data_seg70x10; data_seg7+)/ 利用循環(huán)語句產(chǎn)生顯示數(shù)據(jù) seg7_1ms(data_seg7);/ 調(diào)用驅(qū)動(dòng) 1 位數(shù)碼管的驅(qū)動(dòng)函數(shù) delay_1s( ); / 調(diào)用 1s 延遲函數(shù) void seg7_1ms(unsigned char seg7_data)/ 驅(qū)動(dòng) 1 位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)void delay_1s(void) /

25、1s 延遲函數(shù)比較程序示例5.1和程序示例4.2,這里增加了驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)。鑒于篇幅原因,程序中的所有函數(shù)的內(nèi)容沒有寫出,讀者在進(jìn)行程序編輯時(shí)必須將其內(nèi)容完整地輸入。數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)可以使用前面給出2種的任意一種。5.3 位運(yùn)算操作符位運(yùn)算操作符包括與、或、異或、非、位左移以及位右移。參與位運(yùn)算數(shù)據(jù)的數(shù)據(jù)類型可以是char、int和long。注意,float數(shù)據(jù)類型的數(shù)據(jù)不支持位運(yùn)算。 位與位與的運(yùn)算操作符號(hào)為“&”。運(yùn)算規(guī)則如下0 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1運(yùn)算規(guī)則可以總結(jié)為參加運(yùn)算的兩位都

26、為1,結(jié)果為1;只要有一位為0,結(jié)果為0。例如2個(gè)unsigned char數(shù)據(jù)類型數(shù)據(jù),x=0b,y=0b,它們位與的結(jié)果為x:y:& 位或位或的運(yùn)算操作符號(hào)為“|”。運(yùn)算規(guī)則如下0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1運(yùn)算規(guī)則可以總結(jié)為參加運(yùn)算的兩位都為0,結(jié)果為0;只要有一位為1,結(jié)果為1。例如2個(gè)unsigned char數(shù)據(jù)類型數(shù)據(jù),x=0b,y=0b,它們位與的結(jié)果為x:y:| 位異或位異或的運(yùn)算操作符號(hào)為“”。運(yùn)算規(guī)則如下0 0 = 00 1 = 01 0 = 11 1 = 0運(yùn)算規(guī)則可以總結(jié)為參加運(yùn)算的兩位的值相同,結(jié)果為0;兩位的值不同,結(jié)果為

27、1。例如2個(gè)unsigned char數(shù)據(jù)類型數(shù)據(jù),x=0b,y=0b,它們位與的結(jié)果為x:y: 位取非位取非是一個(gè)單目運(yùn)算符,用來對一個(gè)二進(jìn)制數(shù)據(jù)按位進(jìn)行取反。它的運(yùn)算操作符號(hào)為“”。運(yùn)算規(guī)則如下0 = 01 = 0運(yùn)算規(guī)則可以總結(jié)數(shù)據(jù)值為1,結(jié)果為0;數(shù)據(jù)值為0,結(jié)果為1。例如unsigned char數(shù)據(jù)類型數(shù)據(jù),x=0b,它按位取非的結(jié)果為x: 位左移位左移用來將一個(gè)數(shù)的每一位二進(jìn)制位全部左移若干位,移位以后,空白位補(bǔ)0,移出的位舍棄。位左移的運(yùn)算操作符號(hào)為“ n”,這里n為自然數(shù),表示進(jìn)行左移的位數(shù)。例如unsigned char數(shù)據(jù)類型數(shù)據(jù),y=0b,它左移2位, 2,的結(jié)果為y:

28、 n”,這里n為自然數(shù),表示進(jìn)行右移的位數(shù)。例如unsigned char數(shù)據(jù)類型數(shù)據(jù),y=0b,它右移2位, 2,的結(jié)果為y:2:對一個(gè)數(shù)據(jù)中的某一位進(jìn)行操作是經(jīng)常需要的。例如程序示例5.1中對驅(qū)動(dòng)74HC164器件的MSP430微控制器芯片管腳P1.7(輸出串行數(shù)據(jù))和P1.6(輸出串行同步時(shí)鐘)的配置語句,它們只影響了想要配置的管腳,對其它管腳的配置情況并沒有任何影響。在驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)中,輸出串行數(shù)據(jù)和串行時(shí)鐘也是只改變一個(gè)管腳的輸出狀態(tài),同時(shí)保持同一端口其它管腳的輸出狀態(tài)不變。在利用循環(huán)語句簡化的1位數(shù)碼管驅(qū)動(dòng)函數(shù)中,利用位運(yùn)算表達(dá)式code

29、_seg7&serial_shift產(chǎn)生條件語句的判斷條件。利用位運(yùn)算語句serial_shift=serial_shift1;調(diào)整判斷的具體位。MSP430微控制器芯片不支持位尋址。在需要對一個(gè)數(shù)據(jù)中某一個(gè)具體位進(jìn)行處理的情況下,位運(yùn)算操作提供了一種替代的方法。這里事實(shí)上采用的是字節(jié)尋址,一次處理的是一個(gè)字(16位),但是只影響了一位,其它位保持不變。5.4 多位數(shù)據(jù)的顯示5.4.1 采用同步串行接口的多個(gè)數(shù)碼管顯示電路對于8位移位寄存器74HC164,在時(shí)鐘信號(hào)上升沿的作用下,1個(gè)串行數(shù)據(jù)位首先被移入并行輸出管腳Q0對應(yīng)的觸發(fā)器。并行輸出管腳Q0對應(yīng)的觸發(fā)器的原有的數(shù)據(jù)將被移入并行輸出管腳

30、Q1對應(yīng)的觸發(fā)器。Q1原有的數(shù)據(jù)將被移入并行輸出管腳Q2對應(yīng)的觸發(fā)器。調(diào)用一次驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù),在產(chǎn)生的8個(gè)串行時(shí)鐘信號(hào)的作用下,顯示代碼所包含的8位數(shù)據(jù)被全部送到移位寄存器74HC164的8個(gè)輸出管腳。最先移入的數(shù)據(jù)位將被移進(jìn)輸出管腳Q7對應(yīng)的觸發(fā)器。如果需要同時(shí)顯示多位數(shù)據(jù),可以使用多個(gè)8位移位寄存器74HC164,每一個(gè)移位寄存器的并行輸出管腳驅(qū)動(dòng)一個(gè)數(shù)碼管。圖5.4給出了一個(gè)基于同步串行接口的2位數(shù)碼管顯示電路。注意這里74HC164的輸出管腳與數(shù)碼管輸入管腳的連接關(guān)系與圖5.2不同,這是希望電路圖的繪制整齊一些。建議讀者仍采用圖5.2所示的連

31、接關(guān)系,方便連線。圖5.4 采用同步串行接口的2位數(shù)碼管顯示電路在圖5.4所示的電路中,串行時(shí)鐘同時(shí)加到2個(gè)移位寄存器74HC164的時(shí)鐘輸入管腳,因此在時(shí)鐘信號(hào)的作用下,2個(gè)移位寄存器同時(shí)進(jìn)行數(shù)據(jù)的移位工作。執(zhí)行一次驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù),一個(gè)顯示代碼完整地出現(xiàn)在第一個(gè)移位寄存器的并行輸出管腳。并行輸出管腳Q7的信號(hào)加到數(shù)碼管輸入管腳,同時(shí)這個(gè)信號(hào)也送到第二個(gè)移位寄存器的串行數(shù)據(jù)輸入管腳A和B。接著再執(zhí)行驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù),當(dāng)將第2個(gè)顯示代碼的第一位移入第一個(gè)移位寄存器的Q0,同時(shí)在第二個(gè)移位寄存器的串行數(shù)據(jù)輸入管腳

32、A和B,即第1個(gè)顯示代碼的第一位,將移入第二個(gè)移位寄存器的Q0。在第2個(gè)顯示代碼的被全部移入第一個(gè)移位寄存器的同時(shí),第1個(gè)顯示代碼的被全部移入第二個(gè)移位寄存器。程序示例5.1給出的同步串行接口的1位數(shù)碼管演示程序可以被用于圖5.4所示的電路。如果第1個(gè)數(shù)碼管顯示某個(gè)數(shù)值,則第2個(gè)數(shù)碼管將顯示第1個(gè)數(shù)碼管上一次顯示的數(shù)值。例如,當(dāng)前第1個(gè)數(shù)碼管顯示“6”,則第2個(gè)數(shù)碼管將顯示“5”。注意,在圖5.4所示的電路中,8位移位寄存器74HC164的并行輸出管腳與數(shù)碼管輸入管腳之間的連接關(guān)系與圖5.2所示的電路不同,這將影響顯示代碼。建議讀者采用圖5.2所示電路的8位移位寄存器74HC164的并行輸出管

33、腳與數(shù)碼管輸入管腳之間的連接關(guān)系,只要保證串行時(shí)鐘同時(shí)加到2個(gè)移位寄存器的時(shí)鐘輸入管腳,第1個(gè)移位寄存器的并行輸出管腳Q7與第2個(gè)移位寄存器的串行數(shù)據(jù)輸入管腳相連接即可。圖5.4所示的電路能夠擴(kuò)展為包含更多數(shù)碼管的電路。這里串行時(shí)鐘信號(hào)將同時(shí)加到所有8位移位寄存器74HC164的時(shí)鐘輸入管腳,前一級(jí)移位寄存器74HC164的并行輸出管腳Q7與后一級(jí)移位寄存器74HC164的串行數(shù)據(jù)輸入管腳相連接。程序示例5.1給出的同步串行接口的1位數(shù)碼管演示程序仍然可以用來檢查電路的工作情況。5.4.2 數(shù)據(jù)分離使用具有圖5.4所示的電路形式能夠顯示具有多個(gè)數(shù)位的數(shù)據(jù),但是這個(gè)數(shù)據(jù)需要先被分解為多個(gè)1位數(shù)字

34、。例如把數(shù)據(jù)123分解為百位數(shù)字“1”、十位數(shù)字“2”以及個(gè)位數(shù)字“3”。完成一個(gè)具有多個(gè)數(shù)位數(shù)據(jù)的分解,獲得的每一位數(shù)字就能夠調(diào)用數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)來完成數(shù)碼管的驅(qū)動(dòng)。下面的程序段完成將一個(gè)值域?yàn)?999的整型數(shù)據(jù)變量data_seg7_temp分解為10進(jìn)制數(shù)據(jù)格式的百位、十位和個(gè)位。data_seg7_2=data_seg7_temp/100; / 產(chǎn)生百位顯示數(shù)據(jù) data_seg7_temp=data_seg7_temp%100; / 分離出低 2 位數(shù)據(jù) data_seg7_1=data_seg7_temp/10; / 產(chǎn)生十位顯示數(shù)據(jù)data_seg7_0=data

35、_seg7_temp%10; / 產(chǎn)生個(gè)位顯示數(shù)據(jù)這里變量data_seg7_2、data_seg7_1和data_seg7_0的數(shù)據(jù)類型都為unsigned char,與驅(qū)動(dòng) 1 位 7 段共陰極數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)中參量的數(shù)據(jù)類型相同。由于這3個(gè)變量屬于整型變量,因此上述語句右邊計(jì)算結(jié)果的小數(shù)部分將自動(dòng)丟棄。下面的程序段完成將一個(gè)值域?yàn)?x000xFF的整型數(shù)據(jù)變量data_seg7_temp分解為16進(jìn)制數(shù)據(jù)格式的高、低兩位。data_seg7_1=(data_seg7&0xf0)4; / 產(chǎn)生高位顯示數(shù)據(jù) data_seg7_0=data_seg7&0x0f; / 產(chǎn)生低位

36、顯示數(shù)據(jù)分解為16進(jìn)制數(shù)據(jù)格式的語句中使用了位運(yùn)算操作。兩句都使用了位與運(yùn)算來除掉不需要的數(shù)據(jù)部分。對于16進(jìn)制格式數(shù)據(jù)高位,即對應(yīng)的2進(jìn)制數(shù)據(jù)格式的高4位,通過右移4位操作產(chǎn)生它的顯示數(shù)據(jù)。5.4.3 采用同步串行接口的3個(gè)數(shù)碼管驅(qū)動(dòng)函數(shù)以顯示3位數(shù)據(jù)為例,這時(shí)需要3個(gè)數(shù)碼管和3個(gè)移位寄存器74HC164。每個(gè)數(shù)碼管和移位寄存器74HC164之間的連線應(yīng)該采用同樣的方式,如表5.2所示,這樣就能夠使用同樣的從顯示數(shù)據(jù)到顯示代碼的譯碼表。3個(gè)數(shù)碼管和移位寄存器74HC164組合從左到右排列。從MSP430微控制器芯片輸出的串行數(shù)據(jù)信號(hào)加到最左邊移位寄存器74HC164的串行數(shù)據(jù)輸入管腳。左邊移

37、位寄存器74HC164的輸出管腳Q7與右邊移位寄存器74HC164的串行數(shù)據(jù)輸入管腳相連接。從MSP430微控制器芯片輸出的串行時(shí)鐘信號(hào)同時(shí)加到每個(gè)移位寄存器74HC164的串行時(shí)鐘輸入管腳。驅(qū)動(dòng)同步串行接口的3個(gè)數(shù)碼管驅(qū)動(dòng)函數(shù)如下。/ 驅(qū)動(dòng) 3位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)void seg7_3ms(unsigned char seg7_data2, unsigned char seg7_data1, unsigned char seg7_data0) seg7_1ms(seg7_data0); / 調(diào)用 1 位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù) seg7_1ms(seg7_data1);

38、 / 調(diào)用 1 位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù) seg7_1ms(seg7_data2); / 調(diào)用 1 位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)這個(gè)函數(shù)具有3個(gè)參量,分別為已經(jīng)完成數(shù)據(jù)分離的3位準(zhǔn)備顯示的數(shù)據(jù)。Embedded Workbench for MSP430開發(fā)軟件要求對函數(shù)中的每一個(gè)參量必須進(jìn)行數(shù)據(jù)類型說明,函數(shù)的參量可以是不同的數(shù)據(jù)類型。驅(qū)動(dòng)3位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)內(nèi)部將1位數(shù)碼管的同步串行數(shù)據(jù)接口驅(qū)動(dòng)函數(shù)調(diào)用了3遍,分別輸出3位準(zhǔn)備顯示數(shù)據(jù)的顯示代碼。最先輸出的顯示數(shù)據(jù),seg7_data0,將被送到最右邊的數(shù)碼管進(jìn)行顯示,最后輸出的顯示數(shù)據(jù),seg7_data2,

39、將會(huì)在最左邊的數(shù)碼管進(jìn)行顯示。5.4.4 同步串行接口的3位數(shù)碼管演示程序程序示例5.2/ 程序名稱:seg1_3ms/ 程序功能:通過模擬同步串口控制 3 個(gè) 7 段共陰極數(shù)碼管/ P1.7 數(shù)據(jù)管腳,P1.6 同步時(shí)鐘管腳#include / 包含名稱定義和對應(yīng)地址或數(shù)據(jù)的頭函數(shù)void delay_1s(void); / 聲明 1s 延遲函數(shù)void seg7_1ms(unsigned char seg7_data);/ 聲明驅(qū)動(dòng) 1 位數(shù)碼管的驅(qū)動(dòng)函數(shù)void seg7_3ms(unsigned char seg7_data2, unsigned char seg7_data1, un

40、signed char seg7_data0);/ 聲明驅(qū)動(dòng) 3 位數(shù)碼管的驅(qū)動(dòng)函數(shù)const unsigned char decoder_seg718= 0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6,0xde,0x3e,0x6c,0x9e,0x7c,0x78,0x00,0xff;/ 按表 5.2 所示連接關(guān)系共陰極數(shù)碼管顯示代碼int main(void) / 主函數(shù) unsigned char data_seg7, data_seg7_temp; / 聲明顯示數(shù)據(jù)變量unsigned char data_seg7_2, data_seg

41、7_1, data_seg7_0; / 聲明每一位數(shù)據(jù)顯示變量 WDTCTL=WDTPW+WDTHOLD; / 關(guān)閉看門狗 P1SEL&=BIT7; / 設(shè)置 P1.7 端口為并行數(shù)字輸入 / 輸出口 P1DIR|=BIT7; / 設(shè)置 P1.7 端口為輸出口 P1SEL&=BIT6; / 設(shè)置 P1.6 端口為并行數(shù)字輸入 / 輸出口 P1DIR|=BIT6; / 設(shè)置 P1.6 端口為輸出口 while(1) / 重復(fù)執(zhí)行 / 10 進(jìn)制數(shù)據(jù)顯示 for(data_seg7=0; data_seg70xff; data_seg7+) / 利用循環(huán)語句產(chǎn)生顯示數(shù)據(jù) data_seg7_temp=data_seg7; / 不影響原始數(shù)據(jù) data_seg7_2=data_seg7_temp/100; / 產(chǎn)生百位顯示數(shù)據(jù) data_seg7_temp=data_seg7_temp%100;/ 產(chǎn)生低 2 位數(shù)據(jù) data_seg7_1=data_seg7_temp/10;/ 產(chǎn)生十位顯示數(shù)據(jù) data_seg7_0=data_seg7_temp%10;/ 產(chǎn)生個(gè)位顯示數(shù)據(jù) seg7_3ms(data_seg7_2, data_seg7_1, data_seg7_0); / 調(diào)用驅(qū)動(dòng) 3 位數(shù)碼管的驅(qū)動(dòng)函數(shù) delay_1s (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論