版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
西安建筑科技大學(xué)課程設(shè)計(論文)第-26-頁共-27-頁西安建筑科技大學(xué)課程設(shè)計(論文)設(shè)計目的與要求1.1設(shè)計目的1.了解6位7段LED數(shù)碼管的工作原理。2.熟悉并進一步掌握定時器和時基信號的使用方法。3.掌握SPCE061A單片機控制LED數(shù)碼管顯示的方法。4.通過本次課程設(shè)計使學(xué)生對智能儀表與裝置系統(tǒng)有更深一步的了解,培養(yǎng)學(xué)生將理論知識綜合利用的能力,并與實踐緊密結(jié)合。5.掌握各子系統(tǒng)設(shè)計方法、步驟,培養(yǎng)學(xué)生創(chuàng)新能力,總結(jié)報告的能力。1.2設(shè)計環(huán)境1.裝有Windows系統(tǒng)和μ’nSP(TM)IDE仿真環(huán)境的PC機一臺,μ’nSP(TM)十六位單片機實驗箱一個。2.本實驗用到的實驗箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個I/O口),6位8段數(shù)碼管電路模塊。1.3設(shè)計要求1.編程要求:主程序利用C語言編寫,中斷服務(wù)程序利用匯編語言編寫。2.實現(xiàn)功能:SPCE061A單片機控制6個LED數(shù)碼管的顯示。3.實驗現(xiàn)象:運行開始點亮所有的數(shù)碼管,6位LED數(shù)碼管均顯示0并持續(xù)1s。1s后,第一位數(shù)碼管從0顯示到9,刷新時間為0.5s,其他數(shù)碼管全部顯示0。當?shù)谝晃粩?shù)碼管顯示到9后,第一位數(shù)碼管保持顯示9,第二位數(shù)碼管從0顯示到9,刷新時間為0.5s,其他數(shù)碼管顯示0。依次直到第6位數(shù)碼管顯示9,即6位數(shù)碼管全部顯示9,6位數(shù)碼管全部顯示0,持續(xù)1s,如此循環(huán)。(1s的時間、0.5s的時間都使用2Hz的時基信號(IRQ5)提供)。6位數(shù)碼管的顯示狀態(tài)見表1.表16位數(shù)碼管顯示狀態(tài)注意:①表中序號為0和61的狀態(tài)持續(xù)1s;其他狀態(tài)刷新時間為0.5s。②表中需要類似“1~10”表示有十個狀態(tài)。設(shè)計的方案與基本原理2.16位8段數(shù)碼管工作原理實驗箱的6位8段數(shù)碼管電路采用“共陰”連接,陰極公共端(COM)由晶體管推動。實驗箱上的數(shù)碼管共有兩種,如圖1。圖1兩種數(shù)碼管圖首先介紹兩個基本概念:段碼和位碼,段碼即段選信號SEG,它負責數(shù)碼管顯示的內(nèi)容,圖4-1中a~g、dp組成的數(shù)據(jù)(a為最低位,dp為最高位)就是段碼。比如1的段碼“0x06”(b=1,c=1,其他都為0,即段碼為00000110b),8的段碼為“0x7f”;位碼即位選信號DIG,它決定哪個數(shù)碼管工作,哪個數(shù)碼管不工作,比如僅使能DIG4,那么6個LED只有LED4工作,而其它的五個都不工作。當需要某一位數(shù)碼管顯示數(shù)字時,只需要先選中這位數(shù)碼管的位信號,再給顯示數(shù)字的段碼。比如當在第一個數(shù)碼管上顯示一個“6”時,如圖2,先選中第一位數(shù)碼管的位信號(實驗箱上標號是“1”),即先給和“1”相連接的I/O口送1;再把段碼設(shè)置為0x007d,即在a、c、d、e、f、g各段引出的端口檢測到高電平,就可以顯示一個“6”出來。圖2數(shù)碼管顯示“6”2.2實驗箱上SPCE061A控制6位8段數(shù)碼管的顯示實驗箱在6位8段數(shù)碼管的上面有16對排針,其中有7個“a\b\c\d\e\f\g\”是控制此6位8段數(shù)碼管的段碼選擇的,另有6個“1\2\3\4\5\6”是控制6位8段數(shù)碼管位選擇的,“DD”控制“點”或“分隔符號”,“DP”控制小數(shù)點。把實驗箱上JP4和JP5的引針用跳線全部短接??驁D如圖3。圖3實驗箱上SPCE061A和6位LED顯示電路模塊的連接按照上面數(shù)碼管的顯示原理,當要在第四個數(shù)碼管上顯示一個“E”時,先要通過IOB12端口給“4”端口送一個1,選中第四個數(shù)碼管;由圖4-1可以看出,顯示“E”時,需要a、d、e、f、g段被點亮,所以給IOA0、IOA3、IOA4、IOA5、IOA6端口各送一個1,則在a、d、e、f、g端口各能檢測到一個高電平,就可以點亮a、d、e、f、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ù)碼管都是不工作的;延時一定時間之后再發(fā)送“2”的段碼“0x5b”至數(shù)碼管,同時僅使能位信號DIG3,這時“2”就會在LED3上顯示出來;延時之后再發(fā)送“3”的段碼并使能位信號DIG2,LED2就會顯示“3”;延時一定時間之后再發(fā)送“4”的段碼并使能位信號DIG1,LED1就會顯示“4”;延時之后再回過頭來重新發(fā)送“1”的代碼,并選中位信號DIG4,重復(fù)循環(huán)點亮數(shù)碼管。由于相鄰兩次(第一次點亮LED4和第二次點亮LED4)的時間間隔很短(t<10ms),看起來仿佛LED4一直在顯示“1”,4各數(shù)碼管整體看起來就在顯示“1234”。動態(tài)顯示的延時很重要,延時太短,數(shù)碼管發(fā)光時間過短,數(shù)碼管的亮度不夠;延時太長,回掃間隔過大(超過11ms),肉眼就會感覺到閃爍。該例程采用4KHz中斷作為時間基準執(zhí)行動態(tài)掃描,每來一次中斷,顯示自動移位,回掃時間t=0.25ms*6=1.5ms。通過對I/O口的控制,定時1s的時間和0.5s的時間都使用2Hz的時基信號(IRQ5)。按照基礎(chǔ)實驗中IRQ5中斷的工作原理,響應(yīng)一次IRQ5_2Hz中斷需要0.5s的時間,而響應(yīng)兩次中斷的時間剛好是1s。按照實驗要求,當開IRQ5_2Hz中斷時,6位數(shù)碼管全部顯示“0”后,響應(yīng)兩次IRQ5_2Hz中斷,再從第一個數(shù)碼管開始顯示;而刷新時間剛好是響應(yīng)一次IRQ5_2Hz中斷的時間。2.4unSPIDE2.0.0簡介1.為什么推出unSPIDE2.0.0D(R)為了提高μ’nSPIDE工具的兼容性,讓μ’nSPIDE工具能支持更多的芯片,并且由于實驗箱實驗指導(dǎo)書的全面改版,IDE下的例程全面修改、更新,凌陽科技推出了μ’nSPIDE工具的最新版本——unSPIDE2.0.0(以下簡稱:IDE2.0.0)。IDE2.0.0作為μ’nSPIDE工具截止現(xiàn)在(2005-11-11)最新的一個版本,它不但繼承以前版本IDE的特點,同時增加了一些新的功能,集納了眾多用戶在使用μ’nSPIDE過程中提出的一些意見,并包含了一些新的例程。除增加了一些新的功能外,IDE2.0.0在編譯優(yōu)化、代碼查錯定位等方面都有了一定的進步,用戶在使用本版IDE時,應(yīng)該可以體會到,其對代碼的嚴謹性有了更高的要求。而在新版IDE的各個方面,都有所加強,用戶在使用過程當用會有所體會。新添加功能、加強原有功能等,都沒有改變unSPIDE一慣的使用方法,所以用戶可以參考unSPIDE184(R)的用戶手冊,以學(xué)習(xí)μ’nSPIDE的基本操作及相關(guān)知識,這在IDE2.0.0的使用當中是保持不變的。2.從IDE184到IDE2.0.0D的變化IDE1.8.4是用戶用的最多的一版μ’nSPIDE工具,實際上在推出IDE1.8.4之后,μ’nSPIDE也在不斷的升級,其間也出現(xiàn)了非常多的版本,比如已發(fā)布的就有IDE1.16.1和IDE1.18.1;但相比之下,IDE2.0.0的版本有更多細節(jié)的完善,更多新功能的添加,為用戶的代碼編輯、工程調(diào)試等提供了更人性化的輔助功能和更便利的工具。從較大的區(qū)別來看,IDE2.0.0工具由IDE1.8.4支持兩顆芯片變?yōu)橹С炙念w芯片,增加了許多新的功能,并對一些舊的功能進行了改善,同時對IDE1.8.4下包含的例程進行了修改、更新和規(guī)范化,走過了很長的路程,是對前面μ’nSPIDE工具版本的升級。而IDE在安裝后的文件結(jié)構(gòu)發(fā)生了一些變化,為后期加入更多的新芯片提供了統(tǒng)一的平臺,也更符合IDE版本維護的要求。從細節(jié)上看,IDE2.0.0在代碼編譯、優(yōu)化以及錯誤、警告定位方面都作了改進,在調(diào)試時的增加變量提示、在Memery觀察窗中數(shù)據(jù)變化以紅色提示等等;為用戶的軟件編輯、調(diào)試提供了更加友好的界面。在網(wǎng)上提供的《IDEUserguide》(unSPIDE184用戶手冊)中詳細地介紹了μ’nSPIDE工具的使用方法.2.5系統(tǒng)硬件連接硬件連接圖如圖3,IOA0~IOA7分別接數(shù)碼管的7個段信號a~g和小數(shù)點信號dp,IOB15~IOB12連接數(shù)碼管的位信號1~4,IOB2~IOB1連接數(shù)碼管的位信號5~6,IOB0連接數(shù)碼管的分隔符號信號DD,即把JP4和JP5的引針用跳線全部短接。硬件電路連接圖程序設(shè)計本程序由主程序和中斷服務(wù)程序組成。3.1主程序主程序流程圖如圖5。先進行系統(tǒng)初始化;開2Hz中斷;進入數(shù)碼管循環(huán)顯示程序:判斷位信號寄存器是否為0(位信號寄存器由讀者自己定義,這個寄存器的內(nèi)容在中斷里會改變),如果為0,6位數(shù)碼管顯示“000000”;如果不為零,按照位信號和段碼顯示數(shù)據(jù)進行顯示。圖4-5主程序流程圖主程序:#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延時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ù)的刷新時間為1s和0.5s,因此考慮采用2Hz(0.5s)時基中斷。并且在中斷內(nèi)部完成段碼數(shù)據(jù)更新。具體的流程如圖6示:在中斷服務(wù)程序中會用到三個重要的寄存器:中斷計數(shù)寄存器、顯示數(shù)據(jù)寄存器、位信號寄存器。其中中斷計數(shù)寄存器用于記錄第幾次進入中斷(前3次有效),顯示數(shù)據(jù)寄存器的內(nèi)容為當前被刷新顯示數(shù)據(jù)的數(shù)值(0~9),位信號寄存器用于標識被刷新數(shù)據(jù)所在位。結(jié)合主程序分析中斷程序:首先顯示“000000”時需要延時1s,使用2Hz中斷產(chǎn)生1s延時,需要連續(xù)響應(yīng)兩次中斷,第二次響應(yīng)中斷延時滿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,寄存器清零,清中斷標志,中斷返回。中斷服務(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中斷當中會被修改 g_uiSeg=0; //該變量在2Hz中斷當中會被修改,以便及時刷新顯示DIG_Init(); //顯示初始化,同時會打開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實驗步驟1.新建一個工程ex1_Led_Show,新建一個C語言文件main.c,新建一個匯編語言文件isr.asm。(根據(jù)讀者需要可以自己新建文件)2.拷貝頭文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,這兩個文件在IDE的安裝路徑\SPCE061A\include路徑下可以找到。3.添加SPCE061A.h、SPCE061A.inc到工程的“HeadFiles”;添加后可以直接用這兩個頭文件中申明的變量或者地址單元。4.按照程序流程圖編寫程序。5.RebuildAll。6.按照硬件連接圖連接電路,注意斷開JP3和JP7的所有引針,以免影響輸出顯示數(shù)據(jù)。4.2調(diào)試結(jié)果調(diào)試結(jié)果如下圖:運行開始時圖7運行開始時運行到第1位9、第2位1時圖8運行到第1位9、第2位1時運行到前兩位都為9時圖9運行到前兩位都為9時運行到6位都為9時圖10運行到6位都為9時5.總結(jié)在這為期兩周的課程設(shè)計中,通過對6位7段LED數(shù)碼管顯示的設(shè)計與分析,我清楚地認識到了自己以前僅僅學(xué)到的書本上的知識的欠缺與經(jīng)驗的不足,所謂實踐出真知,智能儀器本就是一種實踐操作環(huán)節(jié)十分重要的課程,而這次的課設(shè)正好彌補了我操作方面的不足,進而更加鞏固了這方面的知識。課程設(shè)計過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領(lǐng)悟,不斷獲取。尤其是硬件方面的知識,我們更為的稀少,以前的課程中學(xué)到的基本都是軟件方面LabVIEW的使用等等,而硬件卻是很少接觸到,因此對于硬件我們是知之甚少。然而我們通過不斷地查閱6位7段LED數(shù)碼管和IDE的相關(guān)資料,對其有了進一步的認識,還有硬件設(shè)備與軟件的連接,我們也都出現(xiàn)過問題,但最總都能認真的一一排除予以解決。最終,我們達到了任務(wù)書上的要求,完成了本次的智能儀器課程設(shè)計。在今后社會的發(fā)展和學(xué)習(xí)實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人對你的認可!最后感謝本次課程設(shè)計中老師與同學(xué)們的幫助與指導(dǎo),使我獲益匪淺!6.參考資料【1】朱麟章蒙建波主編.檢測理論及應(yīng)用.重慶大學(xué)出版社2007.8(2)【2】張國雄編著.測控電路天津大學(xué)出版社2005.1【3】費業(yè)泰編著.誤差理論與數(shù)據(jù)處理.合肥工業(yè)出版社2005.1【4】王志剛編著.單片機應(yīng)用技術(shù)及實訓(xùn).北京:清華大學(xué)出版社2004.5附錄設(shè)計程序匯總Main.c#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延時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)// 實現(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中斷當中會被修改 g_uiSeg=0; //該變量在2Hz中斷當中會被修改,以便及時刷新顯示 DIG_Init(); //顯示初始化,同時會打開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// 實現(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// 實現(xiàn)功能: 2Hz中斷進行顯示處理// 參數(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次進入中斷 ja?Start //時間〉=1s r1=[_g_uiFirst] //時間小于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 //置標志,重新顯示“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 //當前顯示的數(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//實現(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 //當前顯示的位設(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//實現(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//實現(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//實現(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//實現(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版學(xué)校校辦工廠風險管理與承包經(jīng)營合同3篇
- 二零二五年度木材市場行情預(yù)測與分析咨詢合同4篇
- 2025年度環(huán)保材料研發(fā)與生產(chǎn)合作合同范本4篇
- 2025版旅游度假區(qū)租賃與旅游服務(wù)合作協(xié)議3篇
- 2025年度智能交通系統(tǒng)保密管理與服務(wù)合同
- 二零二五年度科技型中小企業(yè)貸款合同
- 2025年度知識產(chǎn)權(quán)授權(quán)委托書簽訂協(xié)議
- 2025年度門面出租合同終止與租賃合同終止后合同解除及違約賠償協(xié)議
- 2025年度銀行存款賬戶遠程開戶服務(wù)協(xié)議
- 2025年度私人房產(chǎn)使用權(quán)轉(zhuǎn)讓與智能家居系統(tǒng)安裝合同
- 2024年全國體育專業(yè)單獨招生考試數(shù)學(xué)試卷試題真題(含答案)
- 北師大版小學(xué)三年級上冊數(shù)學(xué)第五單元《周長》測試卷(含答案)
- DB45T 1950-2019 對葉百部生產(chǎn)技術(shù)規(guī)程
- 2025屆河北省衡水市衡水中學(xué)高考仿真模擬英語試卷含解析
- 新修訂《保密法》知識考試題及答案
- 電工基礎(chǔ)知識培訓(xùn)課程
- 住宅樓安全性檢測鑒定方案
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年五年級上學(xué)期期末考試數(shù)學(xué)試題
- 市政道路及設(shè)施零星養(yǎng)護服務(wù)技術(shù)方案(技術(shù)標)
- 《論語》學(xué)而篇-第一課件
- 《寫美食有方法》課件
評論
0/150
提交評論