第3章指令系統(tǒng)控制程序轉(zhuǎn)移類指令new(下)_第1頁
第3章指令系統(tǒng)控制程序轉(zhuǎn)移類指令new(下)_第2頁
第3章指令系統(tǒng)控制程序轉(zhuǎn)移類指令new(下)_第3頁
第3章指令系統(tǒng)控制程序轉(zhuǎn)移類指令new(下)_第4頁
第3章指令系統(tǒng)控制程序轉(zhuǎn)移類指令new(下)_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.3.4控制程序轉(zhuǎn)移類指令包括以下類型:無條件轉(zhuǎn)移和條件轉(zhuǎn)移相對轉(zhuǎn)移和絕對轉(zhuǎn)移長轉(zhuǎn)移和短轉(zhuǎn)移調(diào)用與返回指令重點、難點:“JMP、CJNE、DJNZ”指令。3.3.4控制程序轉(zhuǎn)移類指令1.無條件轉(zhuǎn)移指令

①短轉(zhuǎn)移類指令:

AJMPaddr11程序轉(zhuǎn)移范圍:2KB的程序存儲器地址空間。

2字節(jié)指令

可用標(biāo)號表示例:AJMPLOOP

…………

…………LOOP:MOVA,R2

…………但是:“LOOP”不是“addr11(11位地址)值”??!指令:”AJMPaddr11“是2字節(jié)指令

。例:1030H:AJMP00100000000B問:轉(zhuǎn)移的地址是多少?解:addr11=00100000000B先(PC)+2=1030H+2=1032H=0001000000110010B

后:(PC15~11)不變,PC10~0=00010

00100000000

B=1100H即執(zhí)行該指令后,將轉(zhuǎn)至地址為:1100H處。3.3.4控制程序轉(zhuǎn)移類指令②長轉(zhuǎn)移指令

LJMPaddr16

;addr16→PC。3字節(jié)指令

指令中:第二字節(jié)裝入PC的高8位,第三字節(jié)裝入PC的低8位。程序轉(zhuǎn)移范圍:64KB的程序存儲器地址空間。例:1023H:LJMP212AH(PCH)=21H,(PCL)=2AH。機器碼為:02212AH??捎脴?biāo)號表示3.3.4控制程序轉(zhuǎn)移類指令③相對轉(zhuǎn)移指令SJMPrel

;先(PC)+2→PC,后(PC)+rel→PC

;2字節(jié)指令

程序轉(zhuǎn)移范圍:256B?!锸止ぞ幊虝r,需計算偏移量rel:rel--機器碼的相對偏移量,為8位補碼。

轉(zhuǎn)移范圍:-128~+127字節(jié)。即:①rel為正數(shù)時,rel的范圍為:0~+127(00H~7FH)。稱為“正向跳轉(zhuǎn)”,即往ROM中地址大的方向跳轉(zhuǎn)。

rel為負數(shù)時,rel的范圍為:-128~-1(80H~FFH)。稱為“反向跳轉(zhuǎn)”,即往ROM中地址小的方向跳轉(zhuǎn)??捎脴?biāo)號表示③相對轉(zhuǎn)移指令“SJMPrel”例如:

0100H:SJMPrel設(shè)轉(zhuǎn)移的地址為0157H,則:rel=0157H-0100H-2=55H。故該指令可寫成:

0100H:SJMP55H其機器碼為:80H55H★正向跳轉(zhuǎn)時:rel=目的地址-源地址-2

=地址差-2。0157H★反向跳轉(zhuǎn)時:rel=[目的地址-源地址-2]補

=[-2]補-|地址差|

=FEH-|地址差|例如:

0100H:SJMPrel設(shè)程序轉(zhuǎn)移的地址為:00F8H,則地址偏移量rel為:rel=FEH-|0100H-00F8H|

=FEH-0008H=F6H。故該指令可寫成:

0100H:SJMPF6H其機器碼為:80HF6H00F8H編程時,可用標(biāo)號代替轉(zhuǎn)移目的地址,rel交給編譯程序計算。例如:SJMPNEXT

NEXT:…原地踏步指令的指令:

HERE:SJMP

HERE常寫成:SJMP$總結(jié)短轉(zhuǎn)移類指令:AJMPaddr11

