- 單片機(jī)C語言程序設(shè)計(jì)實(shí)訓(xùn)100例:基于STC8051+Proteus仿真與實(shí)戰(zhàn)
- 彭偉
- 1155字
- 2022-05-05 20:18:28
3.6 集成式數(shù)碼管動(dòng)態(tài)掃描顯示
集成式數(shù)碼管動(dòng)態(tài)掃描顯示電路圖3-7所示。在該仿真電路運(yùn)行時(shí),集成式數(shù)碼管“同時(shí)”顯示多個(gè)不同字符。本案例程序設(shè)計(jì)使用了集成式數(shù)碼管動(dòng)態(tài)掃描顯示技術(shù)。為將年、月、日的顯示分開,在該仿真電路中未使用元器件庫提供的8位集成式共陽數(shù)碼管,而是選用了一組4位及兩組2位的共陽集成式數(shù)碼管,并將其拼裝成一組“8位集成式”數(shù)碼管。在拼裝時(shí),要注意“段引腳并聯(lián)、位引腳分立”。

圖3-7 集成式數(shù)碼管動(dòng)態(tài)掃描顯示電路
1. 程序設(shè)計(jì)與調(diào)試
1)集成式數(shù)碼管簡介
本案例仿真電路中顯示“年”時(shí),使用了4位集成式七段藍(lán)色共陽數(shù)碼管(7SEG-MPX4-CA-BLUE)。其中,CA表示共陽,MPX4表示4位復(fù)用。第一組4位集成式數(shù)碼管是共陽的,從“縱向”看,任意一個(gè)數(shù)碼管內(nèi)A~G、DP各段的陽極連接在一起,4只數(shù)碼管分別引出共陽極1、2、3、4(或稱C1~C4);從“橫向”看,4只數(shù)碼管共有4個(gè)A段,所有A段的陰極引腳并聯(lián)在一起,B、C、D、E、F、G、DP陰極也分別“橫向”并聯(lián),分別引出段引腳A~G、DP。
根據(jù)上述構(gòu)造可知,任何時(shí)候發(fā)送的段碼都會(huì)傳送給所有數(shù)碼管的各段,管段是否被點(diǎn)亮取決于數(shù)碼管的共陽極1~4(或稱C1~C4)是否連接高電平。如果它們同時(shí)連接高電平,則所發(fā)送的數(shù)字將同時(shí)顯示在4只數(shù)碼管上。如果各數(shù)碼管要分別獨(dú)立顯示,顯然不能讓所有位引腳同時(shí)為高電平。
后兩組顯示“月”與“日”的2位集成式數(shù)碼管的結(jié)構(gòu)與第一組4位集成式數(shù)碼管相似。在本案例仿真電路中,3組集成式數(shù)碼管的段引腳全部并聯(lián),從邏輯上看,它們相當(dāng)于一個(gè)8位的集成式共陽數(shù)碼管。
2)集成式數(shù)碼管動(dòng)態(tài)掃描程序設(shè)計(jì)
仿真電路中,集成式數(shù)碼管共陽極分別與8只8050(NPN)三極管射極相連,集電極接高電平。若要選通某個(gè)數(shù)碼管位引腳,只要在相應(yīng)的連接NPN三極管基極的P2引腳輸出高電平。程序運(yùn)行時(shí),任意時(shí)刻只能有一只數(shù)碼管的位引腳(共陽極)連接+5V。當(dāng)P0輸出段碼時(shí),相應(yīng)數(shù)字將只會(huì)顯示在對應(yīng)的那個(gè)數(shù)碼管上。在依次循環(huán)選通8位數(shù)碼管中的每一個(gè)時(shí),即可逐個(gè)顯示每位數(shù)字。
例如,要在最左邊的數(shù)碼管上顯示數(shù)字,對于仿真電路中的共陽數(shù)碼管,其位引腳1(或稱C1)要連接+5V。當(dāng)P1.0引腳值為1,即P1端口輸出位碼00000001時(shí),三極管Q1飽和導(dǎo)通,對應(yīng)數(shù)碼管共陽極連接+5V;不難看出,為顯示下一位數(shù)字,P1端口必須輸出位碼00000010。
主程序中的for循環(huán)通過P1=1 << i逐一發(fā)送位碼。當(dāng)i取值為0~7時(shí),P1分別輸出位碼00000001,00000010,00000100,…,10000000。在第i只共陽數(shù)碼管被選通,結(jié)合對應(yīng)輸出的段碼,相應(yīng)的數(shù)字將顯示在對應(yīng)的第i只數(shù)碼管上。
對于集成式數(shù)碼管,任何時(shí)候發(fā)送的段碼會(huì)被所有數(shù)碼管收到。如果仿真電路中所有共陽數(shù)碼管的位碼均為1(即11111111,也就是0xFF),則所有數(shù)碼管都會(huì)顯示同一字符。為使不同數(shù)碼管顯示不同字符,主程序使用了集成式數(shù)碼管顯示常用的動(dòng)態(tài)掃描顯示技術(shù)。在選通第一只數(shù)碼管時(shí),發(fā)送第一個(gè)數(shù)字的段碼,選通第二只數(shù)碼管時(shí)發(fā)送第二個(gè)數(shù)字的段碼,以此類推,每次僅選通一只數(shù)碼管,發(fā)送對應(yīng)的段碼。
如果切換選通下一個(gè)數(shù)碼管并發(fā)送相應(yīng)段碼的時(shí)間間隔非常短,視覺惰性將使人感覺不到字符是一個(gè)接一個(gè)顯示在不同數(shù)碼管上的,而會(huì)覺得所有字符是很穩(wěn)定地“同時(shí)”顯示在不同數(shù)碼管上,這就是人的視覺暫留特征。在控制切換延時(shí)時(shí)長的時(shí)候,要注意設(shè)置掃描頻率高于視覺暫留頻率16~20Hz。電影膠片正是采取了24張/s的播放速度,才使觀眾覺察不到人物或景色是一幀一幀顯示出來的,相反會(huì)覺得畫面非常連貫,沒有任何抖動(dòng)或閃爍感。
主函數(shù)中的for循環(huán)是控制數(shù)碼管動(dòng)態(tài)掃描顯示的核心部分,根據(jù)數(shù)碼管輸出控制經(jīng)驗(yàn),可采取兩種可靠方式輸出,這樣可以有效解決亂碼現(xiàn)象或無顯示現(xiàn)象。
方式1:先暫時(shí)關(guān)閉段碼,然后再發(fā)送位碼和段碼,該順序簡稱為“段、位、段”;
方式2:先暫時(shí)關(guān)閉位碼,然后再發(fā)送段位和位碼,該順序簡稱為“位、段、位”。
兩種方式均首先暫時(shí)關(guān)閉段碼(或位碼),然后再發(fā)送位碼、段碼(或段碼、位碼)。
對于集成式數(shù)碼管,其位碼輸出通常使用以下兩種方法。
方法1:使用位碼表。
使用該方法時(shí)要首先在程序中單獨(dú)建立數(shù)碼管位碼表,對于所設(shè)計(jì)的仿真電路有:

