《單片機原理及應(yīng)用》課件第4章 匯編語言程序設(shè)計new_第1頁
《單片機原理及應(yīng)用》課件第4章 匯編語言程序設(shè)計new_第2頁
《單片機原理及應(yīng)用》課件第4章 匯編語言程序設(shè)計new_第3頁
《單片機原理及應(yīng)用》課件第4章 匯編語言程序設(shè)計new_第4頁
《單片機原理及應(yīng)用》課件第4章 匯編語言程序設(shè)計new_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單片機匯編語言程序設(shè)計重點講述MCS-51單片機匯編程序編程方法,從編程思路、編程技巧等方面進行細致講解,并給出一些常用子程序單片機匯編語言程序設(shè)計匯編語言程序的基本結(jié)構(gòu)形式4.2匯編語言程序的設(shè)計基礎(chǔ)4.1常用程序設(shè)計舉例4.3

單片機應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成匯編語言程序的設(shè)計基礎(chǔ)程序?qū)嶋H上是一系列計算機指令的有序集合。我們把利用計算機的指令系統(tǒng)來合理地編寫出解決某個問題的程序的過程,稱為程序設(shè)計。程序設(shè)計是單片機應(yīng)用系統(tǒng)設(shè)計的重要組成部分,單片機的全部動作都是在程序的控制下進行的。隨著芯片技術(shù)的發(fā)展,很多標(biāo)準(zhǔn)的或功能型的硬件電路都集成到了芯片中,所以,程序設(shè)計在單片機應(yīng)用系統(tǒng)開發(fā)中占的比重越來越大。匯編語言高級語言

應(yīng)用程序設(shè)計方法

匯編語言:生成的目標(biāo)程序占內(nèi)存空間少、運行速度快,具有效率高、實時性強。

高級語言:對系統(tǒng)的功能描述與實現(xiàn)簡單,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。匯編語言程序的設(shè)計基礎(chǔ)以字母開始,其余部分可以是字母、數(shù)字和符號不能用已定義的保留字(指令助記符、偽指令等)后跟英文冒號“:”匯編語言的語句形式為:標(biāo)號(即符號地址)[標(biāo)號:]指令助記符

[操作數(shù)1,][操作數(shù)2,][操作數(shù)3,][;注釋]指令助記符是指令功能的英文縮寫(第3章的內(nèi)容)。匯編語言程序的設(shè)計基礎(chǔ)-匯編語言語句格式數(shù)據(jù):二進制(B)十進制(D或省略D)十六進制(H),A~F開頭時應(yīng)在前面加“0”ASCII碼,如‘A’,‘1245’符號:符號名、標(biāo)號或“$”(PC的當(dāng)前值)操作數(shù)注釋英文分號“;”開頭匯編語言程序的設(shè)計基礎(chǔ)-匯編語言語句格式偽指令,也叫匯編命令。僅對匯編過程進行指示偽指令無對應(yīng)的單片機可執(zhí)行代碼起始地址設(shè)定偽指令ORGORG表達式表達式通常為十六進制地址,例:ORG0000HSTART:MOVA,#30H……ORG可多次使用,但不能產(chǎn)生代碼重疊區(qū)結(jié)束匯編偽指令ENDEND該偽指令位于源程序的最后一行。匯編語言程序的設(shè)計基礎(chǔ)-偽指令定義字節(jié)數(shù)據(jù)表偽指令DB定義字數(shù)據(jù)表偽指令DW1000H[標(biāo)號:]DB字節(jié)數(shù)據(jù)表如:ORG1000HDB-2,-4,-6,8,10,18FEHFCHFAH08H0AH12H1001H[標(biāo)號:]DW字數(shù)據(jù)表ORG1400HDATA1:DW324AH,3CH……1400H32H4AH00H3CH1401H1402H1403H大端模式匯編語言程序的設(shè)計基礎(chǔ)-偽指令定義常值為符號名偽指令EQU符號名EQU常值表達式