長轉(zhuǎn)移類指令:LJMPaddr16

相對轉(zhuǎn)移指令:SJMPrel這三條指令,可理解成:PC值改變,即跳轉(zhuǎn)到一個標(biāo)號處。

它們的區(qū)別:跳轉(zhuǎn)的范圍不同(2KB;64KB;-128~+127)。指令構(gòu)成不同。

AJMP、LJMP后跟的是絕對地址,

而SJMP后跟的是相對地址。指令長度不同(2字節(jié);3字節(jié);2字節(jié))。

原則上,所有用SJMP或AJMP的地方都可以用LJMP來替代。均可用標(biāo)號表示3.3.4控制程序轉(zhuǎn)移類指令④間接轉(zhuǎn)移指令(散轉(zhuǎn)指令)JMP@A+DPTR;(A)+(DPTR)→PC。1字節(jié)指令

使用該指令前,應(yīng)先給DPTR賦值,A中的內(nèi)容為無符號數(shù)。轉(zhuǎn)移范圍:256B.?該指令多用于多分支程序結(jié)構(gòu)中。[P72.例3-11]根據(jù)累加器A中命令鍵的鍵值,設(shè)計命令健操作程序入口跳轉(zhuǎn)表。例如:當(dāng)(A)=2時,程序跳轉(zhuǎn)到標(biāo)號為“XX2”的程序中。復(fù)習(xí):程序計數(shù)器PC程序計數(shù)器PC是16位的寄存器。PC變化的軌跡(即其地址的改變)決定程序的流向,PC的寬度(即地址值的位數(shù))決定了程序存儲器可以尋址的范圍。PC的基本工作方式有:1、PC自動加1。這是最基本的工作方式,也就是這個專用寄存器被稱為計數(shù)器的原因;2、執(zhí)行條件或無條件指令(第3章P72-P77,P83)時,PC將被置入新的數(shù)值(地址),程序的流向發(fā)生變化。變化的方式有:1)帶符號的相對轉(zhuǎn)移指令“SJMP”;2)短跳轉(zhuǎn)指令“AJMP”,長跳轉(zhuǎn)指令“LJMP”;3)散轉(zhuǎn)指令“JMP@A+DPTR”;3、在執(zhí)行調(diào)用指令(第3章P79)或響應(yīng)中斷(第5章P113)時:硬件自動將PC的當(dāng)前值,即下一條將要執(zhí)行的指令的地址被送入堆棧,加以保護;同時將子程序的入口地址或者中斷入口矢量地址送給PC,程序流向發(fā)生改變,程序轉(zhuǎn)向去執(zhí)行子程序或者中斷服務(wù)程序。當(dāng)子程序或中斷服務(wù)程序執(zhí)行完畢,遇到子程序中的最后一條返回指令“RET”或中斷服務(wù)程序的最后一條指令“RETI”時,硬件自動將保護在堆棧中的內(nèi)容(地址)送到PC中,程序又返回到原來的地方繼續(xù)執(zhí)行。3.3.4控制程序轉(zhuǎn)移類指令2.空操作

NOP;(PC)+1→PC。1字節(jié)指令

3.條件轉(zhuǎn)移類指令條件轉(zhuǎn)移指令是指在滿足一定條件時進行相對轉(zhuǎn)移,否則程序繼續(xù)執(zhí)行本指令的下一條指令。3.3.4控制程序轉(zhuǎn)移類指令⑴判A內(nèi)容是否為0轉(zhuǎn)移指令①

JZrel

;(PC)+2→PC。若A=0,則轉(zhuǎn)移到(PC)=(PC)+rel;

;否則順序執(zhí)行。

JNZrel

;(PC)+2→PC。若A≠0,則轉(zhuǎn)移到(PC)=(PC)+rel;

;否則順序執(zhí)行。在編寫匯編語言源程序時,rel用“標(biāo)號”來代替。如:

JZLD12354以上兩條指令均為:2字節(jié)指令

均可用標(biāo)號表示⑴判A內(nèi)容是否為0轉(zhuǎn)移指令例:MOVA,R0

JZL1

MOVR1,#00H

AJMP

L2

L1:

MOVR1,#0FFH

L2:

SJMP

L2

