版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章C語言程序設計與混合編程
7.1C語言程序設計
7.2用C語言和匯編語言混合編程
本章小結
習題
(1)用匯編語言開發(fā)。此方式代碼效率高,程序執(zhí)行速度快,可以充分合理地利用芯片提供的硬件資源。但程序編寫比較煩瑣,可讀性較差,可移植性較差,軟件的修改和升級困難。
(2)用C語言開發(fā)。CCS平臺包括優(yōu)化ANSIC編譯器,從而可以在C源程序級進行開發(fā)調試,增強軟件的可讀性,提高了軟件的開發(fā)速度,方便軟件的修改和移植。然而,C編譯器無法實現(xiàn)在任何情況下都能夠合理地利用DSP芯片的各種資源。C54xDSP軟件設計的方法通常有三種:
(3)C語言和匯編語言混合編程開發(fā)。采用混合編程的方法能更好地達到設計要求,完成設計任務。
1.C語言特點
C語言是國際上廣泛流行的、很有發(fā)展前途的計算機高級語言。它適合于作為系統(tǒng)描述語言,既可以用來編寫系統(tǒng)軟件,也可以用來編寫應用軟件。匯編語言依賴于計算機硬件,程序的可讀性和可移植性比較差。而高級語言具有很好的可移植性,但是難以實現(xiàn)匯編語言的某些功能。因為C語言仍然需要通過編譯、連接才能得到可執(zhí)行目標程序,所以是一種高級語言。但C語言允許訪問物理地址,能進行位操作,能實現(xiàn)匯編語言的大部分功能,能直接對硬件進行操作。C語言正是一種既可以訪問物理地址又可以進行位操作的高級語言,這也是其與別的高級語言不同的地方。
7.1C語言程序設計7.1.1C語言特點及語法C語言具有如下基本特點:(1)語言簡潔、緊湊,使用方便、靈活。(2)運算符豐富,表達式類型多樣化。(3)數(shù)據(jù)結構類型豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結構。(4)具有結構化的控制語句。(5)語法限制不太嚴格,程序設計自由度大。
(6)C語言允許訪問物理地址,能進行位操作,能實現(xiàn)匯編語言的大部分功能,能直接對硬件進行操作。
(1)限定詞可由字母、數(shù)字和下劃線組成。限定詞必須以字母或下劃線開頭。區(qū)分大小寫。
(2)常量常量包括整型常量(八進制、十進制、十六進制、長整型),字符常量,實型常量(小數(shù)形式、指數(shù)形式),字符串常量,表達式,算術表達式(整型表達式、實型表達式),邏輯表達式,字位表達式,強制類型轉換表達式,逗號表達式(順序表達式),賦值表達式,條件表達式,指針表達式。
(3)數(shù)據(jù)定義數(shù)據(jù)類型(int、short、long、unsigned、char、float、double、struct、union、enum)用ty-pedef定義的類型名,存儲類型(auto、static、register、extem)變量的定義形式為:存儲類別
數(shù)據(jù)類型
變量列表;例如:staticfloata,b,c;2.C語言基本語法概述
(4)函數(shù)定義函數(shù)的定義形式為:存儲類別
數(shù)據(jù)類型
函數(shù)名(形參表別)
函數(shù)體
(5)語句語句包括表達式語句、函數(shù)調用語句、控制語句、復合語句、空語句。其中控制語句包括if語句、while語句、for語句和switch語句以及break語句、continue語句、return語句、goto語句。
(6)預處理命令預處理命令主要是指define和include語句。
C系統(tǒng)的堆??梢酝瓿傻闹饕δ苋缦拢?/p>
*分配局部變量;*傳遞函數(shù)參數(shù);*保存所調用函數(shù)的返回地址;*保存臨時結果。6.1.2系統(tǒng)堆棧的使用運行堆棧的增長方向是從高地址到低地址,即入棧則地址減少,出棧則地址增加。堆棧的管理者是堆棧指針SP。堆棧的容量由鏈接器(Linker)設定。如:在鏈接命令文件(.cmd文件)中加入選項
-stack0x1000
則堆棧的容量被設為1000H個字。
1.存儲器模式
C54xDSP定點處理器有兩種類型的存儲器模式:程序存儲器和數(shù)據(jù)存儲器。前者主要用于裝載可執(zhí)行代碼,后者主要用于裝載外部變量、靜態(tài)變量、系統(tǒng)堆棧以及一些中間運算結果。
C54xDSP的程序代碼或數(shù)據(jù)以段的形式裝載于存儲器中。C語言程序經C編譯器編譯后,生成七個可重定位的段,其中四個被稱為已初始化段,三個被稱為未初始化段。6.1.3存儲器模式及分配四個已初始化段分別是:*.text段包括可執(zhí)行代碼、字符串和編譯器產生的常量。*.cinit段包括初始化變量和常量表。*.const段包括字符串常量和以const關鍵字定義的常量。*.switch段為.const語句建立的表格。三個未初始化段分別是:
*.bss段保留全局和靜態(tài)變量空間。在程序開始運行時,C的引導(boot)程序將數(shù)據(jù)從.cinit段拷貝到.bss段。*.stack段為C的系統(tǒng)堆棧分配存儲空間,用于變量的傳遞。*.sysmem段為動態(tài)存儲器函數(shù)malloc、calloc、realloc分配存儲器空間。若C程序未用到此類函數(shù),則C編譯器不產生該段。在編寫鏈接命令文件(.cmd文件)時,.text、.cinit、.switch段通??梢枣溄拥较到y(tǒng)的ROM或者RAM中去,但是必須放在程序段(page0);.const段通??梢枣溄拥较到y(tǒng)的ROM或者RAM中去,但是必須放在數(shù)據(jù)段(pagel);而.bss、.stack和.sysmem段必須鏈接到系統(tǒng)的RAM中去,并且必須放在數(shù)據(jù)段(pagel)。由實驗程序所建的某工程的鏈接命令文件(.cmd文件),如例6.1所示?!纠?.1】某工程的鏈接命令文件(.cmd文件)
MEMORY /*TMS320C54xDSP存儲器分配*/{PAGE0:HPIRAM:origin=0x100, length=0x200PROG:origin=0x2000, length=0x1000PAGE1:DARAM1:origin=0x03000, length=0x1000PAGE2:FLASHRAM:origin=0x8000, length=0x7fff}SECTIONS{/*由C定義*/.vectors:load=PROGpage0/*中斷向量表*/.text :load=PROGpage0/*可執(zhí)行代碼*/.cinit:load=PROGpage0 /*初始化變量和常數(shù)表*/.switch:load=PROGpage0 /*為.constant語句建立的表格*/.stack :load=DARAM1page1/*C系統(tǒng)堆棧*/.const :load=DARAM1page1/*字符串常量和以const關鍵字定義的常量*/.bss :load=DARAM1page1 /*全局和靜態(tài)變量空間*/.dbuffer1024 :{}>DARAM1 page1,align(1024).coeffs1024 :{}>DARAM1 page1,align(1024).hpibuffer :load=HPIRAM page0/*由匯編定義*/.data:>DARAM1page1 /*匯編定義的數(shù)據(jù)段*/}
2.存儲器分配
C編譯器提供的運行支持函數(shù)中包含有幾個允許在運行時為變量分配存儲器的函數(shù),如malloc、calloc和recalloc。動態(tài)分配不是C語言本身的標準,而是由運行支持函數(shù)所提供的。為全局pool和heap分配的存儲器空間定義在.sysmem塊中。.sysmem段的大小可由鏈接器選項中的-heap項來設定,其方法是在-heap項后加一個常數(shù)。與堆棧類似,連接器也創(chuàng)建一個全局符號_SYSMEM_SIZE。.sysmem段的大小由_SYSMEM_SIZE的數(shù)值來確定,默認值為lK字。為了在.bss段中保留空間,對于大的數(shù)據(jù),可以用heap為其分配空間,而不將它們說明為全局或靜態(tài)的。例如,對于原定義的:
structbigtable[1000]可以改用指針并調用malloc函數(shù)來定義:structbig*tabletable=(structbig*)malloc(1000*sizeof(structbig));
(1)靜態(tài)和全局變量的存儲器分配在C程序中,靜態(tài)變量被分配一個惟一的連續(xù)空間,該空間的地址由鏈接器決定。編譯器安排這些變量的空間被分配在若干個字的長度中,以保證每個變量按字邊界對準。全局變量分配到數(shù)據(jù)空間,在同一模塊中定義的變量分配到同一個連續(xù)的存儲空間。
(2)域/結構的對準
C編譯器在為結構分配存儲空間時,它分配足夠的字以包含所有的結構成員。一組結構中,每個結構開始于字邊界。所有的非域類型對準于字的邊界。對域應分配足夠多的比特。相鄰域應裝入一個字的相鄰比特,不能跨越兩個字,否則整個域會被分配到下一個字中。
1.寄存器規(guī)則在C環(huán)境中,定義了嚴格的寄存器規(guī)則。寄存器規(guī)則明確了編譯器如何使用寄存器,以及在函數(shù)的調用過程中如何保護寄存器。調用函數(shù)時,某些寄存器不必由調用者來保護,而由被調用函數(shù)負責保護。如果調用者需要使用沒有保護的寄存器,則調用者在調用函數(shù)前必須對這些寄存器予以保護。在編寫匯編語言和C語言的接口程序時,這些規(guī)則非常重要。如果編寫時不遵守寄存器的使用規(guī)則,則C環(huán)境將會被破壞。6.1.4TMS320C54xDSP的C語言規(guī)則寄存器規(guī)則概括如下:
(1)輔助寄存器ARl、AR6、AR7由被調用函數(shù)保護,即可以在函數(shù)執(zhí)行過程中修改,但在函數(shù)返回時必須恢復。在C54xDSP中,編譯器將ARl和AR6用作寄存器變量。其中,AR1被用作第一個寄存器變量,AR6被用作第二個寄存器變量,其順序不能改變。另外五個輔助寄存器AR0、AR2、AR3、AR4、AR5則可以自由使用,即在函數(shù)執(zhí)行過程中可以對它們進行修改,不必恢復。
(2)棧指針SP堆棧指針SP在函數(shù)調用時必須予以保護,但這種保護是自動的,即在返回時,壓入堆棧的內容都將被彈出。
(3)ARP在函數(shù)進入和返回時,必須為0,即當前輔助寄存器必須為AR0,而函數(shù)執(zhí)行時則可以是其他值。
(4)OVM在默認情況下,編譯器總認為OVM是0。因此,若在匯編程序中將OVM置為1,則在返回C環(huán)境時,必須將其恢復為0。
(5)其他狀態(tài)位和寄存器可以任意使用,不必恢復。
(1)參數(shù)傳遞在函數(shù)調用前,將參數(shù)以逆序壓入運行堆棧。所謂逆序,即最右邊的參數(shù)最先壓入棧,然后自右向左將參數(shù)依次壓入棧,直至第二個參數(shù)入棧完畢。對第一個參數(shù),則不需壓入堆棧,而是放入累加器A中,由A進行傳遞。若參數(shù)是長整型和浮點數(shù)時,則低位字先壓入棧,高位字后壓入棧。若參數(shù)中有結構,則調用函數(shù)先給結構分配空間,而該空間的地址則通過累加器A傳遞給被調用函數(shù)。一個典型的函數(shù)調用圖如圖6.1所示。在該例中,我們可以看出,參數(shù)傳遞到函數(shù),同時該函數(shù)使用了局部變量并調用另一個函數(shù)。第一個參數(shù)不由堆棧傳遞,而是放入累加器A中傳遞。(如圖6.1(b)、圖6.1(c)所示)。2.函數(shù)調用規(guī)則
(2)被調用函數(shù)的執(zhí)行過程被調用函數(shù)依次執(zhí)行以下幾項任務:*如果被調用函數(shù)修改了寄存器(如AR1、AR6、AR7),則必須將它們壓棧保護。*當被調用函數(shù)需分配內存來建立局部變量及參數(shù)區(qū)時,SP向低地址移動一個常數(shù)(即SP減去一個常數(shù)),該常數(shù)的計算方法如下:常數(shù)=局部變量長度+參數(shù)區(qū)中調用其他函數(shù)的參數(shù)長度
另外,從這個例子中,我們看到了函數(shù)調用時局部幀的產生過程:函數(shù)調用時,編譯器在運行堆棧中建立一個幀用以存儲信息。當前函數(shù)幀成為局部幀,C環(huán)境利用局部幀來保護調用者的有關信息、傳遞參數(shù)和為局部變量分配存儲空間。每調用一個函數(shù),就建立一個新的局部幀。局部幀空間的一部分用于分配參數(shù)區(qū)(局部參數(shù)區(qū)),被傳遞的參數(shù)放入局部參數(shù)區(qū),即壓入堆棧,再傳遞到其他被調用的函數(shù)中。圖6.1函數(shù)調用時堆棧的使用*被調用函數(shù)執(zhí)行程序。*如果被調用函數(shù)修改了寄存器ARl、AR6和AR7,則必須予以恢復。將函數(shù)的返回值放入累加器A中。整數(shù)和指針在累加器A的低16位中返回,浮點數(shù)和長整型數(shù)在累加器A的32位中返回。如果函數(shù)返回一個結構體,則被調用函數(shù)將結構體的內容拷貝到累加器A所指向的存儲器空間。如果函數(shù)沒有返回值,則將累加器A置0,撤銷為局部幀開辟的存儲空間。ARP在從函數(shù)返回時,必須為0,即當前輔助寄存器為AR0。參數(shù)不是由被調用函數(shù)彈出堆棧的,而是由調用函數(shù)彈出的。
*SP向高地址移動一個常數(shù)(即SP加上一個常數(shù)),該常數(shù)即為圖6.1(b)所確定的常數(shù),這樣就又恢復了幀和參數(shù)區(qū)。*被調用函數(shù)恢復所有保存的寄存器。*函數(shù)返回。當C程序編譯成匯編后,上述過程如例6.2所示?!纠?.2】
be_called: ;函數(shù)入口
pshmAR6 ;保存AR6
pshnAR7 ;保存AR7frame#-16 ;分配幀和參數(shù)區(qū)
... ;函數(shù)主體
frame#16 ;恢復原來的幀和參數(shù)區(qū)
popmAR7 ;恢復AR7
popmAR6 ;恢復AR6ret ;函數(shù)返回
(4)分配幀及使用32位內存讀/寫指令。*一些C54xDSP指令提供了一次讀/寫32位的操作(如DLD和DADD),因此必須保證32位對象存放在偶地址開始的內存中。為了保證這一點,C編譯器需要初始化SP,使其為偶數(shù)值。*由于CALL指令使SP減1,因此SP在函數(shù)入口設置為奇數(shù);而長調用FCALL指令使SP減2,故SP在函數(shù)入口設定為偶數(shù)。*使用CALL指令時,應確保PSMH指令的數(shù)目加上FRAME指令分配字的數(shù)目為奇數(shù),這樣SP就指向一個偶地址;同樣,使用長調用FCALL指令時,應保證PSMH指令的數(shù)目與FRAME指令分配字的數(shù)目和為偶數(shù),以保證SP指向偶地址。*為了確保32位對象在偶地址,可通過設置SP的相對地址來實現(xiàn)。*由于中斷調用時不能確保SP為奇數(shù)還是偶數(shù),因此,中斷分配SP指向偶數(shù)地址。
3.中斷函數(shù)
C函數(shù)可以直接處理中斷。但是在用C語言編寫中斷程序時,應注意以下幾點:
(1)中斷的使能和屏蔽由程序員自己來設置。這一點可以通過內嵌匯編語句來控制中斷的使能和屏蔽,即通過內嵌匯編語句來設置中斷屏蔽寄存器IMR及INTM,也可通過調用匯編程序函數(shù)來實現(xiàn)。
(2)中斷程序不能有入口參數(shù),即使聲明,也會被忽略。
(3)中斷子程序即使被普通的C程序調用,也是無效的,因為所有的寄存器都已經被保護了。
(4)將一個程序與某個中斷進行關聯(lián)時,必須在相應的中斷矢量處放置一條跳轉指令。采用.sect匯編指令可以建立這樣一個跳轉指令表以實現(xiàn)該功能。
(5)在匯編語言中,必須在中斷程序名前加上一個下劃線。
(6)用C語言編寫的中斷程序必須用關鍵字interrupt說明。
(7)中斷程序用到的所有寄存器,包括狀態(tài)寄存器都必須保護。
(8)如果中斷程序中調用了其他的程序,則所有的寄存器都必須保護。
4.表達式分析當C程序中需要計算整型表達式時,必須注意到以下幾點:
(1)算術上溢和下溢。TMS320C54xDSP采用16位操作數(shù),產生40位結果,算術溢出是不能以一種可預測的方式進行處理的。
(2)整除和取模。TMS320C54xDSP沒有直接提供整除指令,因此,所有的整除和取模運算都需要調用庫函數(shù)來實現(xiàn)。這些函數(shù)將運算表達式的右操作數(shù)壓入堆棧,將左操作數(shù)放入累加器的低16位。函數(shù)的計算結果在累加器中返回。
(3)32位表達式分析。一些運算在函數(shù)調用時并不遵循標準的C調用規(guī)則,其目的在于提高程序運行速度和減少程序代碼空間。這些運算包括通過變量的左移、右移、除法、取模和乘法。
(4)C代碼訪問16位乘法結果的高16位,而無需調用32位乘法的庫函數(shù)。訪問有符號數(shù)乘法結果和無符號數(shù)乘法結果的高16位,分別如下所示。有符號結果:intn1,n2,result;result=((long)n1*(long)n2)>>16;無符號結果:unsignedn1,n2,result;result=((unsignedlong)n1*(unsignedlong)n2)>>16;
C語言程序編寫過程步驟:(1)編輯器編輯C程序readdata.c;(2)編譯程序將C程序編譯匯編成目標文件readdata.obj;(3)編輯一個鏈接命令文件(.cmd文件);(4)鏈接生成.out文件,用硬件仿真器進行調試。
【例6.3】用C語言編寫C54xDSP的I/O口的讀程序,實現(xiàn)從I/O口地址8000H連續(xù)讀入1000個數(shù)據(jù)并存入數(shù)組中。
6.1.5C語言程序實例
【例6.3】
C程序readdata.c:#include“portio.h” /*包含頭文件portio.h*/#defineRD_PORT0x8000 /*定義輸入I/O口*/staticintindata[1000]; /*定義全局數(shù)組*/main(){intI;for(I=0;I<1000;I++)portRead(RD_PORT); /*從I/O口讀數(shù)據(jù)*/}
C語言和匯編語言的混合編程有以下幾種方法:。
(1)獨立編寫匯編程序和C程序,分開編譯或匯編,形成各自的目標代碼模塊,再用鏈接器將C模塊和匯編模塊鏈接起來。這種方法靈活性較大,但用戶必須自己維護各匯編模塊的入口和出口代碼,自己計算傳遞的參數(shù)在堆棧中的偏移量,工作量較大,但能做到對程序的絕對控制。
(2)在C程序中使用匯編程序中定義的變量和常量。
(3)在C程序中直接內嵌匯編語句。用此種方法可以在C程序中實現(xiàn)C語言無法實現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器,中斷標志寄存器等。6.2
用C語言和匯編語言混合編程6.2.1C54xDSP混合編程方法
(4)將C程序編譯生成相應的匯編程序,手工修改和優(yōu)化C編譯器生成的匯編代碼。采用此種方法時,可以控制C編譯器,使之產生具有交叉列表的C程序和與之對應的匯編程序,而程序員可以對其中的匯編語句進行修改。優(yōu)化之后,對匯編程序進行匯編,產生目標文件。根據(jù)編者經驗,只要程序員對C和匯編均很熟悉,這種混合匯編方法的效率可以做得很高。但是,由交叉列表產生的C程序對應的匯編程序往往讀起來頗費勁,因此對一般程序員不提倡使用這種方法。
1.獨立的C和匯編模塊接口獨立的C和匯編模塊接口是一種常用的C和匯編語言接口方法。采用此方法在編寫C程序和匯編程序時,必須遵循有關的調用規(guī)則和寄存器規(guī)則。調用規(guī)則和寄存器規(guī)則已在前面作了詳述。如果遵循了這些規(guī)則,那么C和匯編語言之間的接口是非常方便的。C程序可以直接引用匯編程序中定義的變量和子程序,匯編程序也可以引用C程序中定義的變量和子程序?!纠?.5】C程序:externint
asmfunc(); /*聲明外部的匯編子程序*/ /*注意函數(shù)名前不要加下劃線*/int
gvar; /*定義全局變量*/main(){inti=5;i=asmfunc(i); /*進行函數(shù)調用*/}匯編程序:_asmfunc: ;函數(shù)名前一定要有下劃線STLA,*(_gvar) ;i的值在累加器A中ADD*(_gvar),A ;返回結果在累加器A中RET ;子程序返回
2.C程序中訪問匯編程序變量
從C程序中訪問匯編程序中定義的變量或常數(shù)時,根據(jù)變量和常數(shù)定義的位置和方法的不同,可分為三種情況。
(1)訪問在.bss段中定義的變量,方法如下:*采用.bss命令定義變量;*用.global將變量說明為外部變量;*在匯編變量名前加下劃線“_”;*在C程序中將變量說明為外部變量,然后就可以像訪問普通變量一樣訪問它。例如:匯編程序:
/*注意變量名前都有下劃線*/.bss_var,1.global_var; ;聲明為外部變量C程序:
externalint
var;/*外部變量*/
var
=l;
(2)訪問未在.bss段定義的變量,如當C程序訪問在匯編程序中定義的常數(shù)表時,則方法更復雜一些。此時,定義一個指向該變量的指針,然后在C程序中間接訪問它。在匯編程序中定義此常數(shù)表時,最好定義一個單獨的段。然后,定義一個指向該表起始地址的全局標號,可以在鏈接時將它分配至任意可用的存儲器空間。如果要在C程序中訪問它,則必須在C程序中以extern方式予以聲明,并且變量名前不必加下劃線“_”。這樣就可以像訪問其他普通變量一樣進行訪問。C程序中訪問匯編常數(shù)表如例6.6所示?!纠?.6】C程序中訪問匯編常數(shù)表
匯編程序:.global_sine ;定義外部變量.sect"sine_tab" ;定義一個獨立的塊裝常數(shù)表_sine:
;常數(shù)表首址.word0
.word50
.word100
.word200C程序:
externintsine[]; /*定義外部變量*/
int*sine_ptr=sine; /*定義一個C指針*/f=sine_ptr[2]; /*訪問sine_ptr*/
(3)對于那些在匯編中以.set和.global定義的全局常數(shù),也可以在C程序中訪問,不過要用到一些特殊的方法。一般來說,在C程序中和匯編程序中定義的變量,其符號表包含的是變量的地址。而對于匯編程序中定義的常數(shù),符號表包含的是常數(shù)值。編譯器并不能區(qū)分哪些符號表包含的是變量的地址,哪些是變量的值。因此,如果要在C程序中訪問匯編程序中的常數(shù),則不能直接用常數(shù)的符號名,而應在常數(shù)符號名前加一個地址操作符&,以示與變量的區(qū)別,這樣才能得到常數(shù)值。例如:匯編程序:_tab_size.set1000.global_tab_sizeC程序:externint_tab_size;#defineTAB_SIZE((int)(&tab_size));…for(i=0;i<TAB_SIZE;++i)
3.C程序中直接嵌入?yún)R編語句在C程序中直接嵌入?yún)R編語句是一種直接的C和匯編的接口方法。此種方法可以在C程序中實現(xiàn)C語言無法實現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器、中斷標志寄存器等。嵌入?yún)R編語句的方法比較簡單,只需在匯編語句的兩邊加上雙引號和括號,并且在括號前加上asm標識符即可。即:
asm(“匯編語句”);如:asm("RSBXINTM"); /*開中斷*/
asm("SSBXXF"); /*XF置高電平*/
asm("NOP");注意:括號中引號內的匯編語句的語法和通常的匯編編程的語法一樣。不要破壞C環(huán)境,因為C編譯器并不檢查和分析嵌入的匯編語句。插入跳轉語句和標號會產生不可預測的結果。不要讓匯編語句改變C程序中變量的值。不要在匯編語句中加入?yún)R編器選項而改變匯編環(huán)境。修改編譯器的輸出可以控制C編譯器,從而產生具有交叉列表的匯編程序。而程序員可以對其中的匯編語句進行修改,之后再對匯編程序進行匯編,可產生最終的目標文件。注意,修改匯編語句時切勿破壞C環(huán)境。6.2.2混合編程實例【例6.7】
用混合編程的設計方法實現(xiàn)四個數(shù)碼管同時循環(huán)顯示0~9十個數(shù),每次顯示的數(shù)以1遞增。
C語言設計的主程序如下:ioportunsignedport0; //控制數(shù)碼管選通的控制接口地址為0ioportunsignedport1; //向數(shù)碼管送顯示內容的數(shù)據(jù)接口地址為1/*發(fā)光二極管的顯示代碼*/charleddisp[]={0xf6,0x77,0x14,0xb3,0xb6,0xd4,0xe6,0xe7,0x34,0xf7};voidmain(){charledcnt=0;c54_init(); /*調用5402芯片初始化函數(shù)*/for(;;){
ledcnt=(ledcnt+1)%10; /*模10循環(huán)遞增*/ port0=0xf; /*向地址為0的口送1111b:四個數(shù)碼管均選通*/ port1=leddisp[ledcnt]; /*向地址為1的口送欲顯示之數(shù)*/ delay3(); /*調用延時函數(shù),停頓片刻*/ }}用匯編程序設計對5402芯片初始化的函數(shù)如下:
.title"C54_INIT.ASM" .mmregs
.def_c54_init .text_c54_init: STM 0,ST0 ;ARP=0、DP=0 STM 0100001101011111B,ST1 ;CPL=0DP直接尋址、 中斷屏蔽、溢出保
;護、符號擴展、FRCT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度工地施工人員住宿及餐飲服務合同3篇
- 二零二五年度教育培訓機構與講師關于課程教授的合同3篇
- 二零二五年度智慧電商技術服務全面外包合作協(xié)議2篇
- 《聯(lián)合國國際貨物銷售合同公約》29條解讀
- 《湖南省農村教師公費定向培養(yǎng)協(xié)議書》
- 2020年出租房屋合同樣板
- 《合同補正情況說明》
- 二零二五年度新能源設備動產質押租賃合同范本3篇
- 2025小區(qū)簡單租房合同范本
- 2025版頁巖磚建筑節(jié)能項目合作采購合同3篇
- 《數(shù)學廣角-優(yōu)化》說課稿-2024-2025學年四年級上冊數(shù)學人教版
- 《小學生良好書寫習慣培養(yǎng)的研究》中期報告
- 大學英語四級詞匯表(下載)
- 2025年四川成都市溫江區(qū)市場監(jiān)督管理局選聘編外專業(yè)技術人員20人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 手術室發(fā)生地震應急預案演練
- 初中數(shù)學新課程標準(2024年版)
- 高職院校專業(yè)教師數(shù)字素養(yǎng)架構與提升路徑
- 售后服務人員培訓資料課件
- 2024-2030年中國薯條行業(yè)發(fā)展趨勢及投資盈利預測報告
- 生命智能學習通超星期末考試答案章節(jié)答案2024年
- 專項14-因式分解-專題訓練(50道)
評論
0/150
提交評論