LEN

EQU10

SUM

EQU21HBLOCK

EQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符號名為:地址常數(shù)段名字符串寄存器名位名比較:標(biāo)號只能是地址匯編語言程序的設(shè)計基礎(chǔ)-偽指令數(shù)據(jù)地址賦值偽指令DATA字符名稱DATA表達式 CLRAMOVR7,LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,ALEN

DATA20HSUM

DATA21HBLOCK

DATA22HDATA用于將一個內(nèi)部RAM的地址賦給指定的字符名稱。與EQU的不同之處是:EQU定義的字符名稱必須先定義后使用;DATA定義的字符名稱可以先使用后定義。匯編語言程序的設(shè)計基礎(chǔ)-偽指令定義位地址為符號名偽指令BIT符號名BIT位地址表達式如:STBITP1.0;將P1.0的位地址賦給符號名STCFBIT0D7H;將位地址為D7H的位定義為符號名用BIT定義的“符號名”一經(jīng)定義便不能重新定義和改變其它一些偽指令參見教材匯編語言程序的設(shè)計基礎(chǔ)-偽指令匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的結(jié)構(gòu)必須有主程序。程序入口地址是0000H必須用偽指令來規(guī)定程序的開始地址。除了主程序,其他一些程序段也可以用偽指令來規(guī)定開始地址,可能會形成一些不連續(xù)的代碼區(qū),尤其要注意后面的代碼區(qū)不能覆蓋前面的代碼區(qū)。用戶可以根據(jù)功能要求設(shè)計子程序。如果使用中斷、定時器、串口等功能,則單片機相關(guān)寄存器的必須要初始化。主程序必須是閉環(huán)結(jié)構(gòu)。即是一個閉環(huán)循環(huán),采用LOOP:……LJMPLOOP(類似C語言例程中的while(1){…}),表示單片機的執(zhí)行代碼有一部分是循環(huán)執(zhí)行。本書的例題中一般用一條LJMP$來代替循環(huán)執(zhí)行代碼。匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的結(jié)構(gòu)源程序的匯編匯編源程序轉(zhuǎn)為目標(biāo)程序的過程叫匯編匯編通常在Windows下的集成開發(fā)環(huán)境完成用A51.EXE匯編生成.OBJ、.LIB及.LST目標(biāo)程序的連接.OBJ、.LIB經(jīng)BL51.EXE生成無擴展名的絕對地址目標(biāo)文件絕對地址目標(biāo)文件可以用于仿真器調(diào)試調(diào)試無誤的目標(biāo)文件用OH51.EXE轉(zhuǎn)換為.HEX文件.HEX文件經(jīng)編程器寫入單片機程序存儲器匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的編輯和匯編目標(biāo)程序的產(chǎn)生過程:匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的編輯和匯編明確任務(wù):功能要求、技術(shù)指標(biāo)運行環(huán)境調(diào)研

任務(wù)分析將實際問題轉(zhuǎn)化為計算機處理的程序算法算法比較與優(yōu)化(內(nèi)存需求與運行速度)

算法設(shè)計匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的設(shè)計方法

制定流程圖

流程圖符號“循環(huán)”框架匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的設(shè)計方法分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址確定程序區(qū)、堆棧區(qū)、數(shù)據(jù)區(qū)設(shè)定各區(qū)首地址編寫源程序調(diào)試、修改,最終確定程序語法錯誤邏輯錯誤匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的設(shè)計方法源程序的編輯

ORG0000HLJMPMAIN

ORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPLJMP$

END依據(jù)匯編語言規(guī)則用好偽指令符號不用中文LJMP$