問:如果執(zhí)行程序前(R0)=0,執(zhí)行上述程序后,(R1)=?;若執(zhí)行程序前(R0)0,則(R1)=?。解:如果(R0)=0,結(jié)果(R1)=0FFH;而若(R0)0,則結(jié)果是(R1)=00H。

3.3.4控制程序轉(zhuǎn)移類指令⑵比較(不相等)轉(zhuǎn)移指令

CJNE(目的字節(jié)),(源字節(jié)),rel;3字節(jié)指令①

CJNEA,#data,rel②

CJNEA,direct,rel③CJNERn,#data,rel④

CJNE@Ri,#data,rel同樣地,使用時,可以將rel用“標(biāo)號”代替,即:

CJNEA,#data,LOOP

CJNEA,direct,LQ123

CJNERn,#data,D168

CJNE@Ri,#data,RT_101⑵比較(不相等)轉(zhuǎn)移指令①

CJNEA,#data,rel

;先(PC)+3→PC

若(A)>#data,則(PC)+rel→PC,且0→CY;若(A)<#data,則(PC)+rel→PC,且1→CY;若(A)=#data,則順序執(zhí)行,且0→CY。②

CJNEA,direct,rel

;先(PC)+3→PC

若(A)>(direct),則(PC)+rel→PC,且0→CY;若(A)<(direct),則(PC)+rel→PC,且1→CY;若(A)=(direct),則順序執(zhí)行,且0→CY。③

CJNERn,#data,rel

;先(PC)+3→PC

若(Rn)>#data,則(PC)+rel→PC,且0→CY;若(Rn)<#data,則(PC)+rel→PC,且1→CY;若(Rn)=#data,則順序執(zhí)行,且0→CY。⑵比較(不相等)轉(zhuǎn)移指令④

CJNE@Ri,#data,rel

;先(PC)+3→PC

若((Ri))>#data,則(PC)+rel→PC,且0→CY;若((Ri))<#data,則(PC)+rel→PC,且1→CY;若((Ri))=#data,則順序執(zhí)行,且0→CY。不能寫成:CJNEA,Rn,LOOP×⑵比較(不相等)轉(zhuǎn)移指令利用這些指令,可以判斷兩數(shù)是否相等。但有時還想得知兩數(shù)比較之后哪個大,哪個小,本條指令也具有這樣的功能:如果兩數(shù)不相等,則CPU還會用CY(進位位)來反映哪個數(shù)大,哪個數(shù)小。如果前面的數(shù)大,則CY=0,否則CY=1。因此在程序轉(zhuǎn)移后再次利用CY就可判斷出哪個數(shù)大(JC或JNC指令P83),哪個數(shù)小了。⑶循環(huán)轉(zhuǎn)移指令(減1不為0轉(zhuǎn)移指令)①

DJNZRn,rel

;先(PC)+2→PC,(Rn)-1→Rn,

若(Rn)≠0,則(PC)+rel→PC,

若(Rn)=0,則結(jié)束循環(huán),程序往下執(zhí)行。②DJNZdirect,rel

;先(PC)+3→PC,(direct)-1→direct;

若(direct)≠0,則(PC)+rel→PC;

若(direct)=0,則結(jié)束循環(huán),程序往下執(zhí)行。

rel可用“標(biāo)號”代替。不能寫成:DJNZA,LOOP×例:

MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$問:上述程序段的執(zhí)行過程是怎樣的?執(zhí)行過程是:將23H單元中的數(shù)連續(xù)相加,保存至A中,每加一次,23H單元中的數(shù)值減1,直至減到0,共加0AH次。在“上機實驗指導(dǎo)書”的實驗一,也使用了“DJNZ”指令,請同學(xué)仔細閱讀。利用“DJNZ”指令,可進行軟件延時。見教材P94【例4-8】。⑷調(diào)用和返回指令主程序A第1次調(diào)用RET子程序ADM1B返回1第2次調(diào)用返回2CD主程序調(diào)用子程序返回過程示意圖斷點(調(diào)用指令的下一條指令的地址)斷點(調(diào)用指令的下一條指令的地址)調(diào)用指令“ACALL”或“LCALL”(第1次)調(diào)用指令“ACALL”或“LCALL”(第2次)子程序返回指令斷點(地址值)由硬件自動壓入堆棧保存。當(dāng)主程序執(zhí)行到A調(diào)用指令時,硬件自動把B指令的地址(稱為斷點地址)壓入堆棧保存,然后把子程序的地址交給PC,從而去執(zhí)行子程序。當(dāng)執(zhí)行到子程序的“RET”指令后,硬件又自動將堆棧的斷點地址(即B地址值)彈給PC,則CPU又回到主程序去執(zhí)行指令。執(zhí)行子程序的“RET”指令后,硬件自動將堆棧的斷點值彈出給PC。⑷調(diào)用和返回指令①短調(diào)用指令

