MSP430程序庫九數(shù)碼管顯示課案_第1頁
MSP430程序庫九數(shù)碼管顯示課案_第2頁
MSP430程序庫九數(shù)碼管顯示課案_第3頁
MSP430程序庫九數(shù)碼管顯示課案_第4頁
MSP430程序庫九數(shù)碼管顯示課案_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、msp430 程序庫 < 九 > 數(shù)碼管顯示數(shù)碼管也是單片機(jī)系統(tǒng)最常用的輸出設(shè)備之一(還有液晶、發(fā)光二極管等)。七段(這里用的是8段,有小數(shù)點(diǎn))數(shù)碼管可以完成顯示 0-9數(shù)字和一部分的英文字符如:a、bo本文實(shí)現(xiàn)的程序完成顯示數(shù)字和可顯示的英文字符;同時(shí)完成數(shù)碼管顯示的printf函數(shù)的移植,以支持printf的格式化字符等好用的特點(diǎn)(我用的數(shù)碼管8個排為一排,方便數(shù)字等的顯示)。卜硬件介紹:這里所用到的硬件資源包括 8個數(shù)碼管、和 msp430 單片機(jī)的兩個8位io 口(這里用 的是p3和p5 口,如有改變,可以通過宏定義更改)。數(shù)碼管是8個共陰的數(shù)碼管,a-h 8段通過一個20

2、0a的電阻接到430單片機(jī)的p5 口。 共陰端是由單片機(jī)的 p3 口控制,單片機(jī)的一位io通過一個三極管接到數(shù)碼管的共陰端, 以完成位選。單片機(jī)的p3 口時(shí)數(shù)碼管的位選口,某位為高則選中; p5 口時(shí)段選口;要數(shù)碼管顯示時(shí), 通過p3位選,選中某個數(shù)碼管亮, p5段選選擇8段(a-h )中的那些亮,從而控制某 一位顯示數(shù)字或字符。要同時(shí)顯示多個數(shù)碼管,就要動態(tài)掃描;動態(tài)掃描時(shí),本程序選用的是由看門狗的中斷 掃描顯示:每1.9ms顯示其中的一位,動態(tài)掃描顯示每一位,從而讓數(shù)碼管看起來是同 時(shí)亮的。程序?qū)崿F(xiàn):數(shù)碼管顯示首先要有一個數(shù)碼管顯示的斷碼表(完成數(shù)字和字符到數(shù)碼管段值的表), 程序中采用了

3、msp430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐這本書推薦的方式實(shí)現(xiàn)的這 個數(shù)碼表:先用宏定義定義每段對應(yīng)的單片機(jī)要輸出的段值,然后再實(shí)現(xiàn)是個表,當(dāng)硬 件改變時(shí),只需更改前面的每段的段值定義即可,改動的地方少了很多,代碼如下:/*宏定義,數(shù)碼管a-h各段對應(yīng)的比特,更換硬件只用改動以下8行*/#definea0x01/aaaa#defineb0x02/f b#definec0x04/f b#defined0x08/gggg#definee0x10/e c#definef0x20/e c#defineg0x40/ddddhh#defineh0x80/小數(shù)點(diǎn)/*用宏定義自動生成段碼表,很好的寫法,值得學(xué)習(xí)

4、*/*更換硬件無需重寫段碼表*/const char tab口 = a+b+c+d + e+f,/ displays "0b+c,a+b+d+a+b+c+b+c+f +a+c+d+a+c+d+“a+b+c,a+b+c+8"a+b+c+"a+b+c+"c+d+e+a+d+e+b+c+d+"a+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+c+e+g,c+d+e+a+b+c+"a+b+e+a+b+c+e+g,a+c+d+d+e+f+a+e+f,b+c+d+e + g, d

5、+ g,g, f +g, e + f + g, d + e + f + g,d + f + g,e + f + g,f + g,f,e + g,f + g,g, e + f, f + g, e, f + g,g,e + f, g,d + e + f,f + g,f + g,f +g,g,e + f,/ displays "1"/ displays "2"/ displays "3"/ displays "4"/ displays "5"/ displays "6 / displays

6、"7"/ displays "/ displays "9/ displays "a/ displays "b"/ displays "c"/ displays "d/ displays "e"/ displays "f"/ displays "g"/ displays "h"/ displays "i"/ displays "j"/ displays "k"

7、/ displays "l"/ displays "m"/ displays "n" / displays "n"/ displays "o"/ displays "o/ displays "p"/ displays "q"/ displays "r"/ displays "s"/ displays "t"/ displays "t"/ displays "

8、u"/ displays "v"/ displays "w"/ displays "y"/ displays "z/ displays "-"/ displays "." / displays ""c + d + e, b + d + f + g, b + c + d + f + g,a + b+d + e+ g, "g, h,0;#undef a#undef b#undef c#undef d#undef e#undef f#undef g0-