用于調(diào)試以.ASM存盤匯編語言程序的設(shè)計基礎(chǔ)-匯編語言程序的設(shè)計方法匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序設(shè)計一般采用模塊化編程,基本程序結(jié)構(gòu)有三種:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。這三種結(jié)構(gòu)組合起來,可以解決任何復(fù)雜問題。(無分支、無循環(huán))匯編語言程序的基本結(jié)構(gòu)形式-順序程序順序結(jié)構(gòu)是最簡單、最基本的程序結(jié)構(gòu),其特點是按指令的排列順序一條一條地執(zhí)行,直到全部指令執(zhí)行完畢為止。不管多么復(fù)雜的程序,總是由若干順序程序段所組成的?!纠?-1】三字節(jié)無符號數(shù)相加,其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中(低位在后);加數(shù)在內(nèi)部RAM的53H、54H和55H單元中(低位在后);要求把相加之和存放在50H、51H和52H單元中(低位在后),進位存放在位尋址區(qū)的00H位中。 ORG 0000H MOV A,52H ADD A,55H;低字節(jié)相加 MOV 52H,A;存低字節(jié)相加結(jié)果 MOV A,51H

ADDC A,54H;中字節(jié)帶進位相加 MOV 51H,A;存中字節(jié)相加結(jié)果 MOV A,50H

ADDC A,53H;高字節(jié)帶進位相加 MOV 50H,A;存高字節(jié)相加結(jié)果 MOV 00H,C;進位送00H位保存 END匯編語言程序的基本結(jié)構(gòu)形式-順序程序匯編語言程序的基本結(jié)構(gòu)形式-順序程序MOV R0, #52H ;被加數(shù)的低字節(jié)地址MOV R1, #55H ;加數(shù)的低字節(jié)地址MOV A, @R0 ADD A, @R1 ;低字節(jié)相加MOV @R0,A ;存低字節(jié)相加結(jié)果DEC R0 DEC R1 MOV A, @R0 ADDC A, @R1 ;中間字節(jié)帶進位相加MOV @R0,A ;存中間字節(jié)相加結(jié)果DEC R0 DEC R1 MOV A, @R0 ADDC A, @R1;高字節(jié)帶進位相加MOV @R0,A ;存高字節(jié)相加結(jié)果MOV 00H,C ;進位送00H位保存匯編語言程序的基本結(jié)構(gòu)形式-分支程序在實際程序設(shè)計過程中,會有很多復(fù)雜狀態(tài)和條件,需要根據(jù)這些條件進行不同的選擇。這時就必須對某一變量的狀態(tài)進行判斷,根據(jù)判斷結(jié)果選擇不同的程序流向,這就是分支程序。分支程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散轉(zhuǎn))。

常用指令:JZ(JNZ)、CJNE、JC(JNC)及JB(JNB)等它們是分支結(jié)構(gòu)程序設(shè)計的基礎(chǔ),可以完成各種各樣的條件判斷,控制轉(zhuǎn)移方向。單分支程序【例4-2】兩個無符號數(shù)比較(單分支)。內(nèi)部RAM的30H單元和40H單元各存放了一個8位無符號數(shù),請比較這兩個數(shù)的大小。若(30H)≥(40H),則將地址為20H的內(nèi)存單元置0;否則,則將地址為20H的內(nèi)存單元置1。匯編語言程序的基本結(jié)構(gòu)形式-分支程序 ORG 0000H MOV A,30H;被減數(shù)放入累加器中 CLR C SUBB A,40H;兩數(shù)相減 JC L1 ;有進位(借位),則前小后大,