ACALLaddr11;2字節(jié)指令

操作:先:(PC)+2→PC,(SP)+1→SP后:(PC7~0)→(SP)(SP)+1→SP

(PC15~8)→(SP)

addr10~0→(PC10~0)(PC15~11)不變斷點值壓入堆棧編程時,可用標(biāo)號代替轉(zhuǎn)移目的地址,addr11,addr16交給編譯程序計算。②長調(diào)用指令LCALLaddr16

;3字節(jié)指令

操作:先:(PC)+3→PC,(SP)+1→SP

后:(PC7~0)→(SP)(SP)+1→SP

(PC15~8)→(SP)

addr15~0→(PC)斷點值壓入堆棧目的地址目的地址

進棧:先壓入低8位地址,后壓入高8位地址。⑷調(diào)用和返回指令①子程序返回指令

RET;1字節(jié)指令

操作:先:

((SP))

→PC15~8,彈出斷點的高8位。

后:

(SP)-1→SP

((SP))

→PC7~0

,彈出斷點的低8位。(SP)-1→SP。

出棧:先彈出高8位地址,后彈出低8位地址。②中斷返回指令

RETI;1字節(jié)指令

操作:先:

((SP))

→PC15~8,彈出斷點的高8位。后:

(SP)-1→SP

((SP))

→PC7~0

,彈出斷點的低8位。

(SP)-1→SP。RETI指令除了具有RET指令的功能實現(xiàn)程序返回外,還有對中斷優(yōu)先級狀態(tài)觸發(fā)器的清零。執(zhí)行返回指令(RET/RETI),退出子(或中斷服務(wù))程序,則其返回的地址來自堆棧區(qū)

復(fù)習(xí):程序計數(shù)器PC程序計數(shù)器PC是16位的寄存器。PC變化的軌跡(即其地址的改變)決定程序的流向,PC的寬度(即地址值的位數(shù))決定了程序存儲器可以尋址的范圍。PC的基本工作方式有:1、PC自動加1。這是最基本的工作方式,也就是這個專用寄存器被稱為計數(shù)器的原因;2、執(zhí)行條件或無條件指令(第3章P72-P77,P83)時,PC將被置入新的數(shù)值(地址),程序的流向發(fā)生變化。變化的方式有:1)帶符號的相對轉(zhuǎn)移指令“SJMP”;2)短跳轉(zhuǎn)指令“AJMP”,長跳轉(zhuǎn)指令“LJMP”;3)散轉(zhuǎn)指令“JMP@A+DPTR”;3、在執(zhí)行調(diào)用指令(第3章P79)或響應(yīng)中斷(第5章P113)時:硬件自動將PC的當(dāng)前值,即下一條將要執(zhí)行的指令的地址被送入堆棧,加以保護;同時將子程序的入口地址或者中斷入口矢量地址送給PC,程序流向發(fā)生改變,程序轉(zhuǎn)向去執(zhí)行子程序或者中斷服務(wù)程序。當(dāng)子程序或中斷服務(wù)程序執(zhí)行完畢,遇到子程序中的最后一條返回指令“RET”或中斷服務(wù)程序的最后一條指令“RETI”時,硬件自動將保護在堆棧中的內(nèi)容(地址)送到PC中,程序又返回到原來的地方繼續(xù)執(zhí)行。例3-12設(shè)(SP)=40H,符號地址“SUBRTN”指向ROM的5678H,執(zhí)行指令:0123H:LCALLSUBRTNS執(zhí)行完指令后(PC)+3=0123H+3=0126H。將該PC的內(nèi)容壓入堆棧:向(SP)+1=40H+1=41H中壓入26H,向(SP)+1=41H+1=42H壓入01H,此時(SP)=42H。而地址SUBRTN=5678H送入PC,程序轉(zhuǎn)去執(zhí)行以5678H為首地址的子程序。例:如右圖所示,使LED亮10ms,滅10ms,如此反復(fù)。試編寫程序。軟件延時時間的計算請參閱教材P94請同學(xué)們回去再做“上機實驗指導(dǎo)書”實驗二的實例。在KELL或偉福上執(zhí)行“單步跟蹤”操作,仔細觀察當(dāng)執(zhí)行到“ACALL”和“RET”指令時光標(biāo)是如何變化的!ABCD程序的流向:當(dāng)主程序執(zhí)行到A指令時,硬件自動將B指令的地址壓入堆棧,然后CPU去執(zhí)行標(biāo)號為“DELY_10MS”的子程序,當(dāng)執(zhí)行到RET指令時,硬件將堆棧的斷點地址值交給PC,則CPU回到主程序的B指令,再執(zhí)行C指令。C指令又是一條調(diào)用指令,則CPU把D指令的地址壓入堆棧,去執(zhí)行子程序,執(zhí)行到子程序的RET指令后CPU又回到主程序去執(zhí)行D指令。請思考:如右圖所示。若執(zhí)行下列程序,LED1~LED8如何變化?…………L1:MOVA,#55HMOVP1,AACALLDELAY_50MS;50ms延時