有了位碼表以后,主函數(shù)中發(fā)送位碼的語句P1=1<<i即可改成P1=Scan_BITs[i]。
方法2:使用位運(yùn)算符(<<、>>、~)。
對于共陽數(shù)碼管,可使用1<<i得到位碼字節(jié),當(dāng)i取值為0~7時(shí),輸出序列為00000001,00000010,…,10000000,可依次選通8位共陽數(shù)碼管中的每一個(gè)。
對于共陰數(shù)碼管,則可使用~(1<<i),輸出序列為11111110,11111101,…,01111111,可依次選通共陰數(shù)碼管中的每一個(gè)。
此外,還可以使用0x80>>i和~(0x80>>i),其差別是掃描順序剛好相反。
要注意,如果端口不是直接連接數(shù)碼管位引腳的,而是通過NPN或PNP三極管控制位引腳的,位碼輸出序列要由三極管的開關(guān)控制碼決定。
本案例程序使用了方法2列出的數(shù)碼管掃描方法,通過單條語句實(shí)現(xiàn)動(dòng)態(tài)掃描顯示。
2. 實(shí)訓(xùn)要求
① 將代碼中delay_ms(4)語句的參數(shù)修改為10、20或100并編譯運(yùn)行,觀察會(huì)出現(xiàn)什么樣的效果。
② 改用位碼表Scan_BITs實(shí)現(xiàn)對集成式數(shù)碼管的位碼控制。
3. 源程序代碼

- 嵌入式軟件系統(tǒng)測試:基于形式化方法的自動(dòng)化測試解決方案
- SoapUI Cookbook
- vSphere High Performance Cookbook
- 精通搜索分析
- 實(shí)戰(zhàn)Java程序設(shè)計(jì)
- Magento 2 Development Cookbook
- Silverlight魔幻銀燈
- Java網(wǎng)絡(luò)編程實(shí)戰(zhàn)
- 打開Go語言之門:入門、實(shí)戰(zhàn)與進(jìn)階
- HTML5+CSS3+JavaScript 從入門到項(xiàng)目實(shí)踐(超值版)
- Practical GIS
- Spring Data JPA從入門到精通
- Selenium WebDriver Practical Guide
- Microsoft Dynamics GP 2013 Cookbook
- INSTANT LESS CSS Preprocessor How-to