;轉(zhuǎn)到L1 MOV 20H,#00H LJMP L2;不能執(zhí)行下一條語句,需轉(zhuǎn)走L1: MOV 20H,#01HL2: LJMP $;與L2:LJMP L2語句相同 END匯編語言程序的基本結(jié)構(gòu)形式-分支程序【例4-3】變量X存放在UNIT1單元內(nèi),函數(shù)值Y存放在UNIT2單元中,試按下式的要求給Y賦值。流程圖匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序1: ORG 0000HUNIT1 EQU 30HUNIT2EQU 31H MOV A,UNIT1 ;A←X JZ DONE ;若X=0,則轉(zhuǎn)DONE JNB ACC.7,POSI;若X>0,則轉(zhuǎn)POSI MOV A,#0FFH ;若X<0,則Y=-1 LJMP DONEPOSI:MOV A,#01H ;若X>0,則Y=1DONE:MOV UNIT2,A ;存函數(shù)值 LJMP $ END匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序2: ORG 1000H MOV A,UNIT1 ;A←X JZ DONE ;若X=0,則轉(zhuǎn)DONE MOV R0,#0FFH ;先設(shè)X<0,R0=FFH JB ACC.7,NEG ;若X<0,則轉(zhuǎn)NEG MOV R0,#01H ;若X>0,R0=1NEG:MOV A,R0 ;Y←R0DONE:MOV UNIT2,A ;存函數(shù)值 LJMP $ UNIT1DATA 30H UNIT2 DATA 31H END 匯編語言程序的基本結(jié)構(gòu)形式-分支程序匯編語言程序的基本結(jié)構(gòu)形式-分支程序散轉(zhuǎn)程序是一種并行分支程序,它可根據(jù)運算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。散轉(zhuǎn)指令:“JMP@A+DPTR”特點:轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時預(yù)先確定的,而是在程序運行過程中動態(tài)地確定的【例4-4】已知累加器A中存放著控制程序轉(zhuǎn)向的編號0~n(n<10),ROM中存有起始地址為TABLE的三字節(jié)長轉(zhuǎn)移指令表,試編程使單片機能按照累加器A中的編號轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序,即當(dāng)(A)=0時,執(zhí)行PR0分支程序;當(dāng)(A)=1時,執(zhí)行PR1分支程序;當(dāng)(A)=2時,執(zhí)行PR2分支程序;當(dāng)(A)=n時,執(zhí)行PRn分支程序。匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序1(采用“直接相乘”得到3*A):

MOV B,#03H MUL AB ;得到3×A MOV DPTR,#TABLE ;將TABLE地址送入

;DPTR寄存器中 JMP @A+DPTR;程序轉(zhuǎn)到地址為A+DPTR

;的地方去執(zhí)行TABLE:LJMP PR0 ;當(dāng)(A)=0時,執(zhí)行PR0分支程序 LJMP PR1 ;當(dāng)(A)=1時,執(zhí)行PR1分支程序 LJMP PR2 ;當(dāng)(A)=2時,執(zhí)行PR2分支程序 …… LJMP PRn;當(dāng)(A)=n時,執(zhí)行PRn分支程序匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序2(采用“三個A相加,即A+A+A”得到3*A)

MOV B,A ADD A,B ;得到2×A ADD A,B ;得到3×A MOV DPTR,#TABLE ;將TABLE地址送入

;DPTR寄存器中 JMP @A+DPTR;程序轉(zhuǎn)到地址為A+DPTR

;的地方去執(zhí)行TABLE:LJMP PR0 ;當(dāng)(A)=0時,執(zhí)行PR0分支程序 …… LJMP PRn;當(dāng)(A)=n時,執(zhí)行PRn分支程序匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序3(采用“左移一次,再加一次”得到3*A) CLR C MOV B,A RLC A ;得到2×A ADD A,B ;得到3×A MOV DPTR,#TABLE ;將TABLE地址送入

;DPTR寄存器中 JMP @A+DPTR;程序轉(zhuǎn)到地址為A+DPTR

;的地方去執(zhí)行TABLE:LJMP PR0 ;當(dāng)(A)=0時,執(zhí)行PR0分支程序 …… LJMP PRn;當(dāng)(A)=n時,執(zhí)行PRn分支程序匯編語言程序的基本結(jié)構(gòu)形式-分支程序參考程序4(允許3n產(chǎn)生一個進位的情況)