CPLA;A中的內(nèi)容取反后送回A中

MOVP1,AACALLDELAY_50MSAJMPL1DELAY_50MS:…………RET3.3.5位操作(布爾處理)類指令?MCS-51單片機的硬件結(jié)構(gòu)中,有一個位處理器(又稱布爾處理器),它有一套位變量處理的指令集,包括位變量傳送、邏輯運算、控制程序轉(zhuǎn)移等指令。?在進行位處理時,

CY用作“位累加器”。?在MCS-51中,有一部份RAM和一部份SFR是具有位尋址功能的。位操作區(qū):內(nèi)部RAM的20H-2FH這16個字節(jié)單元,即128個位單元(位地址空間位00~7FH);可以位尋址的特殊功能寄存器:89C51中有一些SFR是可以進行位尋址的,這些SFR的特點是其字節(jié)地址均可被8整除,如A累加器,B寄存器、PSW、IP(中斷優(yōu)先級控制寄存器)、IE(中斷允許控制寄存器)、SCON(串行口控制寄存器)、TCON(定時器/計數(shù)器控制寄存器)、P0~P3(I/O端口鎖存器)。位地址表達方式以PSW中位4(RS1)為例。直接(位)地址方式:如D4H;點操作符號方式:如PSW.4,D0H.4;位名稱方式:如RS1;用戶定義名方式:如用偽指令bit

SUB.REGbitRS1定義后,可用SUB.REG代替RS1。1.位傳送指令MOVC,bit ;(bit)→C。2字節(jié)指令

MOVbit,C

;(C)→bit。2字節(jié)指令

例:MOVC,P1.0 ;將P1.0的狀態(tài)送給C。MOVP2.0,C;將C中的狀態(tài)送到P2.0,引腳上去。

2.位修正指令⑴位清0指令①

CLR

C

;使CY=0。1字節(jié)指令

CLRbit

;0→bit。2字節(jié)指令

例:CLRP1.0;即使P1.0變?yōu)?⑵位置1指令

SETBC

;1→CY。1字節(jié)指令

SETBbit

;1→bit。2字節(jié)指令

2.位修正指令(3)位取反指令①

CPLC

;(C)→C,1字節(jié)指令

②CPLbit

;(bit)→bit。2字節(jié)指令

3.位邏輯運算指令⑴位邏輯“與”指令①ANLC,bit

;(C)

(bit)→C。2字節(jié)指令

②ANLC,/bit

;(C)

(bit)→C。2字節(jié)指令

注意:指定的位地址中的值本身并不發(fā)生變化。例:ANLC,/P1.03.位邏輯運算指令⑵位邏輯“或”指令①

ORLC,bit

;(C)

(bit)→C。2字節(jié)指令

ORLC,/bit

;(C)

