




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MSP430 程序庫(kù) < 九 > 數(shù)碼管顯示數(shù)碼管也是單片機(jī)系統(tǒng)最常用的輸出設(shè)備之一(還有液晶、發(fā)光二極管等)。七段(這里用的是8段,有小數(shù)點(diǎn))數(shù)碼管可以完成顯示 0-9數(shù)字和一部分的英文字符如:A、b。本文實(shí)現(xiàn)的程序完成顯示數(shù)字和可顯示的英文字符;同時(shí)完成數(shù)碼管顯示的printf函數(shù)的移植,以支持printf的格式化字符等好用的特點(diǎn)(我用的數(shù)碼管8個(gè)排為一排,方便數(shù)字等的顯示)。*硬件介紹:這里所用到的硬件資源包括 8個(gè)數(shù)碼管、和 msp430 單片機(jī)的兩個(gè)8位10 口(這里用 的是P3和P5 口,如有改變,可以通過(guò)宏定義更改)。數(shù)碼管是8個(gè)共陰的數(shù)碼管,a-h 8段通過(guò)一個(gè)20
2、0Q的電阻接到430單片機(jī)的P5 口。 共陰端是由單片機(jī)的 P3 口控制,單片機(jī)的一位10通過(guò)一個(gè)三極管接到數(shù)碼管的共陰端, 以完成位選。單片機(jī)的P3 口時(shí)數(shù)碼管的位選口,某位為高則選中;P5 口時(shí)段選口;要數(shù)碼管顯示時(shí),通過(guò)P3位選,選中某個(gè)數(shù)碼管亮, P5段選選擇8段(a-h )中的那些亮,從而控制某 一位顯示數(shù)字或字符。要同時(shí)顯示多個(gè)數(shù)碼管,就要?jiǎng)討B(tài)掃描;動(dòng)態(tài)掃描時(shí),本程序選用的是由看門(mén)狗的中斷 掃描顯示:每1.9ms顯示其中的一位,動(dòng)態(tài)掃描顯示每一位,從而讓數(shù)碼管看起來(lái)是同 時(shí)亮的。程序?qū)崿F(xiàn):數(shù)碼管顯示首先要有一個(gè)數(shù)碼管顯示的斷碼表(完成數(shù)字和字符到數(shù)碼管段值的表), 程序中采用了MS
3、P430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐這本書(shū)推薦的方式實(shí)現(xiàn)的這 個(gè)數(shù)碼表:先用宏定義定義每段對(duì)應(yīng)的單片機(jī)要輸出的段值,然后再實(shí)現(xiàn)是個(gè)表,當(dāng)硬 件改變時(shí),只需更改前面的每段的段值定義即可,改動(dòng)的地方少了很多,代碼如下:/*宏定義,數(shù)碼管a-h各段對(duì)應(yīng)的比特,更換硬件只用改動(dòng)以下8行*/#defi nea0x01/ AAAA#defi neb0x02/ FB#defi nec0x04/ FB#defi ned0x08/ GGGG#defi nee0x10/ EC#defi nef0x20/ EC#defi neg0x40/ DDDDHH#defi neh0x80/小數(shù)點(diǎn)/*用宏定義自動(dòng)生成段碼表,很
4、好的寫(xiě)法,值得學(xué)習(xí)*/*更換硬件無(wú)需重寫(xiě)段碼表*/const char Tab = a+b+c+d + e+f,/ Displays "0IIb+c,a+b+d+a+b+c+b + c + f + a+c+d+a+c+d+IIa+b+c,a+b+c+8"a+b+c+IIa+b+c+IIc+d+e+a+d+e+b+c+d+IIa+d+e+a + e + f + a+c+d+b+c+e+e+f,b+c+d+b+d+e+d+e+f,a+c+e+a+b+c+e + g,d + g,g,f +g,e+f+g,d+e+f + g,d+f+g,e+f+g,f + g,f,e + g,f
5、+ g,g,e + f,f + g, e, f + g,g,e + f,/ Displays "1"/ Displays "2"/ Displays "3"/ Displays "4"/ Displays "5"/ Displays "6/ Displays "7"/ Displays "/ Displays "9/ Displays "A/ Displays "B"/ Displays"C"/
6、Displays "D/Displays"E"/ Displays"F"/Displays"G"/Displays"H"/ Displays "I"/ Displays "J"/ Displays "K"/ Displays "L"/ Displays "M"/ Displays "N"c + e + g,/ Displays "n"c + a +IId + b +e
7、 + c +g, d+e + f,/DisplaysDisplays"o""Oa +b +e +f+g,/Displays"P"a +b +c +f+g,/Displays"Q"e +g,/ Displays "r"a +c +d +f+g,/Displays"S"d +e +f +g,/Displays"t"a +e +f ,/ Displays "T"b +c +d +e+f,/Displays"U"c + b + b +
8、d + d + c +e, f + d +g, f + g,/ Displays/ Displays/ Displays"v""W""Y"a +1!b +d +e + g,/ Displays"Zg,/ Displays "-IIh,/ Displays ".II0;/ Displays "II#un defa#un defb#un defc#un defd#un defe#un deff#un defg0-9的位置對(duì)應(yīng)顯示0-9,之后的是A開(kāi)始往后顯示,為了方便訪問(wèn)這個(gè)表格,定義了 AA等一系
9、列的常量,方便訪問(wèn)這個(gè)表。#defi neAA10#defi neBBAA+1#defi neCCBB+1#defi neDDCC+1#defi neEEDD+1#defi neFFEE+1#defi neGGFF+1#defi neHHGG+1#defi neIIHH+1#defi neJJ11+1#defi neKKJJ+1#defi neLLKK+1#defi nemmLL+1#defi neNNmm+1#defi nennNN+1#defi ne00nn+1#defi ne00oo+1#defi nePPOO+1#defi neQQPP+1#defi nerrQQ+1#defi neS
10、S汀+1#defi nettSS+1#defi neTTtt+1#defi neUUTT+1#defi neVVUU+1#defi neWWVV+1#defi neYYWW+1#defi neZZYY+1#defi neNEGZZ+1/* -*/負(fù)號(hào)#defi neDOTNEG+1/* .*/小數(shù)點(diǎn)#defi neSPDOT+1/*空白*/空格A從10開(kāi)始訪問(wèn)這個(gè)表格,如果要顯示A只需這樣用TabAA,即可得到需要的段值, AA-空格的宏定義放在 H文件里,方便其他文件訪問(wèn)(當(dāng)要調(diào)用顯示函數(shù)的時(shí)候需要AA等宏定義)。為什么是 AA而不是A呢?主要原因是單字母的有幾個(gè)已經(jīng)在單片機(jī)430的頭文件里
11、定義了,為了訪問(wèn)的時(shí)候一致,就都用兩個(gè)字母的了。為了動(dòng)態(tài)掃描,這里定義了一個(gè)全局?jǐn)?shù)組(數(shù)碼管的程序可以訪問(wèn))Nixie8在這個(gè)里面的8個(gè)char對(duì)應(yīng)8個(gè)數(shù)碼管要顯示的段值。初始值是8個(gè)數(shù)碼管都不顯示:char Nixie8 = "00000000"/ 初始狀態(tài)不顯示動(dòng)態(tài)掃描時(shí),函數(shù)每1.9ms(設(shè)的看門(mén)狗定時(shí)中斷)調(diào)用一次顯示函數(shù),每次顯示一位(為了讓中斷占用更少的時(shí)間,這樣中斷里只需賦值即可)。函數(shù)如下:voidDisplay()static char i=0;/記錄掃描顯示到哪位CTRL_OUT =1<<i;DATA_OUT :=Nixiei;i+;if(i
12、>7)i =0;1這個(gè)函數(shù)供中斷調(diào)用,i用來(lái)保存要顯示哪一位。CTRL_OUT 、DATA_OUT 是宏定義的位選和段選口。中斷程序如下:#pragma vector=WDT_VECTOR_in terruptvoid WDT_ISR()廠_Display。;中斷只調(diào)用了一個(gè)函數(shù),這樣很方便換其他中斷來(lái)定時(shí)。中斷是必須初始設(shè)置的,還有io 口,要設(shè)為輸出方向,初始化函數(shù)完成數(shù)碼管用到的單片機(jī)資源的初始工作:void Nixiettubel nit()WDTCTL = WDT_ADLY_1_9;/看門(mén)狗內(nèi)部定時(shí)器模式16msIE1 |= WDTIE;/允許看門(mén)狗中斷CTRL_DIR_OUT
13、;DATA_DIR_OUT;首先,設(shè)置中斷并允許中斷;然后設(shè)置位選和段選所用的端口為輸出方向。CTRL_DIR_OUT; DATA_DIR_OUT;和剛才用到的兩個(gè) OUT的宏定義如下:#defi neDATA_DIR_OUTP5DIR|=0XFF#defi neCTRL_DIR_OUTP3DIR|=0XFF#defi neDATA_OUTP5OUT#defi neCTRL_OUTP3OUT這樣處理之后,要顯示數(shù)字就很簡(jiǎn)單了:只需把要顯示的數(shù)字或字符的段碼值放入Nixie8數(shù)組對(duì)應(yīng)的位置即可,如顯示韓輸入下:void NixiettubeDisplayChar( char ch, char a
14、ddr)if (ch = DOT)/小數(shù)點(diǎn),不需單獨(dú)占一位Nixieaddr |= Tabch;elseNixieaddr = Tabch;如果是小數(shù)點(diǎn),放入對(duì)應(yīng)位置的h段即可,其他直接覆蓋。插入字符函數(shù):在最右端插入數(shù)字或字符void NixiettubeInsertChar( char ch)if(ch = DOT)/小數(shù)點(diǎn),不需單獨(dú)占一位Nixie0 |= Tabch; return ;for (int i = 7;i > 0;i-) Nixiei = Nixiei - 1;/已顯示字符左移一位Nixie0 = Tabch;這個(gè)也是先判斷小數(shù)點(diǎn),小數(shù)點(diǎn)直接放到h段,其他的,則要已顯
15、示的左移再覆蓋最右一位,源程序的注釋很詳細(xì),可具體才、可以下載附件的程序庫(kù)。數(shù)碼管清除函數(shù),這個(gè)函數(shù)把數(shù)碼管全部顯示去掉,即把緩存數(shù)組內(nèi)每項(xiàng)都置為0 :void NixiettubeClear()for (int i = 0;i < 8;i+) Nixiei = TabSP;/ 顯示空格程序比較簡(jiǎn)單,這里就不多解釋了。數(shù)碼管的程序就這么多了,所有函數(shù)都列出來(lái)了。下面開(kāi)始介紹printf的移植,具體過(guò)程不再詳細(xì)說(shuō)了,詳細(xì)過(guò)程參考:MSP430 程序庫(kù) < 四>printf 和scanf函數(shù)移植。這里主要介紹所需程序。單片機(jī)printf使用需要用戶提供底層驅(qū)動(dòng) -putchar
16、函數(shù),printf完成格式化等一系列活 動(dòng)后調(diào)用putchar 輸出字符流。只要實(shí)現(xiàn)putchar ,包含stdio.h文件,就可以使用 printf函數(shù)。移植的數(shù)碼管的putchar函數(shù)如下:#in clude<stdio.h>#include "ctype.h"/*isdigit函數(shù)需要該頭文件 */#in clude"Nixietube.h"int putchar( int ch)'f表示走紙翻頁(yè),相當(dāng)于清除顯示if(ch= 'n' |ch='r')NixiettubeClear();/數(shù)字和對(duì)應(yīng)
17、ASCII字母之間差0x30'1'=0x312=0x32/isdigit 也是C語(yǔ)言標(biāo)準(zhǔn)函數(shù)if (isdigit(ch)NixiettubeInsertChar(ch-0x30);/ 若字符是數(shù)字則顯示數(shù)字else/否則,不是數(shù)字,是字母switch (ch) /根據(jù)字母選擇程序分支case'A':case'a':NixiettubeI nsertChar(AA);break; /字符AcaseB:case'b':NixiettubeI nsertChar(BB);break; /字符Bcasek;/C:case'c
18、39;:NixiettubeI nsertChar(CC);break ;/.caseD :case'd':NixiettubeI nsertChar(DD);break;case'E':case'e':NixiettubeI nsertChar(EE);break;ucase'F':case'f :Nixiettubel nsertChar(FF);break ;case'G':case'g':NixiettubeInsertChar(GG);break;case'H':c
19、ase'h':NixiettubeInsertChar(HH);break;case'I':case'i':NixiettubeI nsertChar(II);break ;case'J':case'j':NixiettubeI nsertChar(JJ);break ;k ;case'K':case'k':NixiettubeI nsertChar(KK);break ;case'L':case'l':NixiettubeI nsertChar(LL
20、);breacase'M':case'm':NixiettubeInsertChar(mm);break ;case'N':NixiettubeI nsertChar(NN);break;if.case'n':NixiettubeI nsertChar( nn);break ,case'O':NixiettubeI nsertChar(OO);break;k ;case'o':Nixiettube In sertChar(oo);breaN J k ;case'P':case'
21、;p':NixiettubeI nsertChar(PP);break ;case'Q':case'q':NixiettubeInsertChar(QQ);break;case'R':case'r':NixiettubeI nsertChar(rr);break ; k ;case'S':case's':Nixiettube In sertChar(SS);break ;case'T':case't':NixiettubeI nsertChar(tt);bre
22、ak ;case'U':case'v':NixiettubeI nsertChar(UU);break ;case'V':case'u':NixiettubeI nsertChar(VV);breacase'W:case'w':NixiettubeInsertChar(WW);break ;case'Y':case'y':NixiettubeI nsertChar(YY);break; /.case'Z':case'z':NixiettubeI
23、 nsertChar(ZZ);break; /字符Zcase '-':NixiettubeI nsertChar(NEG);break;字符-case '.':NixiettubeI nsertChar(DOT);break;小數(shù)點(diǎn),直接顯示在右下角case '':NixiettubeI nsertChar(SP);break; /空格default :NixiettubeI nsertChar(SP);break;顯示不出來(lái)的字母用空格替代return (ch);/返回顯示的字符(putchar函數(shù)標(biāo)準(zhǔn)格式要求返回顯示字符)頭文件必須包含std
24、io.h ,這樣告訴編譯器 printf調(diào)用時(shí),用這里的 putchar函數(shù)。然 后判斷字符,分類進(jìn)行顯示,不能顯示的空一格。數(shù)碼管的程序就完成了,如果需要可以自己添加改寫(xiě)函數(shù),如:當(dāng)和鍵盤(pán)共同使用時(shí),如果鍵盤(pán)移植了 scanf函數(shù),并且支持退格;可以改寫(xiě)函數(shù) -讓數(shù)碼管的putchar支持 退格操作。或者用的是我的鍵盤(pán)程序,需要10多ms調(diào)用一次鍵盤(pán)處理函數(shù), 這樣可以和這個(gè)數(shù)碼管掃描公用一個(gè)中斷:void Display。static char i = 0;/記錄掃描顯示到哪位CTRL_OUT = 1<<i;DATA_OUT = Nixiei;i+;if(i>7) i = 0; KeyProcess();這樣改寫(xiě),然后把鍵盤(pán)的中斷去掉(別忘了 key.h包含和加入KeyProcess();的聲明;如果程序中有兩個(gè)指向同一個(gè)中斷時(shí),會(huì)編譯錯(cuò)誤);這樣就可以鍵盤(pán)、和數(shù)碼管共同使用了。卜使用示例:使用方法還是和之前一樣,工程中加入Nixietube.c文件,然后在要調(diào)用的地方加入Nixietube.h 的包含;如 puchr函數(shù),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雇主品牌在招聘中的重要性計(jì)劃
- 其他債務(wù)轉(zhuǎn)讓合同范例
- 貨物分類與標(biāo)識(shí)標(biāo)準(zhǔn)計(jì)劃
- 加強(qiáng)客戶關(guān)系管理的策略計(jì)劃
- 班級(jí)活動(dòng)反饋機(jī)制的建立計(jì)劃
- 美好的班級(jí)文化建設(shè)計(jì)劃
- 前臺(tái)文員對(duì)外溝通能力提升方案計(jì)劃
- 居易國(guó)際品牌視覺(jué)形象規(guī)范手冊(cè)
- 第 3 單元 第5 章第 2 節(jié) 呼吸作用2023-2024學(xué)年七年級(jí)上冊(cè)生物同步教學(xué)設(shè)計(jì)(北師大版)
- 2025年湘潭貨運(yùn)員初級(jí)考試題庫(kù)
- DB13T 2801-2018 水利工程質(zhì)量監(jiān)督規(guī)程
- 四年級(jí)上冊(cè)第四單元讓生活多一些綠色道德與法治教學(xué)反思11變廢為寶有妙招
- JJG(交通)096-2009 水泥膠砂流動(dòng)度測(cè)定儀檢定規(guī)程-(高清現(xiàn)行)
- 嗓音(發(fā)聲)障礙評(píng)定與治療
- Q∕SY 05262-2019 機(jī)械清管器技術(shù)條件
- 耳鼻咽喉頭頸外科學(xué)耳鼻咽喉應(yīng)用解剖
- 最新人音版音樂(lè)二年級(jí)下冊(cè)全冊(cè)教案
- 航空航天概論(課堂PPT)
- 新改版教科版六年級(jí)下冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)歸納 (超全)
- 英語(yǔ)的起源與發(fā)展(課堂PPT)
- 二房東租房合同范文
評(píng)論
0/150
提交評(píng)論