MOV DPTR,#TABLE ;將TABLE地址送入

;DPTR寄存器中 MOV B,A ADD A,B ;得到2×A ADD A,B ;得到3×A JNC LP1 ;無進位轉(zhuǎn)移,有進位位則DPH加“1” INC DPH ;加進位位LP1: JMP @A+DPTR ;程序轉(zhuǎn)到地址為A+DPTR

;的地方去執(zhí)行TABLE:LJMP PR0 ;當(dāng)(A)=0時,執(zhí)行PR0分支程序 …… LJMP PRn;當(dāng)(A)=n時,執(zhí)行PRn分支程序匯編語言程序的基本結(jié)構(gòu)形式-分支程序匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序在程序設(shè)計過程中,經(jīng)常會遇到需要重復(fù)執(zhí)行某一段程序的情況,這時可以使用循環(huán)程序結(jié)構(gòu),以便縮短程序存儲空間,提高程序的質(zhì)量。循環(huán)程序結(jié)構(gòu)只是分支程序中的一個特殊形式組成:(1)置循環(huán)初值,即確立循環(huán)開始時的狀態(tài)。(2)循環(huán)體(工作部分),要求重復(fù)執(zhí)行的部分。

(3)循環(huán)修改,循環(huán)程序必須在一定條件下結(jié)束。(4)循環(huán)控制部分,根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)??刂品椒ǎ貉h(huán)次數(shù)已知,利用循環(huán)次數(shù)控制;循環(huán)次數(shù)未知,利用關(guān)鍵字控制;匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序【例4-5】從BLOCK單元開始存放一組無符號數(shù),一般稱為一個數(shù)據(jù)塊。數(shù)據(jù)塊長度放在LEN單元,編寫一個求和程序,將和存入SUM單元,假設(shè)和不超過8位二進制數(shù)。匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序LEN DATA 20H SUM DATA 21H BLOCK DATA 22H ORG 0000H CLR A ;清累加器 MOV R2,LEN ;數(shù)據(jù)塊長度送R2 MOV R1,#BLOCK;數(shù)據(jù)塊首址送RlLOOP: ADD A,@R1 ;循環(huán)做加法 INC R1 ;修改地址指針 DJNZ R2,LOOP ;修改計數(shù)器并判斷 MOV SUM,A ;存和 END匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序【例4-6】將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串送到外部RAM中起始地址為buffer的存儲區(qū)域中,直到發(fā)現(xiàn)“$”字符,傳送停止——循環(huán)次數(shù)事先不知道先判斷,后執(zhí)行。匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序 ORG 0000H MOV R0,#data MOV DPTR,#bufferL1:MOV A,@R0 CJNE A,#24H,L2;判斷是否為$字符 LJMP L3 ;是,轉(zhuǎn)結(jié)束L2:MOVX @DPTR,A;不是,傳送數(shù)據(jù) INC R0 INC DPTR LJMP L1 ;傳送下一數(shù)據(jù)L3:LJMP L3 END匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序 ORG 0000H CLR C MOV R0,#52H ;被加數(shù)的低字節(jié)地址 MOV R1,#55H ;加數(shù)的低字節(jié)地址 MOV R7,#3 ;置循環(huán)次數(shù)LOOP:MOV A,@R0 ADDC A,@R1 ;字節(jié)相加 MOV @R0,A ;存字節(jié)相加結(jié)果 DEC R0 DEC R1 DJNZ R7,LOOP;循環(huán)次數(shù)減“1”不等于“0”

;則轉(zhuǎn)到LOOP MOV 00H,C;進位送00H位保存 END[例4-7]把例4-1三字節(jié)無符號數(shù)相加的程序改寫成循環(huán)方式。匯編語言程序的基本結(jié)構(gòu)形式-循環(huán)程序完成通用功能、反復(fù)使用的程序設(shè)計成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試。

執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序

