




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2022-2-3第第章章5151程程序序系系統(tǒng)統(tǒng) 本章內(nèi)容本章內(nèi)容Single Chip Microcomputer程序設(shè)計概述設(shè)計言語n最早人們只能用機(jī)器言語二進(jìn)制編寫程序;最早人們只能用機(jī)器言語二進(jìn)制編寫程序;n為了方便記憶,人們開場用助記符方式的匯編言語編寫為了方便記憶,人們開場用助記符方式的匯編言語編寫程序,稱為低級言語。然后再用匯編系統(tǒng)將其翻譯成機(jī)程序,稱為低級言語。然后再用匯編系統(tǒng)將其翻譯成機(jī)器言語,該過程稱為匯編;器言語,該過程稱為匯編;n為了用更接近人的言語編寫程序,程序設(shè)計師們發(fā)明了為了用更接近人的言語編寫程序,程序設(shè)計師們發(fā)明了高級言語,如:高級言語,如: BASIC、FO
2、RTRAN、PASCAL、n C、JAVAn 然后再用編譯系統(tǒng)將其翻譯成機(jī)器言語,該過程稱為然后再用編譯系統(tǒng)將其翻譯成機(jī)器言語,該過程稱為編譯;編譯;n機(jī)器只能識別機(jī)器言語。所以必需用編譯系統(tǒng)將高級言機(jī)器只能識別機(jī)器言語。所以必需用編譯系統(tǒng)將高級言語編寫的源程序編譯成機(jī)器言語,用匯編系統(tǒng)將用匯編語編寫的源程序編譯成機(jī)器言語,用匯編系統(tǒng)將用匯編言語編寫的源程序匯編成機(jī)器言語;言語編寫的源程序匯編成機(jī)器言語;n由低級或高級言語構(gòu)成的程序稱為源程序,由機(jī)器言語由低級或高級言語構(gòu)成的程序稱為源程序,由機(jī)器言語構(gòu)成的程序稱作目的程序;構(gòu)成的程序稱作目的程序; 源程序 目的程序 低級言語機(jī)器言語匯編高級言
3、語機(jī)器言語編譯單片機(jī)的義務(wù)與設(shè)計風(fēng)格1面向控制;2途徑不一;目的 周期短、空間??;掌握方法、學(xué)會思想一、概述1機(jī)器言語、匯編言語、高級言語機(jī)器言語、匯編言語、高級言語2機(jī)器匯編、手工匯編機(jī)器匯編、手工匯編 文件后綴文件后綴ASM OBJ HEX3程序設(shè)計步驟程序設(shè)計步驟 (1) 分析問題;分析透分析問題;分析透 (2) 確定算法;確定算法; (3) 設(shè)計程序流程圖,參見設(shè)計程序流程圖,參見P76圖圖4-1 (4) 分配內(nèi)存單元,確定程序和數(shù)據(jù)分配內(nèi)存單元,確定程序和數(shù)據(jù) 區(qū)的起始地址;區(qū)的起始地址; (5) 編寫匯編言語程序;編寫匯編言語程序; (6) 仿真、調(diào)試程序、優(yōu)化。仿真、調(diào)試程序、優(yōu)
4、化。 (7) 固化程序。固化程序。3留意方法、本章安排留意方法、本章安排 2偽指令偽指令 偽指令不要求計算機(jī)做任何操作,也沒有對應(yīng)的機(jī)器碼,偽指令不要求計算機(jī)做任何操作,也沒有對應(yīng)的機(jī)器碼,不產(chǎn)生目的程序,不影響程序的執(zhí)行,僅僅是可以協(xié)助進(jìn)展匯不產(chǎn)生目的程序,不影響程序的執(zhí)行,僅僅是可以協(xié)助進(jìn)展匯編的一些指令。它主要用來指定程序或數(shù)據(jù)的起始位置,給出編的一些指令。它主要用來指定程序或數(shù)據(jù)的起始位置,給出一些延續(xù)存放數(shù)據(jù)的地址或?yàn)橹虚g運(yùn)算結(jié)果保管一部分存儲空一些延續(xù)存放數(shù)據(jù)的地址或?yàn)橹虚g運(yùn)算結(jié)果保管一部分存儲空間以及表示源程序終了等等。不同版本的匯編言語,偽指令的間以及表示源程序終了等等。不同版
5、本的匯編言語,偽指令的符號和含義能夠有所不同,但根本用法是類似的。符號和含義能夠有所不同,但根本用法是類似的。二、偽指令 1) 設(shè)置目的程序起始地址偽指令設(shè)置目的程序起始地址偽指令ORG 格式:格式:符號:符號: ORG 地址地址(十六進(jìn)制表示十六進(jìn)制表示) 該偽指令的功能是規(guī)定其后面的目的程序或數(shù)據(jù)該偽指令的功能是規(guī)定其后面的目的程序或數(shù)據(jù)塊的起始地址。它放在一段源程序塊的起始地址。它放在一段源程序(主程序、子程序主程序、子程序)或或數(shù)據(jù)塊的前面,闡明緊跟在其后的程序段或數(shù)據(jù)塊的數(shù)據(jù)塊的前面,闡明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是起始地址就是ORG后面給出的地址。例如:后面給出的地址。
6、例如: ORG 2000HSTART:MOV A,#7FH 2) 終了匯編偽指令終了匯編偽指令END 格式:格式:標(biāo)號:標(biāo)號: END END是匯編言語源程序的終了標(biāo)志,表示匯編是匯編言語源程序的終了標(biāo)志,表示匯編終了。在終了。在END以后所寫的指令,匯編程序都不予處以后所寫的指令,匯編程序都不予處置。一個源程序只能有一個置。一個源程序只能有一個END命令,否那么就有命令,否那么就有一部分指令不能被匯編。假設(shè)一部分指令不能被匯編。假設(shè)END前面加標(biāo)號的話,前面加標(biāo)號的話,那么應(yīng)與被終了程序段的起始點(diǎn)的標(biāo)號一致,以表那么應(yīng)與被終了程序段的起始點(diǎn)的標(biāo)號一致,以表示終了的是哪一個程序段。示終了的是哪
7、一個程序段。 3) 定義字節(jié)偽指令定義字節(jié)偽指令DB 格式:格式:標(biāo)號:標(biāo)號: DB 項(xiàng)或項(xiàng)表項(xiàng)或項(xiàng)表 其中項(xiàng)或項(xiàng)表指一個字節(jié)數(shù)據(jù),用逗號分開的字其中項(xiàng)或項(xiàng)表指一個字節(jié)數(shù)據(jù),用逗號分開的字節(jié)數(shù)據(jù)串,或以引號括起來的字符串。該偽指令的功節(jié)數(shù)據(jù)串,或以引號括起來的字符串。該偽指令的功能是把項(xiàng)或項(xiàng)表的數(shù)據(jù)能是把項(xiàng)或項(xiàng)表的數(shù)據(jù)(字符串按字符順序以字符串按字符順序以ASCII碼碼)存入從標(biāo)號地址開場的延續(xù)存儲單元中。例如:存入從標(biāo)號地址開場的延續(xù)存儲單元中。例如: ORG 2000HTAB1: DB 30H,8AH,7FH,73 DB 5,A,BCD 由于ORG 2000H,所以TAB1的地址為2000
8、H,因此,以上偽指令經(jīng)匯編后,將對2000H開場的延續(xù)存儲單元賦值:(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H ;十進(jìn)制數(shù)73以十六進(jìn)制數(shù)存放(2004H)=35H ;35H是數(shù)字5的ASCII碼(2005H)=41H ;41H是字母A的ASCII碼(2006H)=42H ;42H是字符串BCD中B的ASCII碼(2007H)=43H ;43H是字符串BCD中C的ASCII碼(2021H)=44H ;44H是字符串BCD中D的ASCII碼 4) 定義字偽指令定義字偽指令DW 格式:格式:標(biāo)號:標(biāo)號: DW 項(xiàng)或項(xiàng)表項(xiàng)或項(xiàng)表 DW偽指令與偽指令與DB
9、類似,但用于定義字的內(nèi)容。項(xiàng)或類似,但用于定義字的內(nèi)容。項(xiàng)或項(xiàng)表指所定義的一個字項(xiàng)表指所定義的一個字(兩個字節(jié)兩個字節(jié))或用逗號分開的字串?;蛴枚禾柗珠_的字串。匯編時,機(jī)器自動按高匯編時,機(jī)器自動按高8位先存入,低位先存入,低8位在后的格式陳位在后的格式陳列。例如:列。例如: ORG 1500HTAB2: DW 1234H,80H 匯編以后:匯編以后:(1500H)=12H,(1501H)=34H,(1502H)=00H, (1503H)=80H 5) 預(yù)留存儲空間偽指令預(yù)留存儲空間偽指令DS 格式:格式:標(biāo)號:標(biāo)號: DS 表達(dá)式表達(dá)式 該偽指令的功能是從標(biāo)號地址開場,保管假設(shè)干個該偽指令的
10、功能是從標(biāo)號地址開場,保管假設(shè)干個字節(jié)的內(nèi)存空間以備存放數(shù)據(jù)。保管的字節(jié)單元數(shù)由表字節(jié)的內(nèi)存空間以備存放數(shù)據(jù)。保管的字節(jié)單元數(shù)由表達(dá)式的值決議。例如:達(dá)式的值決議。例如: ORG 1000H DS 20H DB 30H,8FH 匯編后從匯編后從1000H開場,預(yù)留開場,預(yù)留32(20H)個字節(jié)的內(nèi)存?zhèn)€字節(jié)的內(nèi)存單元,然后從單元,然后從1020H開場,按照下一條開場,按照下一條DB指令賦值,指令賦值,即即(1020H)=30H,(1021H)=8FH。 6) 等值偽指令等值偽指令EQU 格式:標(biāo)號:格式:標(biāo)號: EQU 項(xiàng)項(xiàng) 該偽指令的功能是將指令中的項(xiàng)的值賦予該偽指令的功能是將指令中的項(xiàng)的值賦
11、予EQU前前面的標(biāo)號。項(xiàng)可以是常數(shù)、地址標(biāo)號或表達(dá)式。例如:面的標(biāo)號。項(xiàng)可以是常數(shù)、地址標(biāo)號或表達(dá)式。例如:TAB1 EQU 1000HTAB2 EQU 2000H (驗(yàn)證能否需求:?驗(yàn)證能否需求:? 匯編后匯編后TAB1、TAB2分別具有值分別具有值1000H、2000H。 用用EQU偽指令對某標(biāo)號賦值后,該標(biāo)號的值在偽指令對某標(biāo)號賦值后,該標(biāo)號的值在整個程序中不能再改動。整個程序中不能再改動。 7) 位地址定義偽指令位地址定義偽指令BIT 格式:標(biāo)號格式:標(biāo)號 BIT 位地址位地址 該偽指令的功能是將位地址賦予該偽指令的功能是將位地址賦予BIT前面的標(biāo)號,前面的標(biāo)號,經(jīng)賦值后可用該標(biāo)號替代
12、經(jīng)賦值后可用該標(biāo)號替代BIT后面的位地址。例如:后面的位地址。例如:PLG BIT F0AI BIT P1.0 經(jīng)以上偽指令定義后,在程序中就可以把經(jīng)以上偽指令定義后,在程序中就可以把FLG和和AI作為位地址來運(yùn)用。作為位地址來運(yùn)用。單片機(jī)匯編命令與機(jī)器指令地址機(jī)器碼源程序清單0000H0023H2000H2003H2006H2021H02200002XXXX758920 758DF3758BF3D28EMAIN:ORG 0000HLJMP MAINORG 0023HLJMP INTSERORG 2000HMOV TMOD,#20HMOV TH1,#0F3HMOV TL1,0F3HSETB T
13、R1;上電轉(zhuǎn)向主程序;串行口中斷入口;轉(zhuǎn)中斷效力程序;主程序;設(shè)T1作方式2;賦計數(shù)初值;啟動T11 1目的目的 (1) (1) 掌握匯編言語程序的根本構(gòu)造。掌握匯編言語程序的根本構(gòu)造。 (2) (2) 了解匯編言語程序設(shè)計的根本方法和思緒。了解匯編言語程序設(shè)計的根本方法和思緒。實(shí)例實(shí)例 霓虹燈的控制霓虹燈的控制2 2引入引入請察看以下幾請察看以下幾例程序的執(zhí)行例程序的執(zhí)行順序順序? ?霓虹燈的簡易原理霓虹燈的簡易原理P1P1口滿足什么條件口滿足什么條件點(diǎn)燈嗎?點(diǎn)燈嗎?開始點(diǎn)亮8個發(fā)光二極管延時熄滅8個發(fā)光二極管延時結(jié)束 流程圖3 3實(shí)訓(xùn)程序?qū)嵱?xùn)程序程序程序1:一切發(fā)光二極管不停地閃爍。:一切
14、發(fā)光二極管不停地閃爍。 ORG 0000H;程序從地址程序從地址0000H開場存放開場存放START: MOV P1,#00H;把立刻數(shù)把立刻數(shù)00H送送P1口,點(diǎn)亮一切發(fā)光二極管口,點(diǎn)亮一切發(fā)光二極管 ACALL DELAY;調(diào)用延時子程序調(diào)用延時子程序 MOV P1,#0FFH ;滅掉一切發(fā)光二極管滅掉一切發(fā)光二極管 ACALL DELAY;調(diào)用延時子程序調(diào)用延時子程序 AJMP START;反復(fù)閃爍反復(fù)閃爍DELAY: MOV R3,#7FH ;延時子程序延時子程序DEL2: MOV R4,#0FFHDEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END;
15、匯編程序終了匯編程序終了 程序程序2:用開關(guān)控制發(fā)光二極管的顯示方式。:用開關(guān)控制發(fā)光二極管的顯示方式。 ORG0000H MOVP3,#00010000B ;使;使P3口鎖存器的口鎖存器的P3.4置位置位 MOVA,P3;讀;讀P3口引腳線信號口引腳線信號 ANLA,#00010000B ;“邏輯與操作,屏蔽掉無關(guān)位邏輯與操作,屏蔽掉無關(guān)位 JZ DDPING ;判別;判別P3.4能否接地,假設(shè)是,跳轉(zhuǎn)到能否接地,假設(shè)是,跳轉(zhuǎn)到DDPING執(zhí)行執(zhí)行 MOVP1,#00H;否那么,;否那么,P3.4接高電平,點(diǎn)亮一切發(fā)光二極管接高電平,點(diǎn)亮一切發(fā)光二極管 SJMP $DDPING:MOVP1,
16、#55H;P3.4接地,發(fā)光二極管交叉亮滅接地,發(fā)光二極管交叉亮滅 SJMP$ ENDA=0A0讀P3.4的管腳YN結(jié)束P3.4接地?開始發(fā)光二極管交叉亮滅點(diǎn)亮8個發(fā)光二極管程序2流程圖程序程序3:使:使8個發(fā)光二極管順序點(diǎn)亮。個發(fā)光二極管順序點(diǎn)亮。 ORG 0000HSTART: MOV R2,#08H ;設(shè)置循環(huán)次數(shù)設(shè)置循環(huán)次數(shù) MOV A,#0FEH ;送顯示方式字送顯示方式字NEXT: MOV P1,A ;點(diǎn)亮銜接點(diǎn)亮銜接P1.0的發(fā)光二極管的發(fā)光二極管 ACALL DELAY RL A ;左移一位,改動顯示方式字左移一位,改動顯示方式字 DJNZ R2,NEXT ;循環(huán)次數(shù)減循環(huán)次數(shù)
17、減1,不為零,繼續(xù)點(diǎn)亮下面一個二極管,不為零,繼續(xù)點(diǎn)亮下面一個二極管 SJMP STARTDELAY: MOV R3,#0FFH ;延時子程序開場延時子程序開場DEL2: MOV R4,#0FFHDEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET ENDR4-10R4-1=0R3-10R3-1=0R2-10R3-1=0YN顯示模式字左移1位次數(shù)-1=0延時開始設(shè)循環(huán)次數(shù)設(shè)循環(huán)初值顯示模式字送P1口程序3流程圖程序設(shè)計實(shí)例引入n實(shí)例實(shí)例n假設(shè)一個班有假設(shè)一個班有50個人,個人,n共有共有3門選修課:門選修課:n計算機(jī)算法計算機(jī)算法n服裝服裝CAD設(shè)計設(shè)計n德語德語n請
18、找出:請找出:n同時選了三門課的同窗;同時選了三門課的同窗;問題的處理問題的處理n第一步第一步n 如何在計算機(jī)中表示選修某門課的一切同窗如何在計算機(jī)中表示選修某門課的一切同窗5122325225392939412252939計算機(jī)算法計算機(jī)算法 服裝服裝CAD設(shè)計設(shè)計德語德語選修這門人數(shù)選修這門人數(shù)學(xué)生的學(xué)號學(xué)生的學(xué)號問題的處理問題的處理n第二步第二步n 設(shè)計思緒:找出同時選了三門課的同窗設(shè)計思緒:找出同時選了三門課的同窗計算機(jī)算法計算機(jī)算法CAD設(shè)計設(shè)計德語德語反復(fù)該過程反復(fù)該過程第三步:設(shè)計流程第三步:設(shè)計流程找出第一個學(xué)生找出第一個學(xué)生他選了德語嗎?他選了德語嗎?他選了他選了CADCAD
19、嗎?嗎?記錄要找的人記錄要找的人還有學(xué)生嗎?還有學(xué)生嗎?下一個學(xué)生下一個學(xué)生N NN NY YN NY YY Y終了終了他選計算機(jī)嗎?他選計算機(jī)嗎?N NY Y幾點(diǎn)啟示幾點(diǎn)啟示n整體構(gòu)思;整體構(gòu)思;n構(gòu)建整體流程框圖;構(gòu)建整體流程框圖;n構(gòu)造合理,流程明晰,簡單明了;構(gòu)造合理,流程明晰,簡單明了;n部分模塊化;部分模塊化;符合人進(jìn)展邏輯思索的習(xí)慣符合人進(jìn)展邏輯思索的習(xí)慣計算機(jī)從根本上來說,沒有任何邏輯性,計算機(jī)從根本上來說,沒有任何邏輯性,所以,他必需通知它,先做什么,后做什所以,他必需通知它,先做什么,后做什么,遇到什么情況又該做什么,等等么,遇到什么情況又該做什么,等等流程圖設(shè)計本身是一個
20、逐漸求精的過程,流程圖設(shè)計本身是一個逐漸求精的過程,最終將義務(wù)劃分為假設(shè)干能由機(jī)器指令實(shí)最終將義務(wù)劃分為假設(shè)干能由機(jī)器指令實(shí)現(xiàn)的小模塊現(xiàn)的小模塊第四章 程序設(shè)計 n【例4.1.8】P68)從片內(nèi)RAM 40H單元開場存放三個無符號數(shù),假設(shè)40H單元的數(shù)等于2BH,那么把后面兩單元的數(shù)相加,假設(shè)40H單元的數(shù)等于2DH,那么把后面兩單元的數(shù)相減,并將計算結(jié)果存放到43H單元中。假設(shè)40H單元非2BH或2DH,那么作出錯處置,其出錯結(jié)果為FFH。試按要求編制源程序,并手工匯編成機(jī)器碼。 第四章 程序設(shè)計 地址機(jī)器碼源程序清單0000H:0100H:0102H:0105H:0107H:0109H:0
21、10BH:010DH:0110H:0111H:0113H:0115H:0117H:0119H:011CH:020210E540B42B08E5412542F543800FB42D09C3E5419542F54380037543FF80FEMAIN:PLUS:MINUS:ERR:CLOSE:ORGLJMPORGMOVCJNEMOVADDMOVSJMPCJNECLRMOVSUBBMOVSJMPMOVSJMPEND0000HMAIN0100HA,40HA,#2BH,MINUSA,41HA,42H43H,ACLOSEA,#2DH,ERRCA,41HA,42H43H,ACLOSE43H,#0FFH$P7
22、0 例4.2.3 數(shù)據(jù)拼拆程序。將內(nèi)部RAM 20H單元中存放的BCD碼十進(jìn)制數(shù)拆開并變成相應(yīng)的ASCII碼,分別存放到21H和22H單元中。4.2 簡單順序程序設(shè)計 此題中,首先必需將兩個數(shù)拆開,然后再拼裝成兩個ASCII碼。數(shù)字與ASCII碼之間的關(guān)系是:高4位為0011H,低4位即為該數(shù)字的8421碼。圖4.6 例4.2題意分析表示圖什么是BCD碼?什么是ASII碼? 數(shù)字與ASCII碼之間的關(guān)系是:高4位為0011H,低4位即為該數(shù)字的8421碼。將將20H20H單元的兩個緊縮單元的兩個緊縮BCDBCD碼拆開變成碼拆開變成ASCIIASCII碼,存入碼,存入21H21H、22H22H單
23、元。單元。( (假設(shè)假設(shè)20H20H中的中的BCDBCD碼為碼為00110100)00110100)0011緊縮BCD碼0011 0011 0100低四位ASII碼高四位ASII碼P78-79 P78-79 例例4.2.34.2.3方法方法1 1:利用半字節(jié)交換指令來實(shí)現(xiàn)。:利用半字節(jié)交換指令來實(shí)現(xiàn)。第四章 程序設(shè)計 ORG 0000H MOV R0,#20H MOV A,#30H XCHD A,R0 MOV 22H,A MOV A,R0 SWAP A ORL A , #30H MOV 21H, A SJMP $ END簡單程序例1-方法1 開場 #20HR0#30HA A的低4位20H)的低
24、4位 A(22H)(20H)A A的低4位A的高4位 A(21H) 終了 A+30HA源程序如下:00110010 000000110100000001000011 01000011 00000011 00000011 0011方法方法2 2:將:將BCDBCD碼除以碼除以10H10H,恰好是將,恰好是將BCDBCD碼分別移到了碼分別移到了A A、B B的低的低4 4位。然后再各自位。然后再各自與與30H30H相或,即成為相或,即成為ASCIIASCII碼。碼。第四章 程序設(shè)計ORG 0000HMOV A,20HMOV B,#10HDIV ABORL B,#30HMOV 22H,BORL A,
25、#30HMOV 21H,ASJMP $END 開場 (20H)A10HB A/B (A中為高4位BCD碼,B中為低4位BCD碼) B+30HB B(22H) A+30HA A(21H) 終了簡單程序例1-方法2源程序如下:001101000011 01000001 0000001100000000 01000011 01000011根本步驟n題意分析n畫出流程圖n分配內(nèi)存及端口n編制源程序n仿真、調(diào)試程序n固化程序分析分析: :00111000011001010001000110000111BCD碼83HBCD碼11HBCD碼78HBCD碼56H ORG 0000H ORG 0000H MOV
26、 A MOV A,22H22H ADD A ADD A,32H32H DA A DA A MOV 42H MOV 42H,A A MOV A MOV A,23H23H ADDC A ADDC A,33H33H DA A DA A MOV 43H MOV 43H,A A SJMP $ SJMP $ END END 此條加法指令可否此條加法指令可否改用帶進(jìn)位的改用帶進(jìn)位的(ADDC)?(ADDC)? 開場(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+AA A(43H) 終了 A(42H)(23H)A 十進(jìn)制調(diào)整 ORG 2000H CLR C MOV A,22H ADD A,32H DA A
27、MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END1000 00110101 01100001 00010111 10001000 00110111 1000+1111 10110110 00010001 00010101 01100110 01110110 10001111 10110110 00010110 10000110 01114.3 分支程序設(shè)計a)普通分支 b)散轉(zhuǎn)圖4-4 分支程序構(gòu)造表示圖(R)=?程序0程序1程序n=n=1=0.條件滿足否?YN程序跳轉(zhuǎn) 順序執(zhí)行n例4.3.2(p74):知30H單元中有一變量X,
28、要求編寫一程序按下述要求給Y賦值,結(jié)果存入31H單元。n 1 , X0n Y = 0 , X = 0n 1 , X0n題意:根據(jù)X的不同,程序編寫時有三個出口,即有三個分支! 想一想:程序怎樣編寫?0000,00111000,0011正數(shù)標(biāo)志位負(fù)數(shù)標(biāo)志位4.3 分支程序設(shè)計分支程序?qū)嵗?三分支程序開場 XAA= 1 A= A+1存結(jié)果終了YYNN程序框圖:A0?A=0?分支程序?qū)嵗?三分支程序 源程序如下: ORG 2000H MOV A,30H JZ LP1 ;X = 0,轉(zhuǎn)LP1處置 JNB ACC.7,LP2 ;X0,轉(zhuǎn)LP2處置 MOV A,#0FFH ;X0,那么Y= 1 SJMP
29、LP1 LP2:MOV A,#01 ;X 0,Y=1 LP1:MOV 31H,A ;存結(jié)果 SJMP $ ;循環(huán)等待,$表示轉(zhuǎn)至 本地址,此方法適用 于一字節(jié)的偏移量最高位為符號位。本例與P74例4.3.2類似.P74 例4.3.2START:SUL:NEG:DATA:FSGN:ORGMOVMOVXJZJBMOVMOVMOVXSJMPMOVSJMPDBDBEND4000HDPTR,#DATAA,DPTRSULACC.7,NEGA,#01HDPTR,#FSGNDPTR,A$A,#0FFHSULxn;取x值;x=0,轉(zhuǎn)SUL;判x的符號位,為負(fù)轉(zhuǎn)移;假設(shè)x0,那么1A;保管y值;程序終了,等待處置
30、;假設(shè)x0,那么-1A;x為恣意數(shù);n為恣意數(shù)1.了解DPTR、MOVX、DB的用法.2.本例假設(shè)采用CJNE A,#0能否可以?參照例4.3.3 P75 設(shè)內(nèi)部RAM20H單元和30H 單元中分別存放了兩個8位的無符號數(shù) X、Y, 假設(shè)XY 那么讓P1.0管腳銜接的LED亮;假設(shè)XY,點(diǎn)亮P1.1X=Y,點(diǎn)亮P1.0X0?NY程序清單 X DATA 20H Y DATA 30H;偽指令偽指令 ORG 0030H MOV A,X XRL A,Y ;X,Y進(jìn)展異或進(jìn)展異或 JB ACC.7,NEXT1 ;二者符號不同,跳轉(zhuǎn)到;二者符號不同,跳轉(zhuǎn)到NEXT1 MOV A,X ;符號一樣;符號一樣
31、CJNE A,Y,NEQUAL;X Y,跳轉(zhuǎn)到,跳轉(zhuǎn)到NEQUAL CLR P1.0 ;X=Y,點(diǎn)亮,點(diǎn)亮P1.0 SJMP FINISHNEQUAL: JC XXY ;X Y,轉(zhuǎn)移到,轉(zhuǎn)移到XDYNEXT1: MOV A,X JNB ACC.7,XDY ;判別;判別X的正、負(fù),正那么轉(zhuǎn)移到的正、負(fù),正那么轉(zhuǎn)移到XDYXXY: CLR P1.2 ;X Y,點(diǎn)亮,點(diǎn)亮P1.1FINISH: SJMP $ END數(shù)據(jù)比較大小的方法n1無符號數(shù)n2有符號數(shù)n還可以利用溢出標(biāo)志OV的形狀來判別兩個有符號數(shù)的大小。詳細(xì)算法如下:n假設(shè)X-Y為正數(shù),即CY=0n 那么 OV=0 時 XYn OV=1 時X
32、Yn假設(shè)X-Y為負(fù)數(shù),即CY=1n 那么 OV=0 時 XY4.4 散轉(zhuǎn)程序n散轉(zhuǎn)程序是指經(jīng)過修正某個參數(shù)后,程序可以有三個以上的流向,多用于鍵盤程序。n常用的指令是JMP A+DPTR,該指令是把16位數(shù)據(jù)指針DPTR的內(nèi)容與累加器A中的8位無符號數(shù)相加,構(gòu)成地址,裝入程序計數(shù)器PC,構(gòu)成散轉(zhuǎn)的目的地址。DPTRAPCA中內(nèi)容為8位無符號數(shù)16位地址數(shù) 程序清單如下:JUMP1: MOV DPTR,JPTAB1 ;跳轉(zhuǎn)表首送數(shù)據(jù)指針 MOV A,R6 ADD A,R6 ;R62A (修正變址值) JNC NOAD ;判有否進(jìn)位 INC DPH ;有進(jìn)位那么加到高字節(jié)地址 NOAD: JMP
33、A+DPTR ;轉(zhuǎn)向構(gòu)成的散轉(zhuǎn)地址人口JPTAB1: AJMP OPR0 ;直接轉(zhuǎn)移地址表 AJMP OPR1 . AJMP OPRn例: 根據(jù)R6的內(nèi)容,轉(zhuǎn)向各自對應(yīng)的操作程序 1.AJMP 與LJMP的順應(yīng)范圍;(與P56比較2.假設(shè)采用LJMP應(yīng)如何如修正?圖4.11 指令轉(zhuǎn)移表的存儲格式TABLE3DPTRTABLETWOONEAJMPTABLE1TABLE2TABLE4TABLE5TABLE6TABLE7AJMPAJMPAJMPTHREEFOURA0A2A4A6 由于無條件轉(zhuǎn)移指令A(yù)JMP是兩字節(jié)指令,因此控制轉(zhuǎn)移方向的A中的數(shù)值為A=0 轉(zhuǎn)向AJMP ONEA=2 轉(zhuǎn)向AJMP T
34、WO A=4 轉(zhuǎn)向AJMP THREE A=6 轉(zhuǎn)向AJMP FOUR 程序中,從P3口讀入的數(shù)據(jù)分別為0、1、2、3,因此必需乘以2來修正A的值。假設(shè)A=2,散轉(zhuǎn)過程如下: JMPA+DPTR PC=TABLE+2 AJMP TWO三種無條件轉(zhuǎn)移指令LJMP、AJMP和SJMP 的比較。 三種無條件轉(zhuǎn)移指令在運(yùn)用上的區(qū)別有以下三點(diǎn): 一是轉(zhuǎn)移間隔不同,LJMP可在64 KB范圍內(nèi)轉(zhuǎn)移,AJMP指令可以在本指令取出后的2 KB范圍內(nèi)轉(zhuǎn)移,SJMP的轉(zhuǎn)移范圍是以本指令為中心的-126+129 B范圍內(nèi)轉(zhuǎn)移; 二是匯編后機(jī)器碼的字節(jié)數(shù)不同,LJMP是三字節(jié)指令,AJMP和SJMP都是兩字節(jié)指令。
35、三是LJMP和AJMP都是絕對轉(zhuǎn)移指令,可以計算得到轉(zhuǎn)移目的地址,而SJMP是相對轉(zhuǎn)移指令,只能經(jīng)過轉(zhuǎn)移偏移量來進(jìn)展計算。 選擇無條件轉(zhuǎn)移指令的原那么是根據(jù)跳轉(zhuǎn)的遠(yuǎn)近,盡能夠選擇占用字節(jié)數(shù)少的指令。例如,動態(tài)暫停指令普通都選用SJMP $,而不用LJMP $。 n構(gòu)造特點(diǎn):利用轉(zhuǎn)移指令反復(fù)運(yùn)轉(zhuǎn)需求多次反復(fù)的程序段。構(gòu)造特點(diǎn):利用轉(zhuǎn)移指令反復(fù)運(yùn)轉(zhuǎn)需求多次反復(fù)的程序段。n實(shí)例:前面用到的延時程序:實(shí)例:前面用到的延時程序:(DELAY)n DELAY: MOV R3, #OFFHn DEL2: MOV R4,#0FFHn DEL1: NOPn DJNZ R4,DEL1n DJNZ R3,DEL2n
36、 RET n循環(huán)程序的組成:循環(huán)程序的組成:n 1. 初始化部分初始化部分(設(shè)定循環(huán)次數(shù)等設(shè)定循環(huán)次數(shù)等)。 n 2. 循環(huán)體循環(huán)體(反復(fù)執(zhí)行的部分反復(fù)執(zhí)行的部分,用于完成實(shí)踐操作用于完成實(shí)踐操作)n 3. 循環(huán)控制循環(huán)控制(不斷修正和判別循環(huán)變量不斷修正和判別循環(huán)變量,直至終了直至終了)。n 4. 循環(huán)終了處置。循環(huán)終了處置。4.5 循環(huán)程序設(shè)計延時程序分析與設(shè)計延時分析 DELAY: MOV R3, #OFFH ;1T DEL2: MOV R4,#0FFH ;1T DEL1: NOP ;1T DJNZ R4,DEL1 ;2T DJNZ R3,DEL2 ;2T RET ;2T為什么用延時程序
37、?1晶振;設(shè)晶振;設(shè)6MHZ)2內(nèi)循環(huán)延時;內(nèi)循環(huán)延時;255 X (2+4)=1530 us3外循環(huán)延時外循環(huán)延時2+(1530+2+4) X 255=392 ms 或或 1530X255=390 ms延延時時程程序序設(shè)設(shè)計計源程序:源程序: 指令周期指令周期DELAY: MOV R3, # X H 1個個T機(jī)器機(jī)器 DEL2: MOV R4,# Y H 1個個T機(jī)器機(jī)器 DEL1: NOP 1個個T機(jī)器機(jī)器 NOP 1個個T機(jī)器機(jī)器 DJNZ R4,DEL1 2 個個T機(jī)器機(jī)器 DJNZ R3,DEL2 2個個T機(jī)器機(jī)器 RET指令周期、機(jī)器周期指令周期、機(jī)器周期T機(jī)器與時鐘周期機(jī)器與時鐘
38、周期T時鐘的關(guān)時鐘的關(guān)系:系: T機(jī)器機(jī)器=12T時鐘時鐘=121/fosc=1s 假設(shè)晶振頻率假設(shè)晶振頻率fosc為為12M延時時間的簡化計算結(jié)果:延時時間的簡化計算結(jié)果: (1+1+2) X Y 延時時間怎樣計算?假想象延時假想象延時100ms,只需修正計數(shù)初始值,即,只需修正計數(shù)初始值,即 (1+1+2) 125200s=100ms#200#125延時程序延時程序延延時時程程序序設(shè)設(shè)計計1S1S延時程序延時程序源程序:源程序:DELAY: MOV R2, #10 DEL2: MOV R3, #100DEL1: MOV R4,#1257DH)DEL0: NOP NOP DJNZ R4,DE
39、L0 DJNZ R3,DEL1 DJNZ R2, DEL2 RET1S1S延時程序延時程序 1如何準(zhǔn)確計算參數(shù)?2了解多重循環(huán)延延時時程程序序運(yùn)運(yùn)用用編程實(shí)現(xiàn)編程實(shí)現(xiàn)P1口銜接的口銜接的8個個LED顯示方式如下:從顯示方式如下:從P1.0到到P1.7的順序,依次點(diǎn)亮其銜接的的順序,依次點(diǎn)亮其銜接的LED。 顯示方式字送P1口 顯示方式字左移1位 次數(shù)10依次點(diǎn)亮其銜接的依次點(diǎn)亮其銜接的LED ORG 0000HSTART: MOV R2,#08H ;設(shè)置循環(huán)次數(shù) MOV A,#0FEH ;送顯示方式字NEXT: MOV P1,A ;點(diǎn)亮二極管 ACALL DELAY RL A ;左移一位,改動
40、顯示方式字 DJNZ R2,NEXT ;循環(huán)次數(shù)減1,不為零,繼續(xù)點(diǎn)亮 SJMP START ;下面一個二極管 DELAY: MOV R3,#0FFH ;延時子程序開場DEL2: MOV R4,#0FFHDEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 數(shù)數(shù)據(jù)據(jù)傳傳送送程程序序書書P86P86例例4.4.64.4.6:不同存儲區(qū)域之間的數(shù)據(jù)傳輸:不同存儲區(qū)域之間的數(shù)據(jù)傳輸:將內(nèi)部將內(nèi)部RAM30HRAM30H單元開場的內(nèi)容傳送到外部單元開場的內(nèi)容傳送到外部RAM0100HRAM0100H單單元開場的區(qū)域,直到遇到傳送的內(nèi)容是元開場的區(qū)域,直到遇到傳送的內(nèi)容
41、是0 0為止。為止。 (R0)A A = 0初始化部分循環(huán)體循環(huán)控制循環(huán)終了n ORG0000Hn MOVR0,#30H ;R0指向內(nèi)部RAM數(shù)據(jù)區(qū)首地址n MOVDPTR,#0100H ;DPTR指向外部RAM數(shù)據(jù)區(qū)首地址nTRANS: MOVA,R0 ;A(R0)n MOVXDPTR,A;DPTRAn CJNEA,#00H,NEXTn SJMPFINISH;A=0,傳送完成nNEXT: INCR0;修正地址指針n INCDPTRn AJMPTRANS;繼續(xù)傳送nFINISH: SJMP $n END程序清單程序清單4.6 查表程序n表格是事先存放在ROM中的,普通為一串有序的常數(shù),例如平方
42、表、字型碼表等。n表格可經(jīng)過偽指令DB來確定。n經(jīng)過查表指令 MOVC A,A+DPTRn MOVC A,A+PC來實(shí)現(xiàn)。n n 在在LED顯示和鍵盤處置程序中將會用到。顯示和鍵盤處置程序中將會用到。P98P98例例4.5.1 4.5.1 用查表法計算平方用查表法計算平方( (一一) ) ORG 0000H ORG 0000H MOV MOV DPTR DPTR,#TABLE ;#TABLE ;表首地址送表首地址送DPTRDPTR MOV A MOV A,#05#05; ;被查數(shù)字被查數(shù)字0505A A MOVC A MOVC A,A+DPTRA+DPTR ; ;查表求平方查表求平方 SJMP
43、 $ SJMP $ TABLETABLE:DB 0,1,4,9,16,25,36,49,64,81 DB 0,1,4,9,16,25,36,49,64,81 END END 1為什么修正A?4.7 子程序設(shè)計n在實(shí)踐問題中,經(jīng)常會遇到在一個程序中多次用到一樣的運(yùn)算或操作,假設(shè)每遇到這些運(yùn)算或操作,都從頭編起,將使程序繁瑣、浪費(fèi)內(nèi)存。因此在實(shí)踐中,經(jīng)常把這種多次運(yùn)用的程序段,按一定構(gòu)造編好,存放在存儲器中,當(dāng)需求時,可以調(diào)用這些獨(dú)立的程序段。通常將這種可以被調(diào)用的程序段稱為子程序。主要內(nèi)容:主要內(nèi)容: 1. 主程序與子程序的關(guān)系主程序與子程序的關(guān)系 2. 子程序嵌套子程序嵌套 3. 子程序的調(diào)用
44、與前往子程序的調(diào)用與前往一短調(diào)用指令1,短調(diào)用指令 ACALL addr11 PC+2PCSP+1SP, PC70(SP)SP+1SP, PC158(SP)addr11 PC100 n子程序的調(diào)用包含兩部分內(nèi)容:na, 實(shí)現(xiàn)轉(zhuǎn)入子程序的入口地址;這主要由調(diào)用語句中的addr11或addr16 實(shí)現(xiàn)。nb,子程序完成后,可以自動的前往;這是由調(diào)用語句執(zhí)行時依托堆棧操作曾經(jīng)將前往地址壓棧保管,帶前往時彈出送PC實(shí)現(xiàn)的。 PC高5位(堅持不變) PC低11位A10A9 A8 00 001A7A6A5A4A3A2A1A0操作碼(第一字節(jié))操作數(shù)(第二字節(jié))程序計數(shù)器PC二長調(diào)用指令 2, 長調(diào)用指令
45、LCALL addr16PC+3PCSP+1SP, PC70(SP)SP+1SP, PC158(SP)addr16 PCn子程序的調(diào)用包含兩部分內(nèi)容:na, 實(shí)現(xiàn)轉(zhuǎn)入子程序的入口地址;這主要由調(diào)用語句中的addr11或addr16 實(shí)現(xiàn)。nb,子程序完成后,可以自動的前往;這是由調(diào)用語句執(zhí)行時依托堆棧操作曾經(jīng)將前往地址壓棧保管,帶前往時彈出送PC實(shí)現(xiàn)的。三前往指令n格式:RET 子程序前往 操作碼:22Hn 操作: (SP) PC158 , SP-1SPn (SP) PC 70 , SP-1SPn格式:RETI 中斷子程序前往 操作碼:32Hn 操作: (SP) PC158 , SP-1SPn
46、 (SP) PC 70 , SP-1SPn RETI與RET的區(qū)別在于前往主程序后,RETI還要去除相應(yīng)的中斷優(yōu)先級形狀位,使系統(tǒng)呼應(yīng)低優(yōu)先級的中斷。前往主程序與子程序的關(guān)系 子程序SUB 主程序MAINLCALL SUB 調(diào)用子程序子程序入口地址RET ORG0100H MAIN:MOVA,#0FEH ;送顯示初值;送顯示初值 LP:MOVR0,#10;送閃爍次數(shù);送閃爍次數(shù) LP0:MOVP1,A;點(diǎn)亮;點(diǎn)亮LEDLCALLDELAY;延時;延時MOVP1,#0FFH;熄滅燈;熄滅燈LCALLDELAY;延時;延時DJNZR0,LP0 RLA SJMPLP END實(shí)例:實(shí)例:LED燈的閃爍
47、點(diǎn)亮一燈的閃爍點(diǎn)亮一延時次數(shù)-1=0點(diǎn)亮相應(yīng)的LEDYN熄滅相應(yīng)的LED延時初值左移1位指向下一個LED設(shè)閃爍次數(shù)送顯示初值開場子程序嵌套 子程序嵌套(或稱多重轉(zhuǎn)子)是指在子程序執(zhí)行過程中,還可以調(diào)用另一個子程序。 子程序SUB1 主程序MAINLCALL SUB1 RET 子程序SUB2RETLCALL SUB2 ORG 0100H MAIN: MOV A,#0FEH;送顯示初值 COUN: ACALL FLASH;調(diào)閃爍子程序 RL A;A左移,下一個燈閃爍 SJMP COUN ;循環(huán)不止. FLASH: MOV R0,#10;送閃爍次數(shù)FLASH1: MOV P1,A;點(diǎn)亮LED LCA
48、LL DELAY;延時 MOV P1,#0FFH;熄滅燈 LCALL DELAY;延時 DJNZ R0,FLASH1 ;閃爍次數(shù)不夠10次,繼續(xù) RET. DELAY: MOV R3,#0FFH ;延時子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET ENDLED燈的閃爍點(diǎn)亮二子程序嵌套范例燈的閃爍點(diǎn)亮二子程序嵌套范例圖4.14 子程序兩次調(diào)用、前往過程表示圖主程序LCALLDELAYP1 , #0FFH子程序DELAY:MOV R3 , #0FFHRETLCALLDELAYDJNZMOVR0 , LP0RL A子程序
49、的調(diào)用與前往 問題:子程序調(diào)用、前往到主程序中的正確位置,并接著執(zhí)行主程序中的后續(xù)指令呢? 為理處理這個問題,我們采用了堆棧技術(shù)。 子程序SUB1 主程序MAINRET 子程序SUB2RET20212021211021132100220020 132013 PC21 131321堆棧指針SP堆棧LCALL SUB1LCALL SUB221 1320 13 1. 堆棧概念堆棧概念 堆棧實(shí)踐上是內(nèi)部堆棧實(shí)踐上是內(nèi)部RAM的一部分,堆棧的詳細(xì)的一部分,堆棧的詳細(xì)位置由堆棧指針位置由堆棧指針SP確定。確定。SP是一個是一個8位存放器,用位存放器,用于存放堆棧的棧底初始化地址和棧頂?shù)刂?。于存放堆棧的棧?/p>
50、初始化地址和棧頂?shù)刂贰?單片機(jī)復(fù)位或上電時,單片機(jī)復(fù)位或上電時,SP的初值是的初值是07H,表示,表示堆棧棧底為堆棧棧底為07H, SP中的地址值隨著加中的地址值隨著加1后后,存入數(shù)存入數(shù)據(jù)。據(jù)。SP的值總是指向最后放進(jìn)堆棧的一個數(shù),此時,的值總是指向最后放進(jìn)堆棧的一個數(shù),此時,SP中的地址稱為棧頂?shù)刂?。堆棧?gòu)造表示圖如圖中的地址稱為棧頂?shù)刂?。堆棧?gòu)造表示圖如圖4.22所示。所示。堆棧(參見P105-106)圖4.22 堆棧構(gòu)造表示圖 2. 堆棧操作堆棧操作 堆棧有兩種最根本操作:向堆棧存入數(shù)據(jù)稱為堆棧有兩種最根本操作:向堆棧存入數(shù)據(jù)稱為“入棧入棧或或“壓入堆棧壓入堆棧PUSH;從堆棧取出數(shù)據(jù)
51、稱為;從堆棧取出數(shù)據(jù)稱為“出棧出?;蚧颉皬棾龆褩棾龆褩OP。堆棧中數(shù)據(jù)的存取采用后進(jìn)先。堆棧中數(shù)據(jù)的存取采用后進(jìn)先出方式,即后入棧的數(shù)據(jù),彈出時先彈出,類似貨棧堆放貨出方式,即后入棧的數(shù)據(jù),彈出時先彈出,類似貨棧堆放貨物的存取方式,物的存取方式,“堆棧一詞因此而得名。堆棧一詞因此而得名。 由于單片機(jī)初始化的堆棧區(qū)域同第由于單片機(jī)初始化的堆棧區(qū)域同第1組任務(wù)存放器區(qū)重組任務(wù)存放器區(qū)重合,也就是說,當(dāng)把堆棧棧底設(shè)在合,也就是說,當(dāng)把堆棧棧底設(shè)在07H處時,就不能運(yùn)用第處時,就不能運(yùn)用第1組任務(wù)存放器,假設(shè)堆棧存入數(shù)據(jù)量比較大的話,甚至第組任務(wù)存放器,假設(shè)堆棧存入數(shù)據(jù)量比較大的話,甚至第2組和第
52、組和第3組任務(wù)存放器也不能運(yùn)用了。因此,在匯編言語程組任務(wù)存放器也不能運(yùn)用了。因此,在匯編言語程序設(shè)計中,通??偸前讯褩^(qū)的位置設(shè)在用戶序設(shè)計中,通??偸前讯褩^(qū)的位置設(shè)在用戶RAM區(qū)。例如區(qū)。例如 MOVSP,#60H;將堆棧棧底設(shè)在內(nèi)部RAM的60H處 3. 堆棧的功能 最初,堆棧是為了子程序調(diào)用和前往而設(shè)計的,執(zhí)行調(diào)用指令LCALL、ACALL時,CPU自動把斷點(diǎn)地址壓棧;執(zhí)行前往指令RET時,自動從堆棧中彈出斷點(diǎn)地址。 由于堆棧操作簡單,程序員也經(jīng)常用堆棧暫存中間結(jié)果或數(shù)據(jù)。只是運(yùn)用時需求留意堆棧先進(jìn)后出的特點(diǎn)。恢復(fù)現(xiàn)場的順序就不能弄反,先維護(hù)的DPH后恢復(fù)出來。 另外,在子程序調(diào)用時
53、,CPU會自動利用堆棧進(jìn)展維護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。 4. 堆棧操作與堆棧操作與RAM操作的比較操作的比較 堆棧作為內(nèi)部堆棧作為內(nèi)部RAM的一個特殊區(qū)域,又有其獨(dú)特性,為的一個特殊區(qū)域,又有其獨(dú)特性,為匯編言語程序設(shè)計提供了更多的方便。同內(nèi)部匯編言語程序設(shè)計提供了更多的方便。同內(nèi)部RAM的操作相的操作相比較,運(yùn)用堆棧有以下優(yōu)點(diǎn):比較,運(yùn)用堆棧有以下優(yōu)點(diǎn): (1) 運(yùn)用內(nèi)部運(yùn)用內(nèi)部RAM必需知道單元詳細(xì)地址,而堆棧只需必需知道單元詳細(xì)地址,而堆棧只需設(shè)置好棧底地址,就可放心運(yùn)用,無需再記住單元詳細(xì)地址。設(shè)置好棧底地址,就可放心運(yùn)用,無需再記住單元詳細(xì)地址。 (2) 當(dāng)我們需求重新分配內(nèi)存任務(wù)單元時,程
54、序中運(yùn)用內(nèi)當(dāng)我們需求重新分配內(nèi)存任務(wù)單元時,程序中運(yùn)用內(nèi)部部RAM的地方,都要修正單元地址,而堆棧只需修正棧底地的地方,都要修正單元地址,而堆棧只需修正棧底地址就行了。址就行了。 (3) 堆棧所特有的先進(jìn)后出特點(diǎn),使得數(shù)據(jù)彈出之后,存儲單元自動回收、再次運(yùn)用,充分提高了內(nèi)存的利用率;而內(nèi)部RAM的操作是不能夠?qū)崿F(xiàn)自動回收再利用的,必需經(jīng)過編程員的重新分配,才干再次運(yùn)用。子程序設(shè)計本卷須知 (1)要給每個子程序起一個名字,也就是入口地址的代號。 (2)要能正確地傳送參數(shù)。即首先要有入口條件,闡明進(jìn)入子程序時,它所要處置的數(shù)據(jù)放在何處(如:是放在A中還是放在某個任務(wù)存放器中等)。另外,要有出口條件
55、,即處置的結(jié)果存放在何處。 (3)留意維護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。在子程序運(yùn)用累加器、任務(wù)存放器等資源時,要先將其原來的內(nèi)容保管起來,即維護(hù)現(xiàn)場。當(dāng)子程序執(zhí)行終了,在前往主程序之前,要將這些內(nèi)容再取出,送還到累加器、任務(wù)存放器等原單元中,這一過程稱為恢復(fù)現(xiàn)場。例4.6.2 查表子程序(p92)。留意:1.入口參數(shù)和出口參數(shù)的位置 2.現(xiàn)場的維護(hù)與恢復(fù)。子程序的參數(shù)傳送子程序的參數(shù)傳送 范例:計算平方和范例:計算平方和c=a2+b2 ORG0000H ;主程序;主程序MOVSP,#3FH ;設(shè)置棧底;設(shè)置棧底MOVA,31H ;取數(shù);取數(shù)a存放到累加存放到累加器器A中作為入口參數(shù)中作為入口參數(shù)LCALL
56、 SQR ;計算;計算a2MOVR1,A ;出口參數(shù);出口參數(shù)平方值存平方值存放在放在A中中MOVA,32H ;取數(shù);取數(shù)b存放到累加存放到累加器器A中作為出口參數(shù)中作為出口參數(shù)LCALL SQR ;計算;計算b2ADDA,R1 ;求和;求和MOV33H,A ;存放結(jié)果;存放結(jié)果SJMP$ P103P103例例4.6.24.6.2;子程序:SQR;功能:經(jīng)過查表求出平方值y=x2;入口參數(shù):x存放在累加器A中;出口參數(shù):求得的平方值y存放在A中;占用資源:累加器A,數(shù)據(jù)指針DPTRSQR:PUSH DPH ;維護(hù)現(xiàn)場,將主程序中DPTR的高八位放入堆棧 PUSH DPL ;維護(hù)現(xiàn)場,將主程序中
57、DPTR的低八位放入堆棧 MOV DPTR,#TABLE ;在子程序中重新運(yùn)用DPTR,表首地址DPTR MOVC A, A+DPTR ;查表 POP DPL ;恢復(fù)現(xiàn)場,將主程序中DPTR的低八位從堆棧中彈出 POP DPH ;恢復(fù)現(xiàn)場,將主程序中DPTR的高八位從堆棧中彈出 RETTABLE: DB 0,1,4,9,16,25,36,49,64,81與與P106P106例比較參數(shù)傳送地方法例比較參數(shù)傳送地方法八路彩燈控制程序最后要求:(對應(yīng)的口為1時點(diǎn)亮1D1D8八個彩燈按規(guī)定順序依次點(diǎn)亮間隔1秒,最后全亮;2按規(guī)定順序依次熄滅間隔1秒,最后全滅;3八個燈同時點(diǎn)亮,堅持1秒;4八個燈同時熄
58、滅,堅持0.5秒; 再將第3、4步反復(fù)4遍,最后整個程序再反復(fù)N遍。步驟:1繪制流程圖2編寫程序3調(diào)試程序霓虹紅燈設(shè)計霓虹紅燈設(shè)計 ORG 0000H LJMP MAIN ORG 0100HMAIN:MOV R7,#7LOOP: MOV R6,#16 MOV R5,#4 MOV DPTR,#TABL MOV R4,#0LOOP1:MOV A,R4 MOVC A,A+DPTR MOV P1,A INC R4 LCALL DELAY LCALL DELAY DJNZ R6,LOOP1LOOP2: MOV P1,#0FFH LCALL DELAY LCALL DELAY MOV P1,#00H LCALL DELAY DJNZ R5,LOOP2 DJNZ R7,LOOP SJMP $ END 開場 初始化參數(shù) 查表 延時循環(huán)次數(shù)到否?終了NY 亮滅4次循環(huán)N次到否?NY 霓虹紅燈設(shè)計霓虹紅燈設(shè)計常用匯編子程序P118)TABL: DB 01H, 03H, 07H, 0FH, 1FH, 3
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 3.1溫度說課稿 2025年初中 人教版物理八年級上冊
- 《跨境電商》課件-3.其他平臺注冊
- 《Linux操作系統(tǒng)》課件-10.Linux進(jìn)程管理
- 高質(zhì)量三農(nóng)田水利設(shè)施建設(shè)指南
- 農(nóng)民創(chuàng)業(yè)創(chuàng)新培訓(xùn)作業(yè)指導(dǎo)書
- 沉淀池施工安全措施
- 蛋糕店項(xiàng)目可行性研究報告
- 機(jī)場工程車輛租賃合同范本
- 二零二五年度北京市網(wǎng)吧裝修工程網(wǎng)絡(luò)設(shè)備采購合同
- 加油站安全管理預(yù)案
- 統(tǒng)計法律知識培訓(xùn)課件
- 活動三《垃圾“流浪”記》(教學(xué)設(shè)計)-2023-2024學(xué)年三年級下冊綜合實(shí)踐活動滬科黔科版
- 2025年合伙協(xié)議模板
- 2025年南京鐵道職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案一套
- 對外漢語綜合課教案集成
- 北京市朝陽區(qū)2024-2025學(xué)年高一上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試題【含答案解析】
- 2025年南京科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 信息系統(tǒng)監(jiān)理師教程筆記版
- 龍門吊拆除合同
- 《慢性阻塞性肺病的》課件
- 互聯(lián)網(wǎng)金融 個人網(wǎng)絡(luò)消費(fèi)信貸 貸后催收風(fēng)控指引
評論
0/150
提交評論