(bit)→C。2字節(jié)指令

4.位條件轉(zhuǎn)移類指令⑴判Cy轉(zhuǎn)移指令

JCrel

;先(PC)+2→PC;后:若(CY)=1,則轉(zhuǎn)移。否則順序執(zhí)行②

JNCrel

;先(PC)+2→PC;后:若(CY)=0,則轉(zhuǎn)移。否則順序執(zhí)行rel用“標(biāo)號”來代替(PC)+rel→PC(PC)+rel→PC上面兩條指令均為:2字節(jié)指令。4.位條件轉(zhuǎn)移類指令⑵判位變量轉(zhuǎn)移指令

①JBbit,rel

;(PC)+3→PC;若(bit)=1,則(PC)+rel→PC;否則順序執(zhí)行。

JNBbit,rel

;(PC)+3→PC;若(bit)=0,則(PC)+rel→PC;否則順序執(zhí)行。③

JBCbit,rel

;(PC)+3→PC;若(bit)=1,則(PC)+rel→PC,且0→bit;否則順序執(zhí)行。

rel用“標(biāo)號”來代替。上面三條指令均為:3字節(jié)指令。在“上機實驗指導(dǎo)書”的實驗二,也需要用到“JB”或“JNB”指令。查詢I/O口中的按鈕(或開關(guān))是否按下了,這種方法我們稱為“查詢方式”。P92【例4-6】片內(nèi)RAM40H和41H兩個單元中存有兩個無符號數(shù),將這兩個數(shù)數(shù)中的小者存入30H單元中。解:程序如下:

MOVA,40H;40H單元的數(shù)送A

CJNEA,41H,BIG;比較大小,兩個數(shù)不相等轉(zhuǎn)BIGSJMPSTORE;相等,40H單元的數(shù)作為小者BIG:JCSTORE;有借位,則40H單元的數(shù)小MOVA,41H;無借位,則41H單元的數(shù)小STORE:MOV30H,A;小者存入30H單元中靜態(tài)顯示9~0的源程序:

ORG0000HAJMPMAINORG0050HMAIN:MOVDPTR,#TAB;字型表的首地址→DPTRLOOP:MOVR0,#9;R0作為計數(shù)器LOOP1:MOVA,R0MOVCA,@A+DPTR;查字型表,

MOVP2,A;字型送P2口顯示,共陽7LEDLCALLDELAY;調(diào)用延時程序

DECR0CJNER0,#0FFH,LOOP1;比較大小,當(dāng)R0≠0FFH時則轉(zhuǎn)LOOP1,若R0=0FFH則順序執(zhí)行ACALLLOOPDELAY:MOVR1,#40;延時子程序

DL1:MOVR2,#40DL2:MOVR3,#0FFHDJNZR3,$DJNZR2,DL2DJNZR1,DL1RET

TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共陽7LED字型表0,1,2~F

END修改程序,使它顯示0~9“DB”為偽指令。P96數(shù)據(jù)表格表格首地址復(fù)習(xí):【思考題】請編程:1)片內(nèi)RAM40H和4AH兩個單元中存有兩個無符號數(shù),將這兩個數(shù)中的小者存入片外RAM的1000H單元中。2)有兩個無符號數(shù)分別存放在片外RAM的1000H單元和1200H單元,將這兩個數(shù)中的大者存入片內(nèi)RAM的30H單元中。某同學(xué)編寫的程序:解:MOVXR0,2000HMOVXA,2001HCJNEA,@R0,LOOP1MOV60H,ALOOP1:JCLOOP2MOV60H,AAJMPLASTLOOP2:MOV60H,@R0LAST:END例1:片外RAM2000H、2001H單元中分別存有兩個無符號數(shù),請編程將這兩個數(shù)中的大者存入片內(nèi)RAM的60H單元中(若這兩個數(shù)相等,亦存入60H單元中)。例2:兩個8位補碼數(shù)DATA1與DATA2相加。若溢出,則累加器A清0,同時LED亮表示“溢出”;若無溢出,則“和”存放在R7中,同時LED滅表示無“溢出”。硬件電路如圖所示(LED的初始態(tài)為滅)。試編寫程序并在ProteusISIS中進行硬件仿真。PSW有位地址,也可用它的位名稱,即:JBOV,LOOP1完善上例:黃LED亮表示“溢出”,綠LED亮表示“無溢出”。并將計算結(jié)果(16進制)由7段LED數(shù)碼管顯示(請參閱教材P209的內(nèi)容)出來。注意觀察:P1.6和P1.7引腳的“標(biāo)色”是“灰色”,即電平狀態(tài)不確定。所選的七段LED數(shù)碼管是共陽極的,應(yīng)該是高電平才對。這是由于驅(qū)動功率不夠造成的。要解決此問題可各接一三極管。