結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu)調(diào)用時注意:一是現(xiàn)場的保護和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。匯編語言程序的基本結(jié)構(gòu)形式-子程序匯編語言程序的基本結(jié)構(gòu)形式-子程序【例4-8】設(shè)a,b是個位數(shù),分別存于內(nèi)部RAM的A1、A2兩個單元,編程計算平方和c=a2+b2,并將結(jié)果存入內(nèi)部RAM的A3單元中。分析

考慮到a,b是個位數(shù),我們可以設(shè)定一個個位數(shù)平方的表格,利用MOVCA,@A+DPTR語句,通過查表的方法來計算a和b的平方。因為c是兩個數(shù)的平方和,兩次求平方可以采用子程序,在子程序用累加器A來傳遞參數(shù)。 ORG 0000H MOV A,A1 ;取a LCALL SQR ;調(diào)用查表子程序 MOV R1,A ;a的平方暫存R1中 MOV A,A2 ;取b LCALL SQR ;調(diào)用查表子程序 ADD A,R1 ;求出平方和暫存在A中 MOV A3,A ;結(jié)果存于A3中 LJMP $SQR: MOV DPTR,#TAB ;子程序 MOVC A,@A+DPTR RETTAB:DB0,1,4,9,16,25,36,49,64,81 END匯編語言程序的基本結(jié)構(gòu)形式-子程序【例4-9】將內(nèi)部RAM從30H開始的8個單元的十六進制數(shù),轉(zhuǎn)換成ASCII碼,并存在內(nèi)部RAM從40H開始的單元中,轉(zhuǎn)換結(jié)果的高位存在前,低位存在后。分析:因為8個單元中,每個字節(jié)有兩個十六進制數(shù),可以編寫單一字節(jié)的轉(zhuǎn)換子程序,然后循環(huán)調(diào)用8次。轉(zhuǎn)換子程序在例4-10中已編好,待轉(zhuǎn)換數(shù)需傳入A中,直接調(diào)用子程序HEXASC,轉(zhuǎn)換完成的結(jié)果:高位ASCII碼在B中,低位ASCII碼在A中。我們可以根據(jù)約定好的入口和出口參數(shù)直接調(diào)用。匯編語言程序的基本結(jié)構(gòu)形式-子程序 ORG 0000H MOV R0,#30H;十六進制數(shù)存儲單元地址指針

MOV R1,#40H;ASCII碼存儲單元地址指針

MOV R7,#08H;循環(huán)次數(shù)LOOP:MOV A,@R0;將十六進制數(shù)給A,傳入口參數(shù)

LCALL HEXASC;調(diào)用轉(zhuǎn)換子程序(見例4-10)

MOV @R1,B;存高位ASCII碼

INC R1;指向下一個單元

MOV @R1,A;存低位ASCII碼

INC R1;存數(shù)指向下一個單元

INC R0;取數(shù)指向下一個單元

DJNZ R7,LOOP;循環(huán)減1,不為零則重復(fù)這一過程

LJMP $ END匯編語言程序的基本結(jié)構(gòu)形式-子程序常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序單片機能識別和處理的是二進制碼,而輸入/輸出設(shè)備(如:LED顯示器、微型打印機等)則常使用ASCII碼或十六進制數(shù)。為此,在單片機應(yīng)用系統(tǒng)中經(jīng)常需要通過程序進行二進制與BCD碼或ASCII碼的相互轉(zhuǎn)換。【例4-10】累加器A中存放的十六進制數(shù)轉(zhuǎn)換成兩位ASCII碼子程序。入口名稱:HEXASC入口參數(shù):(A)=二位十六進制數(shù)出口參數(shù):(B)=高位ASCII碼(A)=低位ASCII碼常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序參考程序1:HEXASC:PUSH

ACC;原數(shù)保存到堆棧SWAP

A;先轉(zhuǎn)換高四位,把高四位移到低四位 LCALL HEASC;轉(zhuǎn)換高四位 MOV B,A;存放高四位的ASCII碼 POP