9、9的位置對應(yīng)顯示0-9 ,之后的是a開始往后顯示,為了方便訪問這個表格,定義了 aa等一系列的常量,方便訪問這個表。#defineaa10#definebbaa+1#defineccbb+1#defineddcc+1#defineeedd+1#defineffee+1#defineggff+1#definehhgg+1#defineiihh+1#definejjii+1#definekkjj+1#definellkk+1#definemmll+1#definennmm+1#definennnn+1#defineoonn+1#defineoooo+1#defineppoo+1#defineqqp

10、p+1#definerrqq+1#definessrr+1#definettss+1#definetttt+1#defineuutt+1#definevvuu+1#definewwvv+1#defineyyww+1#definezzyy+1/*- */ 負(fù)號/*.*/小數(shù)點(diǎn)/*空白*/空格#definenegzz+1#define dot neg+1#define sp dot+1a從10開始訪問這個表格,如果要顯示a只需這樣用tabaa,即可得到需要的段值, aa-空格的宏定義放在 h文件里,方便其他文件訪問(當(dāng)要調(diào)用顯示函數(shù)的時(shí)候需要aa等宏定義)。為什么是 aa而不是a呢?主要原因是單字

11、母的有幾個已經(jīng)在單片機(jī)430的頭文件里定義了,為了訪問的時(shí)候一致,就都用兩個字母的了。為了動態(tài)掃描,這里定義了一個全局?jǐn)?shù)組(數(shù)碼管的程序可以訪問)nixie8在這個里面的8個char對應(yīng)8個數(shù)碼管要顯示的段值。初始值是8個數(shù)碼管都不顯示:char nixie8 = "00000000" 初始狀態(tài)不顯示動態(tài)掃描時(shí),函數(shù)每1.9ms(設(shè)的看門狗定時(shí)中斷)調(diào)用一次顯示函數(shù), 每次顯示一位(為 了讓中斷占用更少的時(shí)間,這樣中斷里只需賦值即可)。函數(shù)如下:void display。static char i = 0;/記錄掃描顯示到哪位ctrl_out = 1<<i;da

12、ta_out = nixiei;i+;if(i>7) i = 0;這個函數(shù)供中斷調(diào)用,i用來保存要顯示哪一位。ctrl_out 、data_out 是宏定義的位選和段選口。中斷程序如下:#pragma vector=wdt_vector_interruptvoid wdt_isr()r .display();中斷只調(diào)用了一個函數(shù),這樣很方便換其他中斷來定時(shí)。中斷是必須初始設(shè)置的,還有io 口,要設(shè)為輸出方向,初始化函數(shù)完成數(shù)碼管用到的單片機(jī)資源的初始工作:void nixiettubeinit() wdtctl = wdt_adly_1_9; /看門狗內(nèi)部定時(shí)器模式16m sie1 |=

13、 wdtie;/允許看門狗中斷ctrl_dir_out;data_dir_out;首先,設(shè)置中斷并允許中斷;然后設(shè)置位選和段選所用的端口為輸出方向。ctrl_dir_p5dir|=0xffp3dir|=0xffp5outp3outout; data_dir_out; 和剛才用到的兩個 out的宏定義如下:#define data_dir_out#define ctrl_dir_out#define data_out#define ctrl_out這樣處理之后,要顯示數(shù)字就很簡單了:只需把要顯示的數(shù)字或字符的段碼值放入nixie8數(shù)組對應(yīng)的位置即可,如顯示韓輸入下:void nixiettube

