




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章匯編語言程序設(shè)計(jì)第一頁,共一百零三頁,編輯于2023年,星期五4.1.1MCS-51匯編語言偽指令
偽指令不屬于指令系統(tǒng),匯編后不會產(chǎn)生機(jī)器碼,只用來對匯編過程進(jìn)行控制或提供某些匯編信息。如:規(guī)定匯編生成的目標(biāo)代碼在內(nèi)存種的存放區(qū)域,給源程序中的符號和標(biāo)號賦值以及指示匯編的結(jié)束等。但它不會令計(jì)算機(jī)做任何操作,沒有對應(yīng)的機(jī)器語言代碼,由于它有指令的形式而無指令的實(shí)質(zhì),所以稱“偽”指令。4.1匯編語言程序設(shè)計(jì)方法第二頁,共一百零三頁,編輯于2023年,星期五4.1.3MCS-51匯編語言偽指令
1.ORG(Origin)匯編起始地址命令功能:用于規(guī)定目標(biāo)程序的起始地址。格式:
[標(biāo)號:]ORG地址地址項(xiàng):16位絕對地址,也可以用標(biāo)號或表達(dá)式表示。如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。第三頁,共一百零三頁,編輯于2023年,星期五一個源程序中,可多次使用ORG指令以規(guī)定不同程序段的起始位置。地址應(yīng)從小到大順序排列,不允許重疊。例如: ORG0000H LJMP MAIN
ORG 4200HMAIN: MOV A,30H
第四頁,共一百零三頁,編輯于2023年,星期五2.DB(DefineByte)字節(jié)定義偽指令功能:用于從指定的地址單元開始,在程序存儲器中定義字節(jié)數(shù)據(jù)。格式: [標(biāo)號:]DB8位數(shù)表例如: DB“howareyou?”常使用本命令存放數(shù)據(jù)表格,例如存放數(shù)碼管顯示的十六進(jìn)制數(shù)的字形碼,可使用多條DB命令定義: DB C0H,F(xiàn)9H,A4H,B0H DB 99H,92H,82H, F8H DB 80H,90H,88H, 83H DB C6H,A1H,86H,84H第五頁,共一百零三頁,編輯于2023年,星期五
3.DW(DefineWord) 字定義偽指令功能:用于從指定地址開始,在程序存儲器單元中定義16位的數(shù)據(jù)字。格式:[標(biāo)號:]DW16位數(shù)表存放規(guī)則:高8位在前(低地址),低8位在后(高地址)。例: DW100H,1ACH,-814;按順序存01H,00H,01H,ACH,D2H,FCH DW “AA” ;存入41H,41H DW “A” ;存入00H,41H DW “ABC” ;不合法,因是兩個字節(jié)第六頁,共一百零三頁,編輯于2023年,星期五查表時,為確定數(shù)據(jù)區(qū)的起始位置,可采用兩種方法:(1)根據(jù)DB命令前一條指令的地址確定。例: 8100HMOV A,#49H(1字節(jié)) TAB:DB C0H,F9H,A4H,B0H(2)使用ORG指令專門規(guī)定例: ORG 8100H TAB:DB C0H,F9H,A4H,B0H定義的數(shù)碼管字形碼從8100地址開始存放。第七頁,共一百零三頁,編輯于2023年,星期五注意: DB和DW定義的數(shù)表,數(shù)的個數(shù)不得超過80個。 如果數(shù)據(jù)的數(shù)目較多時,可使用多個定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DB定義數(shù)據(jù),以DW定義地址。第八頁,共一百零三頁,編輯于2023年,星期五4.DS(DefineStorage)定義存儲區(qū)偽指令功能:用于從指定地址開始,保留指定數(shù)目的字節(jié)單元為存儲區(qū),供程序運(yùn)行使用。匯編時對這些單元不賦值。格式:[標(biāo)號:]DS16位數(shù)表
例: ADDRTABL:DS20
例: ORG8100HDS 08H注意:對MSC-51單片機(jī)來說,DB、DW、DS命令只能對程序存儲器使用,不能對數(shù)據(jù)存儲器使用。第九頁,共一百零三頁,編輯于2023年,星期五5.EQU(Equate)賦值偽指令功能:用于給字符名稱賦予一個特定值。賦值以后,其值在整個過程中有效。格式:
字符名稱EQU賦值項(xiàng)“賦值項(xiàng)”:可以是常數(shù)、地址、標(biāo)號或表達(dá)式。8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱即可作地址使用,也可作立即數(shù)使用。 PA8155 EQU 8001H 給標(biāo)號PA8155賦值8001H。第十頁,共一百零三頁,編輯于2023年,星期五6.BIT定義位地址符號偽指令功能:用于給字符名稱賦以位地址。格式:字符名稱BIT位地址例如:AAABIT40H BBBBIT 50H其中“位地址”可以是絕對地址,也可以是符號地址。第十一頁,共一百零三頁,編輯于2023年,星期五7.END(ENDofassembly)匯編終止命令
功能:用于終止源程序的匯編工作。 END之后的指令,匯編程序不予處理。格式:
[標(biāo)號:]END[表達(dá)式]只有主程序模塊才有“表達(dá)式”項(xiàng),且“表達(dá)式”的值等于該程序模塊的入口地址。而其他程序模塊就沒有“表達(dá)式”項(xiàng)?!皹?biāo)號:”也是選擇項(xiàng)。
一個源程序只能有一個END命令。第十二頁,共一百零三頁,編輯于2023年,星期五
4.1.2程序的設(shè)計(jì)步驟與方法
匯編和高級語言程序設(shè)計(jì)的過程:首先對問題進(jìn)行分析,然后確定算法,再根據(jù)算法流程編寫程序,最后是調(diào)試程序。匯編語言程序設(shè)計(jì)的獨(dú)特點(diǎn)在于:(1)用匯編語言進(jìn)行程序設(shè)計(jì)時,對數(shù)據(jù)的存放、寄存器和工作單元的使用等要由設(shè)計(jì)者安排。而高級語言程序設(shè)計(jì)時,這些工作都由計(jì)算機(jī)軟件安排,程序設(shè)計(jì)者不必考慮。第十三頁,共一百零三頁,編輯于2023年,星期五(2)匯編語言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對所使用的計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解。特別是對各類寄存器、端口、定時器/計(jì)數(shù)器、中斷等內(nèi)容要熟悉,以便在程序設(shè)計(jì)時能熟練使用。
第十四頁,共一百零三頁,編輯于2023年,星期五匯編語言程序的設(shè)計(jì)步驟:(1)分析問題,抽象出描述問題的數(shù)學(xué)模型(2)確定解決問題的算法(3)根據(jù)算法繪制流程圖(4)分配存儲空間及工作單元(5)編寫源程序(6)上機(jī)調(diào)試第十五頁,共一百零三頁,編輯于2023年,星期五程序質(zhì)量的判斷標(biāo)準(zhǔn):程序的執(zhí)行時間短;占用的內(nèi)存單元少;程序的語句行數(shù)少。
第十六頁,共一百零三頁,編輯于2023年,星期五4.1.3匯編語言源程序的編輯和匯編1.匯編語言源程序的編輯編輯好的源程序應(yīng)以“.ASM”擴(kuò)展名存盤
2.匯編語言源程序的匯編源程序經(jīng)機(jī)器匯編之后,若無語法錯誤,一般將生成兩個新文件,它們的擴(kuò)展名分別是.OBJ和.LST。
第十七頁,共一百零三頁,編輯于2023年,星期五例4-1將內(nèi)部RAM從30H開始的10個單元的內(nèi)容相加,其和保存于A(假設(shè)其和仍為8位數(shù))。列表文件(.LST)信息如下:地址機(jī)器碼 匯編語言源程序 注釋ORG 2000H ;定義程序起始地址20007830 START:MOV R0,#30H ;初始地址送R02002 7A0A MOV R2,#10 ;循環(huán)初始值送R220047400 MOV A,#00H ;累加和初始值送A200626 LOOP:ADDC A,@R0 ;完成累加2007 08 INC R0 ;修改地址2008 DAFC DJNZ R2,LOOP ;循環(huán)判斷200A 80FE SJMP $ ;暫停 END ;程序結(jié)束INCLUDEINHASHTABSTART: 2000 LOOP: 2006目標(biāo)文件(.OBJ)信息如下:2000200C78307A0A74002608DAFC80FE第十八頁,共一百零三頁,編輯于2023年,星期五方法一:用邏輯指令將高、低半字節(jié)分開,對數(shù)字0~9加上30H即可得到所對應(yīng)的ASCII碼30H~39H。
ORG 2000H MOV A,40H ;取數(shù) ANL A,#0FH ;分離出低半字節(jié) ADD A,#30H ;變?yōu)锳SCII碼 MOV 42H,A ;保存 MOV A,40H ;重新取數(shù) SWAP A ;高、低半字節(jié)交換 ANL A,#0FH ;分離出高半字節(jié) ADD A,#30H ;變?yōu)锳SCII碼 MOV 41H,A ;保存 END例4-2將40H單元的高、低半字節(jié)的兩個BCD碼拆開并變成其ASCII碼,并分別存入41H和42H單元
第十九頁,共一百零三頁,編輯于2023年,星期五匯編語言程序共有四種結(jié)構(gòu)形式:順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序結(jié)構(gòu)。第二十頁,共一百零三頁,編輯于2023年,星期五方法二:采用BCD數(shù)除以10H的方法,可把處于高、低半字節(jié)的兩個BCD碼分別移到A和B的低4位,然后再各自與30H相“或”即變?yōu)锳SCII碼。參考程序如下: ORG 2000H MOV A,40H ;取數(shù) MOV B,#10H ;送被除數(shù) DIV AB ;分離高、低半字節(jié) ORL B,#30H ;低4位調(diào)整為ASCII碼 MOV 42H,B ORL A,#30H ;高4位調(diào)整為ASCII碼 MOV 41H,A END例4-2將40H單元的高、低半字節(jié)的兩個BCD碼拆開并變成其ASCII碼,并分別存入41H和42H單元
第二十一頁,共一百零三頁,編輯于2023年,星期五例求兩個8位無符號數(shù)的和。設(shè)兩個8位無符號數(shù)分別存放在內(nèi)部RAM20H和21H單元,所求和(不超過255)存放在22H單元。
ORG 2000HSTART: MOV R0,#20H MOV A,@R0 INC R0 ADD A,@R0 INC R0 MOV @R0,A SJMP $ END第二十二頁,共一百零三頁,編輯于2023年,星期五4.2.5循環(huán)程序設(shè)計(jì)循環(huán)初態(tài)第二十三頁,共一百零三頁,編輯于2023年,星期五循環(huán)程序一般由四個主要部分組成:(1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。(2)處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。(4)結(jié)束部分:這部分主要是對循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。第二十四頁,共一百零三頁,編輯于2023年,星期五
循環(huán):單重循環(huán)多重循環(huán)(二重以上)--循環(huán)嵌套。在多重循環(huán)程序中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)程序,而不允許循環(huán)體互相交叉,另外,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。第二十五頁,共一百零三頁,編輯于2023年,星期五例4-3把外部RAM5000H~50FFH單元的內(nèi)容清零。
ORG2000HSTART1: MOV DPTR,#5000H ;循環(huán)初始化 MOV R0,#00H MOV A,#00HLOOP1: MOVX @DPTR,A ;循環(huán)體 INC DPTR INC R0
CJNE R0,#00H,LOOP1 ;循環(huán)控制 END第二十六頁,共一百零三頁,編輯于2023年,星期五例4-4將內(nèi)部RAM從40H開始連續(xù)單元的數(shù)據(jù)傳送到外部RAM從2000H開始的連續(xù)單元中,當(dāng)所傳送的數(shù)據(jù)為0FFH時,傳送停止。解: ORG 2000H MOV R0,#40H ;循環(huán)初始化 MOV DPTR,#2000H LOOP:MOV A,@R0 CJNE A,#0FFH,LOOP1 ;循環(huán)控制 SJMP NEXT LOOP1:MOVX @DPTR,A ;循環(huán)體 INC R0 INC DPTR SJMP LOOP NEXT:SJMP $ END
第二十七頁,共一百零三頁,編輯于2023年,星期五例4-5從P1口重復(fù)256次讀數(shù)并取平均值,平均值的整數(shù)和小數(shù)部分分別保存于內(nèi)部RAM的30H和31H單元中。 解:假設(shè)將R2R3作為16位寄存器以保存連續(xù)256次讀數(shù)的累加和 ORG 4000H INTEGER EQU 30H DECIMAL EQU 31HAVR: MOV R2,#0 ;循環(huán)初始化 MOV R3,#0 MOV R4,#0 ;累加次數(shù)為256AVR1: MOV A,P1 ;循環(huán)體 ADD A,R3 ;累加至低8位 JNC AVR2 ;無進(jìn)位則暫存結(jié)果 INC R2 ;有進(jìn)位則高8位加增1AVR2: MOV R3,A ;暫存低8位 DJNZ R4,AVR1 ;循環(huán)控制 MOV INTEGER,R2 MOV DECIMAL,R3 END第二十八頁,共一百零三頁,編輯于2023年,星期五例設(shè)單片機(jī)外部數(shù)據(jù)存儲器起始地址為3000H的數(shù)據(jù)塊中有100個補(bǔ)碼,要求逐一檢查,若為負(fù)數(shù)則求補(bǔ)后放回,正數(shù)則不變。
ORG1000HSTART1: MOV R7,#64H ;設(shè)置循環(huán)初始值 MOV DPTR,#3000H LOOP1: MOVX
A,@DPTR JNB ACC.7,LOOP2 CPL A INC A MOVX@DPTR,ALOOP2: INC DPTR ;外部RAM單元加1 DJNZ R7,LOOP1
END第二十九頁,共一百零三頁,編輯于2023年,星期五例有10個無符號數(shù)依次存放在內(nèi)部RAM30H開始的單元中,求其和,并將結(jié)果放在R2和R3中。 ORG2000H MOV R0,#30H MOV R2,#00H MOV R3,#00H MOV R7,#0AHNEXT: MOV A,@R0 ;設(shè)置循環(huán)初始值 ADD A,R3 MOV R3,A MOV A,R2 ADDC A,#00H MOV R2,A INC R0 DJNZ R7,NEXT SJMP $ END第三十頁,共一百零三頁,編輯于2023年,星期五例4.6設(shè)MCS-51單片機(jī)的時鐘頻率為fosc=12MHz,試設(shè)計(jì)延時50ms的延時程序。延時程序所花費(fèi)的時間是該程序指令的總機(jī)器周期數(shù)與機(jī)器周期的乘積。通常,延時程序采用MOV和DJNZ指令來實(shí)現(xiàn)。單循環(huán)延時程序,最大的循環(huán)次數(shù)位256,則程序段為:
MOV R0,#00H ;機(jī)器周期數(shù)為1DJNZ R0,$ ;機(jī)器周期數(shù)為2若單片機(jī)晶振為12MHz,則一個機(jī)器周期為1us。延時時間:(1+256×2)×1μs=513μs。
需采用多重循環(huán)。
第三十一頁,共一百零三頁,編輯于2023年,星期五
多重循環(huán):在一個循環(huán)體中又包含了其它的循環(huán)程序。這種方式是實(shí)現(xiàn)延時程序的常用方法。使用多重循環(huán)時,必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2)外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時由里往外一層層退出。(3)內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實(shí)現(xiàn)一個循環(huán)由多個條件控制的循環(huán)結(jié)構(gòu)方式。第三十二頁,共一百零三頁,編輯于2023年,星期五 MOV R1,#M LOOP: MOV R2,#N NOP DJNZ R2,$ DJNZ R1,LOOP內(nèi)層循環(huán)的機(jī)器周期數(shù)為Tn=1+1+2*N,總機(jī)器周期數(shù)為Tm=(Tn+2)*M+1.設(shè)N=123,M=200,則延時時間為50.001ms。第三十三頁,共一百零三頁,編輯于2023年,星期五修改后程序清單: ORG 2000H MOV R1,#0C8H(200) LOOP: MOV R2,#7BH(123) NOP DJNZ R2,$ DJNZ R1,LOOP SJMP $ END第三十四頁,共一百零三頁,編輯于2023年,星期五補(bǔ)充例設(shè)三字節(jié)無符號數(shù)相加被加數(shù):內(nèi)部RAM22H~20H單元(低位在低字節(jié)),加數(shù):內(nèi)部RAM32H~30H單元(低位在低字節(jié)),結(jié)果:存于內(nèi)部RAM22H~20H單元,進(jìn)位位存于23H單元。利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。第三十五頁,共一百零三頁,編輯于2023年,星期五 ORG 4200H MOV R0,#20H ;被加數(shù)的低字節(jié)地址 MOV R1,#30H ;加數(shù)的低字節(jié)地址 MOV R2,#03H ;循環(huán)次數(shù) CLR CLOOP:
MOV
A,@R0 ADDC
A,@R1 ;低字節(jié)相加 MOV
@R0,A ;存放字節(jié)相加結(jié)果
INC
R0 INC
R1
DJNZ
R2,LOOP ;循環(huán)控制
MOVA,#00H ADDC
A,#00H MOV
@R0,A ;進(jìn)位位送23H END第三十六頁,共一百零三頁,編輯于2023年,星期五4.2.3分支程序分支程序的基本結(jié)構(gòu):單分支和多分支。 其特點(diǎn)是:各處理模塊是相互排斥的。第三十七頁,共一百零三頁,編輯于2023年,星期五13條條件轉(zhuǎn)移指令,分別為:JZ,JNZ:累加器判零轉(zhuǎn)移指令;CJNE:比較條件轉(zhuǎn)移指令;DJNZ:減1條件轉(zhuǎn)移指令;JC,JNC,JB,JNB,JBC:位控制條件轉(zhuǎn)移指令等四類。第三十八頁,共一百零三頁,編輯于2023年,星期五(1)單重分支結(jié)構(gòu)例4-7片內(nèi)RAMDATA1和DATA2兩個單元中各存有一個無符號數(shù)字,將兩個數(shù)中的小者存入MIN單元。 ORG 4000H MIN EQU 30H DATA1 EQU 31H DATA2 EQU 32H MOV A,DATA1 ;第一數(shù)送A CLR C CJNE A,DATA2,UNEQU ;兩數(shù)比較 SJMP STORE ;相等,DATA1作為小的數(shù)UNEQU:JC STORE ;有借位,DATA1為小 MOV A,DATA2 ;無借位,DATA2為小STORE:MOV MIN,A ;小者送RAM END第三十九頁,共一百零三頁,編輯于2023年,星期五例4-8片內(nèi)RAM兩個單元中存有不相等的有符號數(shù)字X和Y,比較兩數(shù)的大小,并將大數(shù)存入MAX單元。
若X-Y>0,則當(dāng)(OV)=0時,X>Y; 當(dāng)(OV)=1時,X<Y;若X-Y<0,則當(dāng)(OV)=0時,X<Y;當(dāng)(OV)=1時,X>Y。圖4-6例4-8的流程圖第四十頁,共一百零三頁,編輯于2023年,星期五例4-8片內(nèi)RAM兩個單元中存有不相等的有符號數(shù)字X和Y,比較兩數(shù)的大小,并將大數(shù)存入MAX單元。
ORG 1000H XD EQU 31H YD EQU 32H MAX EQU 30H CLR C MOV A,XD SUBB A,YD ;X-Y,形成OV標(biāo)志 JZ XMAX ;若X=Y,則轉(zhuǎn)向FINISH JB ACC.7,NEG ;若(X-Y)<0,則轉(zhuǎn)向NEG JB OV,YMAX ;若(OV)=1,則轉(zhuǎn)向YMAX SJMP XMAX ;若(OV)=0,則轉(zhuǎn)向XMAXNEG: JB OV,XMAX ;若(OV)=1,則轉(zhuǎn)向XMAXYMAX:MOV A,YD ;Y>X,存Y SJMP FINISHXMAX:MOV A,XD ;X>Y,存XFINISH:MOV MAX,A ;大數(shù)送MAX單元 END第四十一頁,共一百零三頁,編輯于2023年,星期五(2)多重分支結(jié)構(gòu)例設(shè)x,y分別存放在內(nèi)部RAM30H和40H中,根據(jù)x的值,給y賦值為01H,00H,0FFH(-1).第四十二頁,共一百零三頁,編輯于2023年,星期五第四十三頁,共一百零三頁,編輯于2023年,星期五 ORG 2000H
MOV A,30H JZ DONE
JB ACC.7,LOOP MOV A,#01H SJMP DONELOOP: MOV A,#0FFH DONE: MOV 40H,A SJMP $
END第四十四頁,共一百零三頁,編輯于2023年,星期五(3)散轉(zhuǎn)結(jié)構(gòu)例設(shè)R7的內(nèi)容為0~n,對應(yīng)的處理程序入口地址分別為PROG0~PROGn,編寫散轉(zhuǎn)程序。
跳轉(zhuǎn)方法:逐個比較,類似CASE。 使用散轉(zhuǎn)指令JMP@A+DPTR。
設(shè)(R7)=0~n,對應(yīng)的處理程序入口地址分別為PROG0~PROGn,且按照一定的規(guī)律排列。第四十五頁,共一百零三頁,編輯于2023年,星期五ORG2000H
MOVDPTR,#TAB;設(shè)置處理程序入口首地址MOVA,R7 CLR C
RLCA ; JNC NEXT INC DPHNEXT:JMP@A+DPTR;轉(zhuǎn)向形成的散轉(zhuǎn)地址入口
TAB:AJMP PROG0;直接轉(zhuǎn)移地址表
AJMP PROG1……
AJMP PROGn第四十六頁,共一百零三頁,編輯于2023年,星期五例4-9在內(nèi)部RAM20H和21H單元中有兩個無符號的數(shù),由22H中的值決定對該數(shù)完成加、減、乘或除運(yùn)算(20H單元的數(shù)為被減數(shù)或被除數(shù)),運(yùn)算規(guī)則及結(jié)果保存處見表4-1。
表4-1例4-9說明(22H)操作結(jié)果保存處0加30H(低字節(jié)),31H(高字節(jié))1減40H2乘50H(低字節(jié)),51H(高字節(jié))3除60H(余數(shù)),61H(商)第四十七頁,共一百零三頁,編輯于2023年,星期五 ORG 1000H MOV A,22H MOV B,21H RL A MOV DPTR,#TAB JMP @A+DPTR NOPTAB: AJMP ADDM ;散轉(zhuǎn)表 AJMP SUBM AJMP MULM AJMP DIVMADDM:MOV A,20H ;加法運(yùn)算 ADD A,B MOV 30H,A MOV A,#0 ADDC A,#0 MOV 31H,A SJMP FINISH第四十八頁,共一百零三頁,編輯于2023年,星期五SUBM: MOV A,20H ;減法運(yùn)算 SUBB A,B MOV 40H,A SJMP FINISHMULM:MOV A,20H ;乘法運(yùn)算 MUL AB MOV 51H,B MOV 50H,A SJMP FINISHDIVM: MOV A,20H ;除法運(yùn)算 DIV AB MOV 61H,A MOV 60H,BFINISH:END第四十九頁,共一百零三頁,編輯于2023年,星期五4.2.4子程序設(shè)計(jì)
子程序與一般程序的主要區(qū)別是在子程序的末尾有一條子程序返回指令(RET),其功能是執(zhí)行完子程序后通過將堆棧內(nèi)的斷點(diǎn)地址彈出到PC而返回到主程序中。在編寫子程序時應(yīng)注意以下幾點(diǎn):
(1)要給每個子程序賦一個名字。
實(shí)際上是一個入口地址的代號。
(2)在子程序的末尾必須有子程序返回指令RET。(3)要能正確地傳遞參數(shù)。首先要有入口條件,說明進(jìn)入子程序時它所要處理的數(shù)據(jù)如何得到,另外,要有出口條件,即處理的結(jié)果是如何存放的。第五十頁,共一百零三頁,編輯于2023年,星期五(4)注意保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和單元的內(nèi)容。保護(hù)現(xiàn)場:PUSH恢復(fù)現(xiàn)場:POP(5)注意子程序的通用性。主程序調(diào)用子程序的指令:“LCALL”,“ACALL”。 子程序返回指令:RET。子程序可以嵌套,嵌套次數(shù)從理論上說是無限的,但實(shí)際上由于受堆棧深度的影響,嵌套次數(shù)是有限的。第五十一頁,共一百零三頁,編輯于2023年,星期五例4-10在圖3-11的P1口與LED的連接示意圖中,若使得LED0~LED7依次點(diǎn)亮,其延時時間分別從1s至8s,LED7點(diǎn)亮之后又從LED0開始循環(huán)。編寫匯編語言源程序?qū)崿F(xiàn)該功能。第五十二頁,共一百零三頁,編輯于2023年,星期五ORG 1000H MOV A,#1 ;主程序 MOV R4,#0NEXT:INC R4MOV P1,AACALL DELAY RL A SJMP NEXTDELAY:MOV R7,#10 ;1s延時子程序DELAY3:MOV R6,#200 DELAY2:MOV R5,#125 DELAY1:DJNZ R5,DELAY1 ;125×4=500μs=0.5ms DJNZ R6,DELAY2 ;0.5ms×200=0.1s DJNZ R7,DELAY3 ;0.1s×200=1s DJNZ R4,DELAY RET END第五十三頁,共一百零三頁,編輯于2023年,星期五例4-11兩個無符號數(shù)據(jù)塊的首地址分別為30H和40H,每個數(shù)據(jù)塊的第一個字節(jié)都存放著數(shù)據(jù)塊的長度(小于15),求各數(shù)據(jù)塊中最大值的乘積,并將結(jié)果存入50H(乘積低字節(jié))和51H(乘積高字節(jié))。
解:可將求最大值的過程編寫成一個子程序,子程序的入口參數(shù)是數(shù)據(jù)塊的首地址,存放在R1中,返回參數(shù)即為最大值,存放在A中,參考程序如下:
ORG 1000H ;主程序
MOV R1,#30H ;置入口條件參數(shù)
ACALL FMAX ;調(diào)用求最大值子程序
MOV B,A ;第一個最大值存放于B
MOV R1,#40H ;置入口條件參數(shù)
ACALL FMAX ;調(diào)用求最大值子程序
MUL AB ;求乘積
MOV50H,A ;存乘積低字節(jié)
MOV51H,B ;存乘積低高字節(jié)
SJMP $
第五十四頁,共一百零三頁,編輯于2023年,星期五
ORG 1200H ;子程序
FMAX:MOV A,@R1 ;取數(shù)據(jù)塊長度
MOV R2,A ;R2中存放數(shù)據(jù)塊的長度
INC R1 ;改變地址指針
MOV A,@R1 ;將第一個數(shù)放入A
DEC R2 ;數(shù)據(jù)個數(shù)減1
LOOP1:INC R1 ;修改地址指針
CLRC
SUBB A,@R1 ;相減比較大小
JNC LOOP2 ;A中的數(shù)為大,跳向
MOV A,@R1 ;否則,更換大數(shù)到A
SJMP LOOP3
LOOP2:ADD A,@R1 ;恢復(fù)原最大值LOOP3:LOOP3:DJNZ R2,LOOP1 ;若未比較完,則循環(huán)
RET
END第五十五頁,共一百零三頁,編輯于2023年,星期五例:將R0和R1所指的內(nèi)部RAM中兩個多字節(jié)無符號數(shù)相加,結(jié)果存入R0所指的內(nèi)部RAM中。
NADD:CLR C NADD1:MOVA,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R7,NADD1 JNC NADD2 MOV @R0,#01H INC R0 NADD2:DEC R0 RET第五十六頁,共一百零三頁,編輯于2023年,星期五4.3常用程序設(shè)計(jì)舉例4.3.1代碼轉(zhuǎn)換類程序計(jì)算機(jī)內(nèi)部的運(yùn)算一般都是用二進(jìn)制,而在計(jì)算機(jī)與外設(shè)的數(shù)據(jù)傳送中常采用BCD碼、ASCII碼和其它代碼,因此,就存在代碼轉(zhuǎn)換的問題。在程序設(shè)計(jì)中常采用算法處理和查表方式來實(shí)現(xiàn)代碼轉(zhuǎn)換。第五十七頁,共一百零三頁,編輯于2023年,星期五1.十六進(jìn)制數(shù)與ASCII碼之間的轉(zhuǎn)換例4-12將從30H單元開始的連續(xù)8個單元中存放的十六進(jìn)制數(shù)轉(zhuǎn)換成其所對應(yīng)的ASCII碼,并分別存放在從40H開始的16個單元中。解: ORG 2000H MOV R0,#30H ;設(shè)定地址指針 MOV R1,#40H MOV R7,#8 ;循環(huán)次數(shù)NEXT: MOV A,@R0 ;高字節(jié)轉(zhuǎn)換 SWAP A ANL A,#0FH ACALL HEXAS MOV @R1,A INC R1 MOV A,@R0 ;低字節(jié)轉(zhuǎn)換 ANL A,#0FH ACALL HEXAS MOV @R1,A INC R1 ;修改地址指針 INC R0 DJNZ R7,NEXT NOP SJMP $第五十八頁,共一百零三頁,編輯于2023年,星期五HEXAS:CLR C ;十六進(jìn)制轉(zhuǎn)換成ASCII碼子程序 SUBB A,#10 JC LOOP ADD A,#7LOOP: ADD A,#10 ;補(bǔ)償減掉的10 ADD A,#30H RET END
第五十九頁,共一百零三頁,編輯于2023年,星期五例把外部RAM30H~3FH單元中的ASCII碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并存入內(nèi)部RAM60H~67H單元之中。
假設(shè):被轉(zhuǎn)換的ASCII為十六進(jìn)制數(shù)(0~F)的ASCII,則,因?yàn)椋?/p>
0~9--ASCII30~39HA~F--ASCII41~46H
若(30H)=41H--A=1041H-30H=11H=17
第六十頁,共一百零三頁,編輯于2023年,星期五因?yàn)橐粋€字節(jié)可裝兩個轉(zhuǎn)換后得到的十六進(jìn)制數(shù),即兩次轉(zhuǎn)換才能拼裝為一個字節(jié)。為了避免在程序中重復(fù)出現(xiàn)轉(zhuǎn)換程序段,因此通常采用子程序結(jié)構(gòu),把轉(zhuǎn)換操作編寫為子程序。第六十一頁,共一百零三頁,編輯于2023年,星期五 ORG5000HMAIN:MOVR0,#30H;設(shè)置ASCII碼地址指針MOVR1,#60H;設(shè)置十六進(jìn)制數(shù)地址指針MOVR7,#08H ;字節(jié)個數(shù)AB:ACALLTRAN ;調(diào)用轉(zhuǎn)換子程序 SWAP A ;A高低字節(jié)交換 MOVX @R1,A INC R0
ACALL TRAN ;調(diào)用轉(zhuǎn)換子程序 XCHD A,@R1;十六進(jìn)制數(shù)拼裝 INC R0 INC R1 DJNZ R7,AB第六十二頁,共一百零三頁,編輯于2023年,星期五
子程序(TRAN):TRAN:CLR C MOVX A,@R0 ;取ASCII碼
SUBB A,#30H
CJNE A,#0AH,BB AJMP BCBB: JC DONEBC: SUBB A,#07H ;大于等于0AH,再減07HDONE:RETEND第六十三頁,共一百零三頁,編輯于2023年,星期五
例4-13將兩字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成三字節(jié)的BCD碼。若待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中(R6中為高位),轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)存于R3、R4和R5中(R3中為高位)。 解:二進(jìn)制數(shù)b7b6b5b4b3b2b1b0B所對應(yīng)的十進(jìn)制數(shù)X可按照下式計(jì)算因此,只要按照十進(jìn)制運(yùn)算法則,將bi(i=7,6,…,1,0)按權(quán)相加,就可以得到相應(yīng)的十進(jìn)制數(shù)X。參考程序如下: ORG 2000HHEBCD:MOV A,#0 ;BCD碼初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#16 ;循環(huán)次數(shù)NEXT: CLR C MOV A,R7 ;R7右移一位并送回 RLC A MOV R7,A MOV A,R6 ;R6右移一位并送回 RLC A MOV R6,A
第六十四頁,共一百零三頁,編輯于2023年,星期五 MOV A,R5 ;(R5)×2并調(diào)整為BCD碼 ADDC A,R5 DA A MOV R5,A MOV A,R4 ;(R4)×2并調(diào)整為BCD碼 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;若萬位數(shù)不超過6,則不用調(diào)整 DJNZ R2,NEXT ;處理完16位了嗎? NOP END第六十五頁,共一百零三頁,編輯于2023年,星期五4.3.2查表程序
常用于非線性修正、非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等。專用的查表指令:
MOVCA,@A+DPTR ;遠(yuǎn)程查表,64KB通過以下三步操作實(shí)現(xiàn)查表?!⑺楸砀竦氖椎刂匪腿隓PTR;·將要查找的數(shù)據(jù)序號,即數(shù)據(jù)在表中的位置送入累加器A中;·執(zhí)行查表指令MOVCA,@A+DPTR進(jìn)行讀數(shù)并存結(jié)果存于累加器A。第六十六頁,共一百零三頁,編輯于2023年,星期五 MOVCA,@A+PC ;近程查表,0~+256B其實(shí)現(xiàn)查表也可通過以下三步操作來完成?!⒁檎业臄?shù)據(jù)序號,即數(shù)據(jù)在表中的位置送入累加器A中;·把從查表指令到表的首地址間的偏移量與A值相加;·執(zhí)行查表指令MOVCA,@A+PC進(jìn)行讀數(shù),查表結(jié)果送累加器A。第六十七頁,共一百零三頁,編輯于2023年,星期五例4-14用查表指令編程實(shí)現(xiàn)將從30H單元開始的連續(xù)8個單元中存放的十六進(jìn)制數(shù)轉(zhuǎn)換成其所對應(yīng)的ASCII碼,并分別存放在從40H開始的16個單元中。
ORG 2000H ASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37H;ASCII碼表 DB38H,39H,41H,42H,43H,44H,45H,46H MOV R0,#30H ;設(shè)定地址指針 MOV R1,#40H MOV R7,#8 ;循環(huán)次數(shù) MOV DPTR,#ASCTABNEXT: MOV A,@R0 ;高字節(jié)轉(zhuǎn)換 SWAP A ANL A,#0FH MOVC A,@A+DPTR ;查表 MOV @R1,A INC R1 MOV A,@R0 ;低字節(jié)轉(zhuǎn)換 ANL A,#0FH MOVC A,@A+DPTR ;查表 MOV @R1,A INC R1 ;修改地址指針 INC R0 DJNZ R7,NEXT NOP END
第六十八頁,共一百零三頁,編輯于2023年,星期五例4-15在一個巡回檢測系統(tǒng)中,需對8路輸入進(jìn)行控制,每路都有一最大允許值,為雙字節(jié)數(shù),且不全相同??刂茣r,需將輸入值與最大值比較,若超過則進(jìn)行報(bào)警。編寫一子程序使其能查找每路的最大允許值。解:該查表運(yùn)算中自變量X是單字節(jié),而因變量Y是兩字節(jié)的數(shù)。假設(shè)被檢測路數(shù)存放在R7中(入口參數(shù)),0~7路的最大允許值依次存放在ROM中,查詢得到的最大值存放在30H(低字節(jié))和31H(出口參數(shù))中,則參考程序如下: ORG 1000H MOV DPTR,#TABLE MOV A,R7 RL A ;乘2進(jìn)行地址修正 MOV R7,A MOVC A,@A+DPTR ;查表取高字節(jié) MOV 31H,A INC DPTR MOV A,R7 MOVC A,@A+DPTR ;查表取低字節(jié) MOV 30H,ATABLE: DW 1245H,2345H,1022H,2390H ;最大允許值表 DW 3421H,2388H,2366H,2147H RET第六十九頁,共一百零三頁,編輯于2023年,星期五例若累加器A中存放的是一位BCD碼。通過查表將其轉(zhuǎn)換成為相應(yīng)的七段顯示碼,并存入寄存器B中。七段數(shù)碼顯示管連接方式:共陽極和共陰極兩種。共陽極是低電平為有效輸入,共陰極為高電平為有效輸入。假設(shè)數(shù)碼顯示管為共陰極。0~9的七段碼為3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。由于代碼沒有規(guī)律,一般采用查表完成。第七十頁,共一百零三頁,編輯于2023年,星期五hgfedcba00111111acedbgfh3FH第七十一頁,共一百零三頁,編輯于2023年,星期五若以DPTR為基址,程序段如下:ORG 2000H MOV A,#05H MOV DPTR,#TAB MOVCA,@A+DPTR MOV B,A SJMP $TAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH …
…第七十二頁,共一百零三頁,編輯于2023年,星期五若以PC為基地址,則程序段如下:
…
… MOV A,#05H ADD A,#01H MOVC A,@A+PC NOPTAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH …
…
第七十三頁,共一百零三頁,編輯于2023年,星期五例4-16若內(nèi)部RAM30H中存放的是一位BCD碼,通過查表將其轉(zhuǎn)換成為相應(yīng)的七段顯示碼,并存入寄存器31H中。解:0~9的共陰極字形代碼為3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 ORG1000H MOV A,30HADD A,#04H ;地址修正MOVC A,@A+PC MOV 31H,A ;2字節(jié)指令 SJMP$ ;2字節(jié)指令TAB:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHEND第七十四頁,共一百零三頁,編輯于2023年,星期五4.2.6邏輯操作程序
例4-17寫出圖4-7所示電路的邏輯表達(dá)式,并編程實(shí)現(xiàn)其功能解:該電路圖的最簡邏輯表達(dá)式為, ORG 1000H X BIT P1.0 ;輸入邏輯變量 Y BIT P1.1 Z BIT P1.2 F BIT P1.3 ;輸出邏輯變量EXOR: MOV C,X ANL C,/Y MOV F,C ;保存結(jié)果于F位 MOV C,Y ANL C,/X ORL C,F(xiàn) ANL C,Z MOV F,C ;F←() MOV C,X ANL C,Y ;XY ORL C,F(xiàn) MOV F,C END圖4-7例4-17的邏輯電路圖=1&≥11XYZF第七十五頁,共一百零三頁,編輯于2023年,星期五例4-18在圖3-7中,假設(shè)K1、K2和K3分別表示X、Y和Z三人對某一提案的表決,當(dāng)K閉合時,表示其同意該方案;當(dāng)K斷開時,表示不同意該方案。當(dāng)多數(shù)人同意時,輸出F為1。假設(shè)P1.7連接一共陰極LED,將結(jié)果用LED顯示出來。編程實(shí)現(xiàn)此功能。解:根據(jù)數(shù)字電路中組合邏輯電路的設(shè)計(jì)知識,得出該邏輯電路的最簡邏輯函數(shù)式是F=XY+XZ+YZ,據(jù)此設(shè)計(jì)的參考程序如下: ORG 1000H X BIT P1.0 Y BIT P1.1 Z BIT P1.2 MOV C,X ;實(shí)現(xiàn)XY ANL C,Y MOV 20H,C MOV C,X ;實(shí)現(xiàn)XZ ANL C,Z MOV 21H,C MOV C,Y ;實(shí)現(xiàn)YZ ANL C,Z ORL C,21H ORL C,20H MOV P1.7,C NOP END第七十六頁,共一百零三頁,編輯于2023年,星期五例設(shè)P1.0~P1.3為準(zhǔn)備就緒信號輸入端,當(dāng)該4位輸入全為1時說明各項(xiàng)工作已準(zhǔn)備好,單片機(jī)可順序執(zhí)行主程序,否則循環(huán)等待。 ORG 2000H LOOP:MOV A,P1 ANL A,#0FH CJNE A,#0FH,LOOP MAIN:第七十七頁,共一百零三頁,編輯于2023年,星期五
例用軟件實(shí)現(xiàn)邏輯函數(shù)。其中X、Y、Z、W、F均為位變量,分別對應(yīng)P1.0、P1.1、P1.2、P1.3和P1.7。由開關(guān)為P1.0、P1.1、P1.2、P1.3輸入值,而由P1.7輸出該邏輯函數(shù)值。第七十八頁,共一百零三頁,編輯于2023年,星期五 ORG5000H X BIT P1.0 Y BIT P1.1 Z BIT P1.2 W BIT P1.3 F BIT P1.7 TEMP BIT 20H.0 MOV C,X ANL C,Y ANL C,Z ;C←XYZ
MOV TEMP,C ;暫存XYZ ANL C,W
ORL C,TEMP ;C←XYZW+XYZ
MOV TEMP,C MOV C,X ANL C,/Y ANL C,W ;C←
ORL C,/TEMP ;C← MOV F,C ;輸出最后結(jié)果 END第七十九頁,共一百零三頁,編輯于2023年,星期五思考題與習(xí)題4-1把外部RAM5000H的內(nèi)容拆開,高位送5001H,低位送5002H。4-2 把外部RAM3000H開始的100字節(jié)的內(nèi)容傳送到從外部RAM3500H開始的連續(xù)單元中。4-3 設(shè)有100個有符號數(shù),連續(xù)存放在外部RAM以2000H為首地址的存儲區(qū)中,編程統(tǒng)計(jì)其中正數(shù)、負(fù)數(shù)和零的個數(shù),并分別存放在R5、R6和R7。4-4 外部RAM1000H開始連續(xù)存放20個雙字節(jié)無符號數(shù),低字節(jié)在前,高字節(jié)在后,編寫求和程序,將結(jié)果存入內(nèi)部RAM30H,31H,32H單元中。4-5 編程計(jì)算片內(nèi)RAM40H~47H單元中無符號數(shù)的算術(shù)平均值(假設(shè)和仍為8位數(shù)),結(jié)果存放在50H(商)和51H(余數(shù))中。第八十頁,共一百零三頁,編輯于2023年,星期五4-6 從內(nèi)部RAM30H開始存有一無符號數(shù)據(jù)塊,其長度在2FH單元中。求出數(shù)據(jù)塊中最小值和最大值并分別存入R6和R7中。4-7 將上題中“無符號數(shù)”改為“有符號數(shù)”,求出其中的最小值和最大值(參考例4-8)。4-8 從外部RAM首地址為1000H、長度為50H的數(shù)據(jù)塊中找出第一個ASCII碼‘#’,并將其地址送到1050H和1051H單元中,如果沒有‘#’,則使1050H和1051H單元的內(nèi)容為0。4-9 把外部RAM30H~3FH單元中的ASCII碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并存入內(nèi)部RAM60H~67H單元之中。4-10 假設(shè)晶振頻率fosc=6MHz,根據(jù)圖3-11的線路設(shè)計(jì)燈亮程序。要求將8只發(fā)光二極管間隔地分兩組,每組4只,兩組交叉輪流發(fā)光,反復(fù)循環(huán)不止,每組燈亮持續(xù)時間為1s。4-11 用軟件實(shí)現(xiàn)邏輯函數(shù)。其中X、Y、Z、W、F均為位變量,分別對應(yīng)P1.0、P1.1、P1.2、P1.3和P1.7。由P1.0、P1.1、P1.2、P1.3輸入值,而由P1.7輸出該邏輯函數(shù)值。第八十一頁,共一百零三頁,編輯于2023年,星期五
4-1把外部RAM5000H的內(nèi)容拆開,高位送5001H,低位送5002H。MOV DPTR,#5000HMOVX A,@DPTRMOV R1,ASWAP AANL A,#0FHINC DPTRMOVX @DPTR,AMOV A,R1ANL A,#0FHINC DPTRMOVX @DPTR,A第八十二頁,共一百零三頁,編輯于2023年,星期五
4-2 把外部RAM3000H開始的100字節(jié)的內(nèi)容傳送到從外部RAM3500H開始的連續(xù)單元中。 MOV DPTR,#3000H MOV R7,#100LOOP:MOVX A,@DPTR MOV R1,A MOV A,DPH ADD A,#5 MOV DPH,A MOV A,R1 MOVX @DPTR,A MOV A,DPH CLR C SUBB A,#05 MOV DPH,A DJNZ R7,LOOP第八十三頁,共一百零三頁,編輯于2023年,星期五 4-3 設(shè)有100個有符號數(shù),連續(xù)存放在外部RAM以2000H為首地址的存儲區(qū)中,編程統(tǒng)計(jì)其中正數(shù)、負(fù)數(shù)和零的個數(shù),并分別存放在R5、R6和R7。 MOV DPTR,#2000H MOV R0,#100 MOV R5,#0 ;正數(shù)個數(shù) MOV R6,#0 ;負(fù)數(shù)個數(shù) MOV R7,#0 ;0個數(shù)LOOP:MOVX A,@DPTR JZ ZERO JB ACC.7,NEG INC R5 SJMP LOOP1NEG:INC R6 SJMP LOOP1ZERO:INC R7LOOP1:DJNZ R0,LOOP第八十四頁,共一百零三頁,編輯于2023年,星期五 4-4 外部RAM1000H開始連續(xù)存放20個雙字節(jié)無符號數(shù),低字節(jié)在前,高字節(jié)在后,編寫求和程序,將結(jié)果存入內(nèi)部RAM30H,31H,32H單元中。 MOV DPTR,#2000H MOV R7,#20 MOV 30H,#0 MOV 31H,#0 MOV 32H,#0LOOP:MOVX A,@DPTR ADD A,30H MOV 30H,A INC DPTR MOVX A,@DPTR ADD A,31H MOV 31H,A JNC LOOP1 INC 31HLOOP1:INCDPTR DJNZ R7,LOOP第八十五頁,共一百零三頁,編輯于2023年,星期五4-5編程計(jì)算片內(nèi)RAM40H~47H單元中無符號數(shù)的算術(shù)平均值(假設(shè)和仍為8位數(shù)),結(jié)果存放在50H(商)和51H(余數(shù))中。 MOV R0,#40H MOV R7,#8 CLR CLOOP:ADD A,#@R0 INC R0 DJNZ R7,LOOP MOV B,#8 DIV AB MOV 50H,A MOV 51H,B第八十六頁,共一百零三頁,編輯于2023年,星期五4-6 從內(nèi)部RAM30H開始存有一無符號數(shù)據(jù)塊,其長度在2FH單元中。求出數(shù)據(jù)塊中最小值和最大值并分別存入R6和R7中。MOV R0,#30HMOV A,@R0MOV R6,AMOV R7,ADEC 2FHLOOP:INC R0CLR CMOV A,R6SUBB A,@R0JNC MINCLR CMOV A,R7SUBB A,@R0JNCLOOP1MAX:MOV A,@R0MOV R7,ASJMP LOOP1MIN:MOV A,@R0MOV R6,ALOOP1:DJNZ 2FH,LOOP第八十七頁,共一百零三頁,編輯于2023年,星期五4-8 從外部RAM首地址為1000H、長度為50H的數(shù)據(jù)塊中找出第一個ASCII碼‘#’,并將其地址送到1050H和1051H單元中,如果沒有‘#’,則使1050H和1051H單元的內(nèi)容為0。MOV DPTR,#1000HMOV R7,#50HLOOP:MOVX A,@DPTRCJNE A,#23H,LOOP1SJMP DONE1LOOP1:INC DPTRDJNZ R7,LOOPCLR AMOVX @DPTR,AINCDPTRMOVX @DPTR,ASJMP DONEDONE1:MOV R1,DPLMOV R2,DPHMOV DPTR,#1050HMOV A,R1MOVX @DPTR,AINC DPTRMOVA,R2MOVX @DPTR,ADONE:END第八十八頁,共一百零三頁,編輯于2023年,星期五4-9 把外部RAM30H~3FH單元中的ASCII碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并存入內(nèi)部RAM60H~67H單元之中。ORG5000HMAIN:MOVR0,#30H;設(shè)置ASCII碼地址指針MOVR1,#60H;設(shè)置十六進(jìn)制數(shù)地址指針MOVR7,#08H ;字節(jié)個數(shù)AB:ACALLTRAN ;調(diào)用轉(zhuǎn)換子程序 SWAP A ;A高低字節(jié)交換 MOVX @R1,A INC R0
ACALL TRAN ;調(diào)用轉(zhuǎn)換子程序 XCHD A,@R1;十六進(jìn)制數(shù)拼裝 INC R0 INC R1 DJNZ R7,AB第八十九頁,共一百零三頁,編輯于2023年,星期五
子程序(TRAN):TRAN:CLR C MOVX A,@R0 ;取ASCII碼
SUBB A,#30H
CJNE A,#0AH,BB AJMP BCBB: JC DONEBC: SUBB A,#07H ;大于等于0AH,再減07HDONE:RETEND第九十頁,共一百零三頁,編輯于2023年,星期五4-10 假設(shè)晶振頻率fosc=6MHz,根據(jù)圖3-11的線路設(shè)計(jì)燈亮程序。要求將8只發(fā)光二極管間隔地分兩組,每組4只,兩組交叉輪流發(fā)光,反復(fù)循環(huán)不止,每組燈亮持續(xù)時間為1s。ORG 1000HNEXT:MOV P1,#55HACALL DELAYMOV P1,#0CCHACALL DELAY SJMP NEXTDELAY:MOV R7,#10 ;1s延時子程序DELAY3:MOV R6,#200 DELAY2:MOV R5,#125 DELAY1:DJNZ R5,DELAY1 ;125×4=500μs=0.5ms DJNZ R6,DELAY2 ;0.5ms×200=0.1s DJNZ R7,DELAY3 ;0.1s×200=1s RET END第九十一頁,共一百零三頁,編輯于2023年,星期五4-11 用軟件實(shí)現(xiàn)邏輯函數(shù)。其中X、Y、Z、W、F均為位變量,分別對應(yīng)P1.0、P1.1、P1.2、P1.3和P1.7。由P1.0、P1.1、P1.2、P1.3輸入值,而由P1.7輸出該邏輯函數(shù)值。第九十二頁,共一百零三頁,編輯于2023年,星期五4.2.8實(shí)用程序設(shè)計(jì)舉例(1)排序類程序數(shù)據(jù)排序的算法有很多,常用的有冒泡排序法、插入排序法、選擇排序法、二路歸并排序法等。
第
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- “放管服”改革在信息技術(shù)行業(yè)的應(yīng)用方案
- 公共場所垃圾分類清運(yùn)方案
- 房地產(chǎn)開發(fā)EPC分包與采購方案
- 小學(xué)安全教育實(shí)施的具體措施
- 高中特色課程設(shè)置與管理范文
- 體育場館控?zé)燁I(lǐng)導(dǎo)職責(zé)
- 美術(shù)課程與文化傳承計(jì)劃
- 環(huán)境保護(hù)意識提升與管理措施
- 2025年手術(shù)室應(yīng)急預(yù)案與演練計(jì)劃
- 四年級英語綜合復(fù)習(xí)活動計(jì)劃
- 中醫(yī)四季養(yǎng)生之道課件
- 消防安全教育主題班會課件
- 房產(chǎn)中介獨(dú)家委托協(xié)議
- 乒乓球課程教學(xué)市公開課金獎市賽課一等獎?wù)n件
- 五年級下冊《體育與健康》全冊教案
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計(jì)規(guī)范-PDF解密
- Q-GDW1799.2-2013-電力安全工作規(guī)程-線路部分
- (2024版)肉、禽、蛋、奶及水產(chǎn)品零售行業(yè)綜合知識
- IBM咨詢-中糧生化ERP項(xiàng)目業(yè)務(wù)藍(lán)圖設(shè)計(jì)報(bào)告
- 海外利益安全
- 智慧農(nóng)業(yè)的智能農(nóng)機(jī)與裝備
評論
0/150
提交評論