ACC;從堆棧再取原數(shù) LCALL HEASC;轉(zhuǎn)換低四位 RETHEASC:NOP

;將累加器的低四位轉(zhuǎn)換成ASCII碼子程序 ANL

A,#0FH ;屏蔽高四位 MOV DPTR,#TAB;取表的首地址 MOVC A,@A+DPTR;查表 RET ;子程序返回TAB:

DB30H,31H,32H,33H,34H,35H,36H,37H,38H

DB39H,41H,42H,43H,44H,45H,46H;0~F的ASCII碼常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序參考程序2:HEASC:NOP ;將累加器的低四位轉(zhuǎn)換成ASCII碼子程序 PUSH

PSW;保護程序狀態(tài)字 ANL

A,#0FH;屏蔽高四位 CJNE A,#0AH,HE10;利用CJNE語句的減法

;功能,同時保持原數(shù)不變HE10:JC

HE20;有借位即是0~9,否則A~F ADD A,#07H;A~F的ASCII碼先加07H,

;下面再加30H,合計37HHE20:ADD

A,#30H;0~9的ASCII碼只加30H POP

PSW;恢復(fù)程序狀態(tài)字 RET常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序參考程序3:HEASC:NOP;將累加器的低四位轉(zhuǎn)換成ASCII碼子程序 ANL

A,#0FH;屏蔽高四位 ADD

A,#90H;以下四條指令進行轉(zhuǎn)換 DA

A ADDC

A,#40H DA

A

;轉(zhuǎn)換完成 RET常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序【例4-11】編寫將單字節(jié)二進制數(shù)轉(zhuǎn)換為BCD碼的子程序。入口名稱:BBCD入口參數(shù):A=待轉(zhuǎn)換8位二進制數(shù)出口參數(shù):B=百位BCD碼,A=十位、個位BCD碼參考程序1:BBCD:MOV B,#64H;將100裝入寄存器B中 DIV

AB;除以100,商數(shù)是百位數(shù)進入A中,小于100的余數(shù)在B中 PUSH ACC;堆棧保存百位數(shù) MOV A,#0AH;將10裝入A中 XCH A,B ;交換后,A中是待轉(zhuǎn)換數(shù),B中是“10” DIV AB;除以10,A中商數(shù)是十位數(shù),B中余數(shù)是個位數(shù) SWAP A;十位數(shù)放在高半字節(jié) ADD A,B;個位數(shù)放在低半字節(jié) POP B;將堆棧里的百位數(shù)推入到B寄存器中 RET常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序參考程序2:BBCD:PUSH PSW

;用到了進位位,需保護程序狀態(tài)字PSW MOV

B,#00H;百位計數(shù)單元清0 CLR C

;進位位清0BB10: SUBB A,#64H;-100 JC

BB20

;有借位轉(zhuǎn)走 INC

B

;百位計數(shù)單元+1 LJMP BB10

;循環(huán)BB20: ADD A,#64H;把多減的100加回來 PUSH B

;保存百位數(shù) MOV B,#00H;十位計數(shù)單元清0 CLR C

;進位位清0BB30: SUBB A,#0AH;-10 JC

BB40

;有借位轉(zhuǎn)走 INC

B

;十位計數(shù)單元+1 LJMP BB30

;循環(huán)常用程序設(shè)計舉例-數(shù)制轉(zhuǎn)換子程序BB40:ADD

A,#0AH;把多減的10加回來,A中是個位數(shù),B中是十位數(shù) XCH

A,B;A和B交換,A中是十位數(shù),B中是個位數(shù) SWAP A;十位數(shù)放在高半字節(jié) ADD A,B;個位數(shù)放在低半字節(jié) POP B;將堆棧里的百位數(shù)推入到B寄存器中 POP

PSW;恢復(fù)程序狀態(tài)字PSW

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論