ORG0000HAJMPMAINORG0050HMAIN:SETBP1.1SETBP1.5MOVA,#DATA1ADDA,#DATA2

MOV20H,A;結(jié)果存入20H單元中

JBOV,L1;有溢出轉(zhuǎn)l1CLRP1.5;無溢出,綠燈亮AJMPL2L1:CLRP1.1;點亮溢出燈

;以下為拆字

MOVR0,#21HMOVA,20HANLA,#0FH;屏蔽高4位,取低4位MOV@R0,A;低4位存入21H單元中

INCR0MOVA,20HSWAPA;高、低4位互換ANLA,#0FHMOV@R0,A;高4位存入22H單元中;以下為查表顯示數(shù)字

MOVDPTR,#TABMOVA,22HMOVCA,@A+DPTRMOVP2,A;顯示十位

SETBP1.6MOVA,21HMOVCA,@A+DPTRMOVP3,A;顯示個位

SETBP1.7L2:SJMP$TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H;共陽7段LED顯示0~F字型編碼表DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFHEND該程序中DATA1和DATA2為具體的16進制數(shù)。如果無溢出,只是綠色LED亮,而不顯示計算結(jié)果。請同學(xué)們想一想,如何修改該程序使其有無溢出都能將計算結(jié)果顯示出來!教材P89例4-2。拆字教材P209-213。例3:如圖所示:P3.2和P3.3上各接有一只按鍵,要求它們分別按下時(P3.2=0或P3.3=0),分別使P1口為0或FFH。試編寫程序。這叫做“查詢方式”例4:如圖所示,開關(guān)K1和K2未按下時,兩只發(fā)光二極管均不亮。當(dāng)按下K1時,使發(fā)光二極管LED1亮,而發(fā)光二極管LED2不亮;當(dāng)按下K2時,LED2亮而LED1不亮。試編寫程序?qū)崿F(xiàn)上述功能。例5:如圖所示,上電時,LED不亮。每當(dāng)開關(guān)K1合上時,LED亮,而當(dāng)開關(guān)K1打開時,則LED熄滅。請編寫其控制程序。分析:1、開關(guān)K1的閉合/斷開狀態(tài)是從P1.0端口輸入信號的(P1.0作為輸入端使用),而輸入的信號只有“高/低電平”兩種狀態(tài)。K1打開,即輸入高電平“1”,K1合上時,即輸入低電平“0”。2、LED接在P1.1上,即P1.1作輸出端口使用。當(dāng)P1.1輸出高電平“1”時,LED不亮;當(dāng)P1.1輸出低電平“0”時,則LED亮。故,可用“判位變量轉(zhuǎn)移指令”

(JBbit,rel)來判斷開關(guān)K1的狀態(tài)。這種方法我們稱為“查詢方式”1、源程序如下(用匯編語言編寫)

ORG0000H;程序起始地址AJMPMAIN;引導(dǎo)程序ORG0050H;程序從ROM0050H單元開始存放MAIN:SETBP1.0;輸入的準備動作,即向P1.0端口寫“1”SETBP1.1;上電時,LED為滅LOOP2:JBP1.0LOOP1;查詢開關(guān)K1的狀態(tài).K1未合上,轉(zhuǎn)LOOP1CLRP1.1;K1合上了,使P1.1輸出低電平,LED亮

AJMPLOOP2;轉(zhuǎn)LOOP2,繼續(xù)查詢LOOP1:SETBP1.1;使P1.1輸出高電平,LED滅AJMPLOOP2;轉(zhuǎn)LOOP2,繼續(xù)查詢

END;結(jié)束匯編2、C語言源程序#include<reg51.h>//頭文件sbit

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論