14、displaychar( char ch, char addr) if (ch = dot) /小數(shù)點(diǎn),不需單獨(dú)占一位 nixieaddr |= tabch; else nixieaddr = tabch;如果是小數(shù)點(diǎn),放入對應(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 =

15、tabch;這個也是先判斷小數(shù)點(diǎn),小數(shù)點(diǎn)直接放到h段,其他的,則要已顯示的左移再覆蓋最右一位,源程序的注釋很詳細(xì),可具體才、可以下載附件的程序庫。數(shù)碼管清除函數(shù),這個函數(shù)把數(shù)碼管全部顯示去掉,即把緩存數(shù)組內(nèi)每項(xiàng)都置為0:void nixiettubeclear()for (int i = 0;i < 8;i+) nixiei = tabsp; 顯示空格程序比較簡單,這里就不多解釋了。數(shù)碼管的程序就這么多了,所有函數(shù)都列出來了。下面開始介紹printf的移植,具體過程不再詳細(xì)說了,詳細(xì)過程參考:msp430 程序庫 < 四>printf 和scanf函數(shù)移植。這里主要介紹所需程

16、序。單片機(jī)printf使用需要用戶提供底層驅(qū)動-putchar 函數(shù),printf完成格式化等一系列活動后調(diào)用putchar 輸出字符流。只要實(shí)現(xiàn) putchar ,包含stdio.h文件,就可以使用 pr intf函數(shù)。移植的數(shù)碼管的putchar函數(shù)如下:/*isdigit 函數(shù)需要該頭文件*/#include <stdio.h>#include "ctype.h"#include "nixietube.h" int putchar( int ch)/'f表示走紙翻頁,相當(dāng)于清除顯示 if (ch= 'n' 11c

17、h= 'r')nixiettubeclear();數(shù)字和對應(yīng)ascii字母之間差0x30'1'=0x31'2'=0x32./isdigit 也是c語言標(biāo)準(zhǔn)函數(shù) if (isdigit(ch)nixiettubeinsertchar(ch-0x30);/ 若字符是數(shù)字則顯示數(shù)字 switch (ch) case 'a': k; /字符acase 'b': k; /字符bcase 'c': k; /.case 'd': ak;case 'e': k;else否則,不是數(shù)字

18、,是字母/根據(jù)字母選擇程序分支breabreabreabrebreacase 'a' : nixiettubeinsertchar(aa);case 'b' : nixiettubeinsertchar(bb);case 'c' : nixiettubeinsertchar(cc);case 'd' : nixiettubeinsertchar(dd);case 'e' : nixiettubeinsertchar(ee);k;ak;ak;case 'f': case 'f : nixiet

19、tubelnsertchar(ff);case 'g': case 'g' : nixiettubelnsertchar(gg);case 'h' : case 'h' : nixiettubelnsertchar(hh);case 'i' : case 'i' : nixiettubelnsertchar(ii);case case k;case k;case eak ;case ak;case k;case ak;case k;case k;case ak ;case k;case k;case

20、 k;case k;case k;case eak ;casek; /case k; 字符z'j': case 'j': nixiettubeinsertchar(jj);'k': case 'k' : nixiettubeinsertchar(kk);'l': case 'l': nixiettubeinsertchar(ll);'m' : case 'm' : nixiettubeinsertchar(mm);'n':nixiettubeinser

21、tchar(nn);'n':nixiettubeinsertchar(nn);'o':nixiettubeinsertchar(oo);'o':nixiettubeinsertchar(oo);'p': case 'p' : nixiettubeinsertchar(pp);'q': case 'q': nixiettubeinsertchar(qq);'r': case 'r': nixiettubeinsertchar(rr);'s'

22、;: case 's' : nixiettubeinsertchar(ss);'t': case 't' : nixiettubeinsertchar(tt);'u':case'v':nixiettubeinsertchar(uu);'v':case'u':nixiettubeinsertchar(vv);'w : case 'w' : nixiettubeinsertchar(ww);'y':case'y':nixiettub

23、einsertchar(yy);breabrebrebreak ;break ; breabreabrbrebreabre brea breabrebreabreabreabreabreabr brea brea'z':case'z':nixiettubeinsertchar(zz);case '-' :nixiettubelnsertchar(neg);break;/字符-case '.' :nixiettubelnsertchar(dot);break; 小數(shù)點(diǎn),直接顯示在右下角case ' ':nixiett

24、ubelnsertchar(sp);break; /空格default :nixiettubelnsertchar(sp);break;/顯示不出來的字母用空格替代return (ch);/返回顯示的字符(putchar函數(shù)標(biāo)準(zhǔn)格式要求返回顯示字符)頭文件必須包含stdio.h ,這樣告訴編譯器 printf調(diào)用時(shí),用這里的 putchar函數(shù)。然 后判斷字符,分類進(jìn)行顯示,不能顯示的空一格。數(shù)碼管的程序就完成了,如果需要可以自己添加改寫函數(shù),如:當(dāng)和鍵盤共同使用時(shí),如果鍵盤移植了 scanf函數(shù),并且支持退格;可以改寫函數(shù) -讓數(shù)碼管的putchar支持 退格操作?;蛘哂玫氖俏业逆I盤程序,需

25、要10多ms調(diào)用一次鍵盤處理函數(shù), 這樣可以和這個數(shù)碼管掃描公用一個中斷:void display。 static char i = 0;/記錄掃描顯示到哪位ctrl_out = 1<<i;data_out = nixiei;i+;if(i>7) i = 0;keyprocess(); 這樣改寫,然后把鍵盤的中斷去掉(別忘了 key.h包含和加入keyprocess();的聲明;如果程序中有兩個指向同一個中斷時(shí),會編譯錯誤 );這樣就可以鍵盤、和數(shù)碼管共同使 用了。,使用示例:使用方法還是和之前一樣,工程中加入nixietube.c 文件,然后在要調(diào)用的地方加入nixietu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論