位7段LED數(shù)碼管顯示_第1頁
位7段LED數(shù)碼管顯示_第2頁
位7段LED數(shù)碼管顯示_第3頁
位7段LED數(shù)碼管顯示_第4頁
位7段LED數(shù)碼管顯示_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

西安建筑科技大學(xué)課程設(shè)計(jì)(論文)第-26-頁共-27-頁西安建筑科技大學(xué)課程設(shè)計(jì)(論文)設(shè)計(jì)目的與要求1.1設(shè)計(jì)目的1.了解6位7段LED數(shù)碼管的工作原理。2.熟悉并進(jìn)一步掌握定時(shí)器和時(shí)基信號的使用方法。3.掌握SPCE061A單片機(jī)控制LED數(shù)碼管顯示的方法。4.通過本次課程設(shè)計(jì)使學(xué)生對智能儀表與裝置系統(tǒng)有更深一步的了解,培養(yǎng)學(xué)生將理論知識綜合利用的能力,并與實(shí)踐緊密結(jié)合。5.掌握各子系統(tǒng)設(shè)計(jì)方法、步驟,培養(yǎng)學(xué)生創(chuàng)新能力,總結(jié)報(bào)告的能力。1.2設(shè)計(jì)環(huán)境1.裝有Windows系統(tǒng)和μ’nSP(TM)IDE仿真環(huán)境的PC機(jī)一臺,μ’nSP(TM)十六位單片機(jī)實(shí)驗(yàn)箱一個(gè)。2.本實(shí)驗(yàn)用到的實(shí)驗(yàn)箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個(gè)I/O口),6位8段數(shù)碼管電路模塊。1.3設(shè)計(jì)要求1.編程要求:主程序利用C語言編寫,中斷服務(wù)程序利用匯編語言編寫。2.實(shí)現(xiàn)功能:SPCE061A單片機(jī)控制6個(gè)LED數(shù)碼管的顯示。3.實(shí)驗(yàn)現(xiàn)象:運(yùn)行開始點(diǎn)亮所有的數(shù)碼管,6位LED數(shù)碼管均顯示0并持續(xù)1s。1s后,第一位數(shù)碼管從0顯示到9,刷新時(shí)間為0.5s,其他數(shù)碼管全部顯示0。當(dāng)?shù)谝晃粩?shù)碼管顯示到9后,第一位數(shù)碼管保持顯示9,第二位數(shù)碼管從0顯示到9,刷新時(shí)間為0.5s,其他數(shù)碼管顯示0。依次直到第6位數(shù)碼管顯示9,即6位數(shù)碼管全部顯示9,6位數(shù)碼管全部顯示0,持續(xù)1s,如此循環(huán)。(1s的時(shí)間、0.5s的時(shí)間都使用2Hz的時(shí)基信號(IRQ5)提供)。6位數(shù)碼管的顯示狀態(tài)見表1.表16位數(shù)碼管顯示狀態(tài)注意:①表中序號為0和61的狀態(tài)持續(xù)1s;其他狀態(tài)刷新時(shí)間為0.5s。②表中需要類似“1~10”表示有十個(gè)狀態(tài)。設(shè)計(jì)的方案與基本原理2.16位8段數(shù)碼管工作原理實(shí)驗(yàn)箱的6位8段數(shù)碼管電路采用“共陰”連接,陰極公共端(COM)由晶體管推動。實(shí)驗(yàn)箱上的數(shù)碼管共有兩種,如圖1。圖1兩種數(shù)碼管圖首先介紹兩個(gè)基本概念:段碼和位碼,段碼即段選信號SEG,它負(fù)責(zé)數(shù)碼管顯示的內(nèi)容,圖4-1中a~g、dp組成的數(shù)據(jù)(a為最低位,dp為最高位)就是段碼。比如1的段碼“0x06”(b=1,c=1,其他都為0,即段碼為00000110b),8的段碼為“0x7f”;位碼即位選信號DIG,它決定哪個(gè)數(shù)碼管工作,哪個(gè)數(shù)碼管不工作,比如僅使能DIG4,那么6個(gè)LED只有LED4工作,而其它的五個(gè)都不工作。當(dāng)需要某一位數(shù)碼管顯示數(shù)字時(shí),只需要先選中這位數(shù)碼管的位信號,再給顯示數(shù)字的段碼。比如當(dāng)在第一個(gè)數(shù)碼管上顯示一個(gè)“6”時(shí),如圖2,先選中第一位數(shù)碼管的位信號(實(shí)驗(yàn)箱上標(biāo)號是“1”),即先給和“1”相連接的I/O口送1;再把段碼設(shè)置為0x007d,即在a、c、d、e、f、g各段引出的端口檢測到高電平,就可以顯示一個(gè)“6”出來。圖2數(shù)碼管顯示“6”2.2實(shí)驗(yàn)箱上SPCE061A控制6位8段數(shù)碼管的顯示實(shí)驗(yàn)箱在6位8段數(shù)碼管的上面有16對排針,其中有7個(gè)“a\b\c\d\e\f\g\”是控制此6位8段數(shù)碼管的段碼選擇的,另有6個(gè)“1\2\3\4\5\6”是控制6位8段數(shù)碼管位選擇的,“DD”控制“點(diǎn)”或“分隔符號”,“DP”控制小數(shù)點(diǎn)。把實(shí)驗(yàn)箱上JP4和JP5的引針用跳線全部短接。框圖如圖3。圖3實(shí)驗(yàn)箱上SPCE061A和6位LED顯示電路模塊的連接按照上面數(shù)碼管的顯示原理,當(dāng)要在第四個(gè)數(shù)碼管上顯示一個(gè)“E”時(shí),先要通過IOB12端口給“4”端口送一個(gè)1,選中第四個(gè)數(shù)碼管;由圖4-1可以看出,顯示“E”時(shí),需要a、d、e、f、g段被點(diǎn)亮,所以給IOA0、IOA3、IOA4、IOA5、IOA6端口各送一個(gè)1,則在a、d、e、f、g端口各能檢測到一個(gè)高電平,就可以點(diǎn)亮a、d、e、f、g段,顯示一個(gè)“E”。2.3動態(tài)顯示原理動態(tài)顯示是數(shù)碼管顯示比較常用的方式,可以很好的解決端口資源緊張問題。下面以四位數(shù)碼管為例說明動態(tài)顯示的原理,如圖4所示圖44位*7段數(shù)碼管動態(tài)顯示原理圖動態(tài)顯示的過程:以顯示“1234”為例說明,首先發(fā)送“1”的段碼“0x06”至數(shù)碼管,然后僅使能位信號DIG4,LED4就會顯示“1”,其余的數(shù)碼管都是不工作的;延時(shí)一定時(shí)間之后再發(fā)送“2”的段碼“0x5b”至數(shù)碼管,同時(shí)僅使能位信號DIG3,這時(shí)“2”就會在LED3上顯示出來;延時(shí)之后再發(fā)送“3”的段碼并使能位信號DIG2,LED2就會顯示“3”;延時(shí)一定時(shí)間之后再發(fā)送“4”的段碼并使能位信號DIG1,LED1就會顯示“4”;延時(shí)之后再回過頭來重新發(fā)送“1”的代碼,并選中位信號DIG4,重復(fù)循環(huán)點(diǎn)亮數(shù)碼管。由于相鄰兩次(第一次點(diǎn)亮LED4和第二次點(diǎn)亮LED4)的時(shí)間間隔很短(t<10ms),看起來仿佛LED4一直在顯示“1”,4各數(shù)碼管整體看起來就在顯示“1234”。動態(tài)顯示的延時(shí)很重要,延時(shí)太短,數(shù)碼管發(fā)光時(shí)間過短,數(shù)碼管的亮度不夠;延時(shí)太長,回掃間隔過大(超過11ms),肉眼就會感覺到閃爍。該例程采用4KHz中斷作為時(shí)間基準(zhǔn)執(zhí)行動態(tài)掃描,每來一次中斷,顯示自動移位,回掃時(shí)間t=0.25ms*6=1.5ms。通過對I/O口的控制,定時(shí)1s的時(shí)間和0.5s的時(shí)間都使用2Hz的時(shí)基信號(IRQ5)。按照基礎(chǔ)實(shí)驗(yàn)中IRQ5中斷的工作原理,響應(yīng)一次IRQ5_2Hz中斷需要0.5s的時(shí)間,而響應(yīng)兩次中斷的時(shí)間剛好是1s。按照實(shí)驗(yàn)要求,當(dāng)開IRQ5_2Hz中斷時(shí),6位數(shù)碼管全部顯示“0”后,響應(yīng)兩次IRQ5_2Hz中斷,再從第一個(gè)數(shù)碼管開始顯示;而刷新時(shí)間剛好是響應(yīng)一次IRQ5_2Hz中斷的時(shí)間。2.4unSPIDE2.0.0簡介1.為什么推出unSPIDE2.0.0D(R)為了提高μ’nSPIDE工具的兼容性,讓μ’nSPIDE工具能支持更多的芯片,并且由于實(shí)驗(yàn)箱實(shí)驗(yàn)指導(dǎo)書的全面改版,IDE下的例程全面修改、更新,凌陽科技推出了μ’nSPIDE工具的最新版本——unSPIDE2.0.0(以下簡稱:IDE2.0.0)。IDE2.0.0作為μ’nSPIDE工具截止現(xiàn)在(2005-11-11)最新的一個(gè)版本,它不但繼承以前版本IDE的特點(diǎn),同時(shí)增加了一些新的功能,集納了眾多用戶在使用μ’nSPIDE過程中提出的一些意見,并包含了一些新的例程。除增加了一些新的功能外,IDE2.0.0在編譯優(yōu)化、代碼查錯(cuò)定位等方面都有了一定的進(jìn)步,用戶在使用本版IDE時(shí),應(yīng)該可以體會到,其對代碼的嚴(yán)謹(jǐn)性有了更高的要求。而在新版IDE的各個(gè)方面,都有所加強(qiáng),用戶在使用過程當(dāng)用會有所體會。新添加功能、加強(qiáng)原有功能等,都沒有改變unSPIDE一慣的使用方法,所以用戶可以參考unSPIDE184(R)的用戶手冊,以學(xué)習(xí)μ’nSPIDE的基本操作及相關(guān)知識,這在IDE2.0.0的使用當(dāng)中是保持不變的。2.從IDE184到IDE2.0.0D的變化IDE1.8.4是用戶用的最多的一版μ’nSPIDE工具,實(shí)際上在推出IDE1.8.4之后,μ’nSPIDE也在不斷的升級,其間也出現(xiàn)了非常多的版本,比如已發(fā)布的就有IDE1.16.1和IDE1.18.1;但相比之下,IDE2.0.0的版本有更多細(xì)節(jié)的完善,更多新功能的添加,為用戶的代碼編輯、工程調(diào)試等提供了更人性化的輔助功能和更便利的工具。從較大的區(qū)別來看,IDE2.0.0工具由IDE1.8.4支持兩顆芯片變?yōu)橹С炙念w芯片,增加了許多新的功能,并對一些舊的功能進(jìn)行了改善,同時(shí)對IDE1.8.4下包含的例程進(jìn)行了修改、更新和規(guī)范化,走過了很長的路程,是對前面μ’nSPIDE工具版本的升級。而IDE在安裝后的文件結(jié)構(gòu)發(fā)生了一些變化,為后期加入更多的新芯片提供了統(tǒng)一的平臺,也更符合IDE版本維護(hù)的要求。從細(xì)節(jié)上看,IDE2.0.0在代碼編譯、優(yōu)化以及錯(cuò)誤、警告定位方面都作了改進(jìn),在調(diào)試時(shí)的增加變量提示、在Memery觀察窗中數(shù)據(jù)變化以紅色提示等等;為用戶的軟件編輯、調(diào)試提供了更加友好的界面。在網(wǎng)上提供的《IDEUserguide》(unSPIDE184用戶手冊)中詳細(xì)地介紹了μ’nSPIDE工具的使用方法.2.5系統(tǒng)硬件連接硬件連接圖如圖3,IOA0~IOA7分別接數(shù)碼管的7個(gè)段信號a~g和小數(shù)點(diǎn)信號dp,IOB15~IOB12連接數(shù)碼管的位信號1~4,IOB2~IOB1連接數(shù)碼管的位信號5~6,IOB0連接數(shù)碼管的分隔符號信號DD,即把JP4和JP5的引針用跳線全部短接。硬件電路連接圖程序設(shè)計(jì)本程序由主程序和中斷服務(wù)程序組成。3.1主程序主程序流程圖如圖5。先進(jìn)行系統(tǒng)初始化;開2Hz中斷;進(jìn)入數(shù)碼管循環(huán)顯示程序:判斷位信號寄存器是否為0(位信號寄存器由讀者自己定義,這個(gè)寄存器的內(nèi)容在中斷里會改變),如果為0,6位數(shù)碼管顯示“000000”;如果不為零,按照位信號和段碼顯示數(shù)據(jù)進(jìn)行顯示。圖4-5主程序流程圖主程序:#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延時(shí)unsignedintg_uiFlag; //用于控制數(shù)碼管unsignedintg_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};//0, 1, 2, 3, 4, 5, 6, 7, 8, 9unsignedintg_uiSeg; //段碼指針3.2中斷服務(wù)程序由于顯示數(shù)據(jù)的刷新時(shí)間為1s和0.5s,因此考慮采用2Hz(0.5s)時(shí)基中斷。并且在中斷內(nèi)部完成段碼數(shù)據(jù)更新。具體的流程如圖6示:在中斷服務(wù)程序中會用到三個(gè)重要的寄存器:中斷計(jì)數(shù)寄存器、顯示數(shù)據(jù)寄存器、位信號寄存器。其中中斷計(jì)數(shù)寄存器用于記錄第幾次進(jìn)入中斷(前3次有效),顯示數(shù)據(jù)寄存器的內(nèi)容為當(dāng)前被刷新顯示數(shù)據(jù)的數(shù)值(0~9),位信號寄存器用于標(biāo)識被刷新數(shù)據(jù)所在位。結(jié)合主程序分析中斷程序:首先顯示“000000”時(shí)需要延時(shí)1s,使用2Hz中斷產(chǎn)生1s延時(shí),需要連續(xù)響應(yīng)兩次中斷,第二次響應(yīng)中斷延時(shí)滿1s,設(shè)置顯示數(shù)據(jù)寄存器和位信號寄存器,讓第一位數(shù)碼管顯示1,其余各位仍為“0”,即顯示“100000”;判斷顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)是否大于9,如果小于,顯示數(shù)據(jù)寄存器數(shù)據(jù)加1;如果大于,判斷位信號寄存器是否已經(jīng)指向第六位數(shù)碼管,否則位信號寄存器設(shè)置為指向下一位數(shù)碼管,顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)設(shè)置為0;如果已經(jīng)指向第六位數(shù)碼且顯示數(shù)據(jù)寄存器為9,寄存器清零,清中斷標(biāo)志,中斷返回。中斷服務(wù)程序流程圖:圖6中斷服務(wù)程序流程圖中斷服務(wù)程序:intmain(void){ unsignedintDis1[6]={0x003f,0x003f,0x003f,0x003f}; unsignedintuiIntStatus; uiIntStatus=*P_INT_Ctrl_New; //開2Hz中斷 uiIntStatus|=C_IRQ5_2Hz; *P_INT_Ctrl=uiIntStatus; g_uiFlag=0x0000; //該變量在2Hz中斷當(dāng)中會被修改 g_uiSeg=0; //該變量在2Hz中斷當(dāng)中會被修改,以便及時(shí)刷新顯示DIG_Init(); //顯示初始化,同時(shí)會打開IRQ4的4KHz中斷 while(1) { if(g_uiFlag==0x0000) { DIG_SetAll(Dis1); //設(shè)置數(shù)碼管全部顯示0 } if(g_uiFlag!=0x0000) { DIG_Set(g_uiFlag,g_Data[g_uiSeg]); //刷新6位數(shù)碼管顯示值 } *P_Watchdog_Clear=0x0001; }}4.調(diào)試4.1實(shí)驗(yàn)步驟1.新建一個(gè)工程ex1_Led_Show,新建一個(gè)C語言文件main.c,新建一個(gè)匯編語言文件isr.asm。(根據(jù)讀者需要可以自己新建文件)2.拷貝頭文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,這兩個(gè)文件在IDE的安裝路徑\SPCE061A\include路徑下可以找到。3.添加SPCE061A.h、SPCE061A.inc到工程的“HeadFiles”;添加后可以直接用這兩個(gè)頭文件中申明的變量或者地址單元。4.按照程序流程圖編寫程序。5.RebuildAll。6.按照硬件連接圖連接電路,注意斷開JP3和JP7的所有引針,以免影響輸出顯示數(shù)據(jù)。4.2調(diào)試結(jié)果調(diào)試結(jié)果如下圖:運(yùn)行開始時(shí)圖7運(yùn)行開始時(shí)運(yùn)行到第1位9、第2位1時(shí)圖8運(yùn)行到第1位9、第2位1時(shí)運(yùn)行到前兩位都為9時(shí)圖9運(yùn)行到前兩位都為9時(shí)運(yùn)行到6位都為9時(shí)圖10運(yùn)行到6位都為9時(shí)5.總結(jié)在這為期兩周的課程設(shè)計(jì)中,通過對6位7段LED數(shù)碼管顯示的設(shè)計(jì)與分析,我清楚地認(rèn)識到了自己以前僅僅學(xué)到的書本上的知識的欠缺與經(jīng)驗(yàn)的不足,所謂實(shí)踐出真知,智能儀器本就是一種實(shí)踐操作環(huán)節(jié)十分重要的課程,而這次的課設(shè)正好彌補(bǔ)了我操作方面的不足,進(jìn)而更加鞏固了這方面的知識。課程設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。尤其是硬件方面的知識,我們更為的稀少,以前的課程中學(xué)到的基本都是軟件方面LabVIEW的使用等等,而硬件卻是很少接觸到,因此對于硬件我們是知之甚少。然而我們通過不斷地查閱6位7段LED數(shù)碼管和IDE的相關(guān)資料,對其有了進(jìn)一步的認(rèn)識,還有硬件設(shè)備與軟件的連接,我們也都出現(xiàn)過問題,但最總都能認(rèn)真的一一排除予以解決。最終,我們達(dá)到了任務(wù)書上的要求,完成了本次的智能儀器課程設(shè)計(jì)。在今后社會的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會及他人對你的認(rèn)可!最后感謝本次課程設(shè)計(jì)中老師與同學(xué)們的幫助與指導(dǎo),使我獲益匪淺!6.參考資料【1】朱麟章蒙建波主編.檢測理論及應(yīng)用.重慶大學(xué)出版社2007.8(2)【2】張國雄編著.測控電路天津大學(xué)出版社2005.1【3】費(fèi)業(yè)泰編著.誤差理論與數(shù)據(jù)處理.合肥工業(yè)出版社2005.1【4】王志剛編著.單片機(jī)應(yīng)用技術(shù)及實(shí)訓(xùn).北京:清華大學(xué)出版社2004.5附錄設(shè)計(jì)程序匯總Main.c#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延時(shí)unsignedintg_uiFlag; //用于控制數(shù)碼管unsignedintg_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f}; //0, 1, 2, 3, 4, 5, 6, 7, 8, 9unsignedintg_uiSeg; //段碼指針//========================================================// 語法格式: intmain(void)// 實(shí)現(xiàn)功能: 數(shù)碼管顯示// 參數(shù): 無// 返回值: 無//========================================================intmain(void){ unsignedintDis1[6]={0x003f,0x003f,0x003f,0x003f}; unsignedintuiIntStatus; uiIntStatus=*P_INT_Ctrl_New; //開2Hz中斷 uiIntStatus|=C_IRQ5_2Hz; *P_INT_Ctrl=uiIntStatus; g_uiFlag=0x0000; //該變量在2Hz中斷當(dāng)中會被修改 g_uiSeg=0; //該變量在2Hz中斷當(dāng)中會被修改,以便及時(shí)刷新顯示 DIG_Init(); //顯示初始化,同時(shí)會打開IRQ4的4KHz中斷 while(1) { if(g_uiFlag==0x0000) { DIG_SetAll(Dis1); //設(shè)置數(shù)碼管全部顯示0 } if(g_uiFlag!=0x0000) { DIG_Set(g_uiFlag,g_Data[g_uiSeg]); //刷新6位數(shù)碼管顯示值 } *P_Watchdog_Clear=0x0001; }}Isr.asm.INCLUDESPCE061A.inc.INCLUDEDig.inc.EXTERNAL_g_uiFirst.EXTERNAL_g_uiFlag.EXTERNAL_g_uiSeg.TEXT//========================================================// 匯編格式: _IRQ4// 實(shí)現(xiàn)功能: 1KHz中斷調(diào)用F_DIG_Drive函數(shù)// 參數(shù): 無// 返回值: 無//========================================================.PUBLIC_IRQ4_IRQ4: pushr1,r5to[sp] r1=C_IRQ4_1KHz testr1,[P_INT_Ctrl] jnz?L_IRQ4_1KHz r1=C_IRQ4_2KHz testr1,[P_INT_Ctrl] jnz?L_IRQ4_2KHz?L_IRQ4_4KHz: callF_DIG_Drive//F_DIG_Drive函數(shù)是數(shù)碼管顯示函數(shù),定義在Dig.asm文件中 r1=C_IRQ4_4KHz [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ4_2KHz: [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ4_1KHz: callF_DIG_Drive [P_INT_Clear]=r1 popr1,r5from[sp] reti//========================================================// 匯編格式: _IRQ5// 實(shí)現(xiàn)功能: 2Hz中斷進(jìn)行顯示處理// 參數(shù): 無// 返回值: 無//========================================================.PUBLIC_IRQ5_IRQ5: pushr1,r5to[sp] r1=C_IRQ5_2Hz testr1,[P_INT_Ctrl] jnz?L_IRQ5_2Hz?L_IRQ5_4Hz: r1=C_IRQ5_4Hz [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ5_2Hz: r1=[_g_uiFirst] cmpr1,0x0001 //第2次進(jìn)入中斷 ja?Start //時(shí)間〉=1s r1=[_g_uiFirst] //時(shí)間小于1s r1+=1 [_g_uiFirst]=r1 goto?Exit ?Start: r1=[_g_uiFirst] cmpr1,2 //1s jne?Next r1+=1 //初始化g_uiFlag、g_uiSeg顯示"1000" [_g_uiFirst]=r1 r1=1 [_g_uiFlag]=r1 r1=2 [_g_uiSeg]=r1 goto?Exit?Next: r1=[_g_uiSeg] cmpr1,9 //更改段碼指針,顯示數(shù)值加1 ja?Next1 r1+=1 [_g_uiSeg]=r1 goto?Exit?Next1: r1=[_g_uiFlag] //更改被刷新數(shù)碼管位 cmpr1,4 je?Last r1+=1 [_g_uiFlag]=r1 r1=2 [_g_uiSeg]=r1 goto?Exit?Last: r1=0x0000 //置標(biāo)志,重新顯示“000000” [_g_uiFirst]=r1 [_g_uiFlag]=r1 goto?Exit?Exit: r1=C_IRQ5_2Hz [P_INT_Clear]=r1 popr1,r5from[sp] RetiDig.asm.DEFINESEG_IO_Port 0 //若LED段選使用IOA口則采用該行定義//.DEFINESEG_IO_Port 1 //若LED段選使用IOB口則采用該行定義.DEFINESEG_IO_HighByte 0 //若LED段選使用IO口低8位則采用該行定義//.DEFINESEG_IO_HighByte 1 //若LED段選使用IO口高8位則采用該行定義//================================================// LED位控制端口設(shè)定//================================================//.DEFINEDIG_IO_Port 0 //若LED位選使用IOA口則采用該行定義.DEFINEDIG_IO_Port 1 //若LED位選使用IOB口則采用該行定義/////數(shù)碼管的位數(shù)/////.DEFINEDIG_Count 4/////數(shù)碼管每一位的控制腳設(shè)定/////.DATAPIN_DIG: .DW0x0004,0x0008,0x0010,0x0020; /////數(shù)碼管所有位的控制腳設(shè)定,應(yīng)等于PIN_DIG所有數(shù)之和/////.DEFINEPIN_DIG_ALL 0x003C//================================================// 不必修改下面的定義//================================================.IF SEG_IO_Port==0 .DEFINEP_SEG_Data 0x7000 .DEFINEP_SEG_Buf 0x7001 .DEFINEP_SEG_Dir 0x7002 .DEFINEP_SEG_Attrib 0x7003.ELSE .DEFINEP_SEG_Data 0x7005 .DEFINEP_SEG_Buf 0x7006 .DEFINEP_SEG_Dir 0x7007 .DEFINEP_SEG_Attrib 0x7008.ENDIF.IFSEG_IO_HighByte==0 .DEFINEPIN_SEG_ALL 0x00ff.ELSE .DEFINEPIN_SEG_ALL 0xff00.ENDIF.IF DIG_IO_Port==0 .DEFINEP_DIG_Data 0x7000 .DEFINEP_DIG_Buf 0x7001 .DEFINEP_DIG_Dir 0x7002 .DEFINEP_DIG_Attrib 0x7003.ELSE .DEFINEP_DIG_Data 0x7005 .DEFINEP_DIG_Buf 0x7006 .DEFINEP_DIG_Dir 0x7007 .DEFINEP_DIG_Attrib 0x7008.ENDIF//================================================// 中斷常量定義//================================================.DEFINEP_INT_Mask 0x702d.DEFINEC_IRQ4_4KHz 0x0040//================================================// 變量定義//================================================.RAMR_DIG_Buf: .DW DIG_CountDUP(?) //數(shù)碼管顯示緩沖區(qū).IRAMR_CurDIG: .DW 0xffff //當(dāng)前顯示的數(shù)碼管位,0xffff表示不顯示//================================================// 公有函數(shù)聲明//================================================.PUBLICF_DIG_Init.PUBLIC_DIG_Init.PUBLICF_DIG_Set.PUBLIC_DIG_Set.PUBLICF_DIG_SetAll.PUBLIC_DIG_SetAll.PUBLICF_DIG_Get.PUBLIC_DIG_Get.PUBLICF_DIG_GetAll.PUBLIC_DIG_GetAll.PUBLICF_DIG_Drive.PUBLIC_DIG_Drive.PUBLICF_DIG_Off.PUBLIC_DIG_Off.PUBLICF_DIG_On.PUBLIC_DIG_On.code//======================================================//函數(shù)名稱: DIG_Init//C調(diào)用: voidDIG_Init(void)//匯編調(diào)用: F_DIG_Init//實(shí)現(xiàn)功能:數(shù)碼管顯示初始化,該函數(shù)將開啟IRQ4_4KHz中斷//入口參數(shù): 無//出口參數(shù): 無//破壞寄存器: 無//======================================================_DIG_Init:F_DIG_Init: pushr1,bpto[sp] INTOff r1=DIG_Count r2=0x0000 bp=R_DIG_Buf?DIG_InitBuf: //清除顯示緩沖區(qū) [bp++]=r2 r1-=1 jnz?DIG_InitBuf [R_CurDIG]=r2 //當(dāng)前顯示的位設(shè)置為0 r1=[P_SEG_Attrib] //初始化段選IO r1|=PIN_SEG_ALL [P_SEG_Attrib]=r1 r1=[P_SEG_Buf] r1&=~PIN_SEG_ALL [P_SEG_Data]=r1 r1=[P_SEG_Dir] r1|=PIN_SEG_ALL [P_SEG_Dir]=r1 r1=[P_DIG_Attrib] //初始化位選IO r1|=PIN_DIG_ALL [P_DIG_Attrib]=r1 r1=[P_DIG_Buf] r1&=~PIN_DIG_ALL [P_DIG_Buf]=r1 r1=[P_DIG_Dir] r1|=PIN_DIG_ALL [P_DIG_Dir]=r1 r1=[P_INT_Mask] //開啟IRQ4_4KHz中斷 r1|=C_IRQ4_4KHz [P_INT_Mask]=r1 INTFIQ,IRQ popr1,bpfrom[sp]retf//======================================================//函數(shù)名稱: DIG_Set//C調(diào)用: voidDIG_Set(unsignedDigPos,unsignedDigBuffer)//匯編調(diào)用: F_DIG_Set//實(shí)現(xiàn)功能:設(shè)置數(shù)碼管某一位的顯示內(nèi)容//入口參數(shù): DigPos(r1)-設(shè)置的數(shù)碼管位(1~DIG_Count)// DigBuffer(r2)-數(shù)碼管的顯示內(nèi)容//出口參數(shù): 無//破壞寄存器: 無//======================================================_DIG_Set: pushr1,r2to[sp] r1=sp+5 r1=[r1] r2=sp+6 r2=[r2] callF_DIG_Set popr1,r2from[sp]retfF_DIG_Set: pushbpto[sp].IFSEG_IO_HighByte==1 r2=r2lsl4 r2=r2lsl4.ENDIF r1-=1 cmpr1,DIG_Count //如果"位"值超出范圍則退出 ja?Exit bp=R_DIG_Buf //將R_DIG_Buf的相應(yīng)元素修改為設(shè)定值 bp+=r1 [bp]=r2?Exit: popbpfrom[sp]retf//======================================================//函數(shù)名稱: DIG_SetAll//C調(diào)用: voidDIG_SetAll(unsigned*DigBuffer)//匯編調(diào)用: F_DIG_SetAll//實(shí)現(xiàn)功能:設(shè)置所有數(shù)碼管的顯示內(nèi)容//入口參數(shù): DigBuffer(r1)-數(shù)碼管顯示內(nèi)容的起始地址//出口參數(shù): 無//破壞寄存器: 無//======================================================_DIG_SetAll: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_SetAll popbpfrom[sp]retfF_DIG_SetAll: pushr2,bpto[sp] bp=r1 r2=DIG_Count r3=R_DIG_Buf?DIG_Set_Loop: r1=[bp++] //將R_DIG_Buf修改為設(shè)定值.IFSEG_IO_HighByte==1 r1=r1lsl4 r1=r1lsl4.ENDIF [r3++]=r1 r2-=1 jnz?DIG_Set_Loop popr2,bpfrom[sp]retf//======================================================//函數(shù)名稱: DIG_Get//C調(diào)用: unsignedDIG_Get(unsignedDigPos)//匯編調(diào)用: F_DIG_Get//實(shí)現(xiàn)功能:獲取所有數(shù)碼管的顯示內(nèi)容//入口參數(shù): DigPos(r1)-要獲取顯示內(nèi)容的位//出口參數(shù): 該位數(shù)碼管的顯示內(nèi)容//破壞寄存器: 無//======================================================_DIG_Get: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_Get popbpfrom[sp]retfF_DIG_Get: pushr2to[sp] r2=R_DIG_Buf r2+=r1 r1=[r2] popr2from[sp]retf//======================================================//函數(shù)名稱: DIG_GetAll//C調(diào)用: unsigned*DIG_GetAll(unsigned*DigBuffer)//匯編調(diào)用: F_DIG_GetAll//實(shí)現(xiàn)功能:獲取所有數(shù)碼管的顯示內(nèi)容//入口參數(shù): DigBuffer(r1)-保存數(shù)碼管顯示內(nèi)容的起始地址//出口參數(shù): 保存數(shù)碼管顯示內(nèi)容的起始地址//破壞寄存器: 無//======================================================_DIG_GetAll: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_GetAll popbpfrom[sp

溫馨提示

  • 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

提交評論