版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
3.3.4控制程序轉(zhuǎn)移類指令包括以下類型:無條件轉(zhuǎn)移和條件轉(zhuǎn)移相對轉(zhuǎn)移和絕對轉(zhuǎn)移長轉(zhuǎn)移和短轉(zhuǎn)移調(diào)用與返回指令重點(diǎn)、難點(diǎn):“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位地址)值”?。≈噶睿骸盇JMPaddr11“是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。機(jī)器碼為:02212AH??捎脴?biāo)號表示3.3.4控制程序轉(zhuǎn)移類指令③相對轉(zhuǎn)移指令SJMPrel
;先(PC)+2→PC,后(PC)+rel→PC
;2字節(jié)指令
程序轉(zhuǎn)移范圍:256B?!锸止ぞ幊虝r(shí),需計(jì)算偏移量rel:rel--機(jī)器碼的相對偏移量,為8位補(bǔ)碼。
轉(zhuǎn)移范圍:-128~+127字節(jié)。即:①rel為正數(shù)時(shí),rel的范圍為:0~+127(00H~7FH)。稱為“正向跳轉(zhuǎn)”,即往ROM中地址大的方向跳轉(zhuǎn)。
②
rel為負(fù)數(shù)時(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其機(jī)器碼為:80H55H★正向跳轉(zhuǎn)時(shí):rel=目的地址-源地址-2
=地址差-2。0157H★反向跳轉(zhuǎn)時(shí):rel=[目的地址-源地址-2]補(bǔ)
=[-2]補(bǔ)-|地址差|
=FEH-|地址差|例如:
0100H:SJMPrel設(shè)程序轉(zhuǎn)移的地址為:00F8H,則地址偏移量rel為:rel=FEH-|0100H-00F8H|
=FEH-0008H=F6H。故該指令可寫成:
0100H:SJMPF6H其機(jī)器碼為:80HF6H00F8H編程時(shí),可用標(biāo)號代替轉(zhuǎn)移目的地址,rel交給編譯程序計(jì)算。例如: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è)計(jì)命令健操作程序入口跳轉(zhuǎn)表。例如:當(dāng)(A)=2時(shí),程序跳轉(zhuǎn)到標(biāo)號為“XX2”的程序中。復(fù)習(xí):程序計(jì)數(shù)器PC程序計(jì)數(shù)器PC是16位的寄存器。PC變化的軌跡(即其地址的改變)決定程序的流向,PC的寬度(即地址值的位數(shù))決定了程序存儲器可以尋址的范圍。PC的基本工作方式有:1、PC自動加1。這是最基本的工作方式,也就是這個專用寄存器被稱為計(jì)數(shù)器的原因;2、執(zhí)行條件或無條件指令(第3章P72-P77,P83)時(shí),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)時(shí):硬件自動將PC的當(dāng)前值,即下一條將要執(zhí)行的指令的地址被送入堆棧,加以保護(hù);同時(shí)將子程序的入口地址或者中斷入口矢量地址送給PC,程序流向發(fā)生改變,程序轉(zhuǎn)向去執(zhí)行子程序或者中斷服務(wù)程序。當(dāng)子程序或中斷服務(wù)程序執(zhí)行完畢,遇到子程序中的最后一條返回指令“RET”或中斷服務(wù)程序的最后一條指令“RETI”時(shí),硬件自動將保護(hù)在堆棧中的內(nèi)容(地址)送到PC中,程序又返回到原來的地方繼續(xù)執(zhí)行。3.3.4控制程序轉(zhuǎn)移類指令2.空操作
NOP;(PC)+1→PC。1字節(jié)指令
3.條件轉(zhuǎn)移類指令條件轉(zhuǎn)移指令是指在滿足一定條件時(shí)進(jì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í)行。在編寫匯編語言源程序時(shí),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同樣地,使用時(shí),可以將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ù)比較之后哪個大,哪個小,本條指令也具有這樣的功能:如果兩數(shù)不相等,則CPU還會用CY(進(jìn)位位)來反映哪個數(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次。在“上機(jī)實(shí)驗(yàn)指導(dǎo)書”的實(shí)驗(yàn)一,也使用了“DJNZ”指令,請同學(xué)仔細(xì)閱讀。利用“DJNZ”指令,可進(jìn)行軟件延時(shí)。見教材P94【例4-8】。⑷調(diào)用和返回指令主程序A第1次調(diào)用RET子程序ADM1B返回1第2次調(diào)用返回2CD主程序調(diào)用子程序返回過程示意圖斷點(diǎn)(調(diào)用指令的下一條指令的地址)斷點(diǎn)(調(diào)用指令的下一條指令的地址)調(diào)用指令“ACALL”或“LCALL”(第1次)調(diào)用指令“ACALL”或“LCALL”(第2次)子程序返回指令斷點(diǎn)(地址值)由硬件自動壓入堆棧保存。當(dāng)主程序執(zhí)行到A調(diào)用指令時(shí),硬件自動把B指令的地址(稱為斷點(diǎn)地址)壓入堆棧保存,然后把子程序的地址交給PC,從而去執(zhí)行子程序。當(dāng)執(zhí)行到子程序的“RET”指令后,硬件又自動將堆棧的斷點(diǎn)地址(即B地址值)彈給PC,則CPU又回到主程序去執(zhí)行指令。執(zhí)行子程序的“RET”指令后,硬件自動將堆棧的斷點(diǎn)值彈出給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)不變斷點(diǎn)值壓入堆棧編程時(shí),可用標(biāo)號代替轉(zhuǎn)移目的地址,addr11,addr16交給編譯程序計(jì)算。②長調(diào)用指令LCALLaddr16
;3字節(jié)指令
操作:先:(PC)+3→PC,(SP)+1→SP
后:(PC7~0)→(SP)(SP)+1→SP
(PC15~8)→(SP)
addr15~0→(PC)斷點(diǎn)值壓入堆棧目的地址目的地址
進(jìn)棧:先壓入低8位地址,后壓入高8位地址。⑷調(diào)用和返回指令①子程序返回指令
RET;1字節(jié)指令
操作:先:
((SP))
→PC15~8,彈出斷點(diǎn)的高8位。
后:
(SP)-1→SP
((SP))
→PC7~0
,彈出斷點(diǎn)的低8位。(SP)-1→SP。
出棧:先彈出高8位地址,后彈出低8位地址。②中斷返回指令
RETI;1字節(jié)指令
操作:先:
((SP))
→PC15~8,彈出斷點(diǎn)的高8位。后:
(SP)-1→SP
((SP))
→PC7~0
,彈出斷點(diǎn)的低8位。
(SP)-1→SP。RETI指令除了具有RET指令的功能實(shí)現(xiàn)程序返回外,還有對中斷優(yōu)先級狀態(tài)觸發(fā)器的清零。執(zhí)行返回指令(RET/RETI),退出子(或中斷服務(wù))程序,則其返回的地址來自堆棧區(qū)
復(fù)習(xí):程序計(jì)數(shù)器PC程序計(jì)數(shù)器PC是16位的寄存器。PC變化的軌跡(即其地址的改變)決定程序的流向,PC的寬度(即地址值的位數(shù))決定了程序存儲器可以尋址的范圍。PC的基本工作方式有:1、PC自動加1。這是最基本的工作方式,也就是這個專用寄存器被稱為計(jì)數(shù)器的原因;2、執(zhí)行條件或無條件指令(第3章P72-P77,P83)時(shí),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)時(shí):硬件自動將PC的當(dāng)前值,即下一條將要執(zhí)行的指令的地址被送入堆棧,加以保護(hù);同時(shí)將子程序的入口地址或者中斷入口矢量地址送給PC,程序流向發(fā)生改變,程序轉(zhuǎn)向去執(zhí)行子程序或者中斷服務(wù)程序。當(dāng)子程序或中斷服務(wù)程序執(zhí)行完畢,遇到子程序中的最后一條返回指令“RET”或中斷服務(wù)程序的最后一條指令“RETI”時(shí),硬件自動將保護(hù)在堆棧中的內(nèi)容(地址)送到PC中,程序又返回到原來的地方繼續(xù)執(zhí)行。例3-12設(shè)(SP)=40H,符號地址“SUBRTN”指向ROM的5678H,執(zhí)行指令:0123H:LCALLSUBRTNS執(zhí)行完指令后(PC)+3=0123H+3=0126H。將該P(yáng)C的內(nèi)容壓入堆棧:向(SP)+1=40H+1=41H中壓入26H,向(SP)+1=41H+1=42H壓入01H,此時(shí)(SP)=42H。而地址SUBRTN=5678H送入PC,程序轉(zhuǎn)去執(zhí)行以5678H為首地址的子程序。例:如右圖所示,使LED亮10ms,滅10ms,如此反復(fù)。試編寫程序。軟件延時(shí)時(shí)間的計(jì)算請參閱教材P94請同學(xué)們回去再做“上機(jī)實(shí)驗(yàn)指導(dǎo)書”實(shí)驗(yàn)二的實(shí)例。在KELL或偉福上執(zhí)行“單步跟蹤”操作,仔細(xì)觀察當(dāng)執(zhí)行到“ACALL”和“RET”指令時(shí)光標(biāo)是如何變化的!ABCD程序的流向:當(dāng)主程序執(zhí)行到A指令時(shí),硬件自動將B指令的地址壓入堆棧,然后CPU去執(zhí)行標(biāo)號為“DELY_10MS”的子程序,當(dāng)執(zhí)行到RET指令時(shí),硬件將堆棧的斷點(diǎn)地址值交給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延時(shí)
CPLA;A中的內(nèi)容取反后送回A中
MOVP1,AACALLDELAY_50MSAJMPL1DELAY_50MS:…………RET3.3.5位操作(布爾處理)類指令?MCS-51單片機(jī)的硬件結(jié)構(gòu)中,有一個位處理器(又稱布爾處理器),它有一套位變量處理的指令集,包括位變量傳送、邏輯運(yùn)算、控制程序轉(zhuǎn)移等指令。?在進(jìn)行位處理時(shí),
CY用作“位累加器”。?在MCS-51中,有一部份RAM和一部份SFR是具有位尋址功能的。位操作區(qū):內(nèi)部RAM的20H-2FH這16個字節(jié)單元,即128個位單元(位地址空間位00~7FH);可以位尋址的特殊功能寄存器:89C51中有一些SFR是可以進(jìn)行位尋址的,這些SFR的特點(diǎn)是其字節(jié)地址均可被8整除,如A累加器,B寄存器、PSW、IP(中斷優(yōu)先級控制寄存器)、IE(中斷允許控制寄存器)、SCON(串行口控制寄存器)、TCON(定時(shí)器/計(jì)數(shù)器控制寄存器)、P0~P3(I/O端口鎖存器)。位地址表達(dá)方式以PSW中位4(RS1)為例。直接(位)地址方式:如D4H;點(diǎn)操作符號方式:如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.位邏輯運(yùn)算指令⑴位邏輯“與”指令①ANLC,bit
;(C)
∧
(bit)→C。2字節(jié)指令
②ANLC,/bit
;(C)
∧
(bit)→C。2字節(jié)指令
注意:指定的位地址中的值本身并不發(fā)生變化。例:ANLC,/P1.03.位邏輯運(yùn)算指令⑵位邏輯“或”指令①
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é)指令。在“上機(jī)實(shí)驗(yàn)指導(dǎo)書”的實(shí)驗(yàn)二,也需要用到“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作為計(jì)數(shù)器LOOP1:MOVA,R0MOVCA,@A+DPTR;查字型表,
MOVP2,A;字型送P2口顯示,共陽7LEDLCALLDELAY;調(diào)用延時(shí)程序
DECR0CJNER0,#0FFH,LOOP1;比較大小,當(dāng)R0≠0FFH時(shí)則轉(zhuǎn)LOOP1,若R0=0FFH則順序執(zhí)行ACALLLOOPDELAY:MOVR1,#40;延時(shí)子程序
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位補(bǔ)碼數(shù)DATA1與DATA2相加。若溢出,則累加器A清0,同時(shí)LED亮表示“溢出”;若無溢出,則“和”存放在R7中,同時(shí)LED滅表示無“溢出”。硬件電路如圖所示(LED的初始態(tài)為滅)。試編寫程序并在ProteusISIS中進(jìn)行硬件仿真。PSW有位地址,也可用它的位名稱,即:JBOV,LOOP1完善上例:黃LED亮表示“溢出”,綠LED亮表示“無溢出”。并將計(jì)算結(jié)果(16進(jìn)制)由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;點(diǎn)亮溢出燈
;以下為拆字
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進(jìn)制數(shù)。如果無溢出,只是綠色LED亮,而不顯示計(jì)算結(jié)果。請同學(xué)們想一想,如何修改該程序使其有無溢出都能將計(jì)算結(jié)果顯示出來!教材P89例4-2。拆字教材P209-213。例3:如圖所示:P3.2和P3.3上各接有一只按鍵,要求它們分別按下時(shí)(P3.2=0或P3.3=0),分別使P1口為0或FFH。試編寫程序。這叫做“查詢方式”例4:如圖所示,開關(guān)K1和K2未按下時(shí),兩只發(fā)光二極管均不亮。當(dāng)按下K1時(shí),使發(fā)光二極管LED1亮,而發(fā)光二極管LED2不亮;當(dāng)按下K2時(shí),LED2亮而LED1不亮。試編寫程序?qū)崿F(xiàn)上述功能。例5:如圖所示,上電時(shí),LED不亮。每當(dāng)開關(guān)K1合上時(shí),LED亮,而當(dāng)開關(guān)K1打開時(shí),則LED熄滅。請編寫其控制程序。分析:1、開關(guān)K1的閉合/斷開狀態(tài)是從P1.0端口輸入信號的(P1.0作為輸入端使用),而輸入的信號只有“高/低電平”兩種狀態(tài)。K1打開,即輸入高電平“1”,K1合上時(shí),即輸入低電平“0”。2、LED接在P1.1上,即P1.1作輸出端口使用。當(dāng)P1.1輸出高電平“1”時(shí),LED不亮;當(dāng)P1.1輸出低電平“0”時(shí),則LED亮。故,可用“判位變量轉(zhuǎn)移指令”
(JBbit,rel)來判斷開關(guān)K1的狀態(tài)。這種方法我們稱為“查詢方式”1、源程序如下(用匯編語言編寫)
ORG0000H;程序起始地址AJMPMAIN;引導(dǎo)程序ORG0050H;程序從ROM0050H單元開始存放MAIN:SETBP1.0;輸入的準(zhǔn)備動作,即向P1.0端口寫“1”SETBP1.1;上電時(shí),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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛南醫(yī)學(xué)院《視唱與聲樂(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南衛(wèi)生健康職業(yè)學(xué)院《環(huán)境工程經(jīng)濟(jì)管理與倫理》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘肅中醫(yī)藥大學(xué)《蒙臺梭利教學(xué)法》2023-2024學(xué)年第一學(xué)期期末試卷
- 《心臟疾病用藥》課件
- 小學(xué)生作文起步講解課件
- 三年級數(shù)學(xué)上冊第八單元分?jǐn)?shù)的初步認(rèn)識第2課時(shí)幾分之幾教案新人教版
- 2022年C基礎(chǔ)知識速記速練考試題庫(核心500題)
- 小學(xué)生校園安全知識培訓(xùn)制度
- 聆聽培訓(xùn)課件
- 《柱狀晶等等》課件
- IEC60068系列標(biāo)準(zhǔn)清單
- 廣東省廣州市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 廉政法規(guī)知識測試及答案
- 形式與政策學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 期末考試-2024-2025學(xué)年語文四年級上冊統(tǒng)編版
- “數(shù)字城市”公共智慧底座項(xiàng)目解決方案
- 經(jīng)銷商交接三方協(xié)議書范本
- 浙江省寧波市慈溪市2022-2023學(xué)年上學(xué)期八年級科學(xué)期末試卷
- 醫(yī)院藥品質(zhì)量管理
- JGJ 305-2013 建筑施工升降設(shè)備設(shè)施檢驗(yàn)標(biāo)準(zhǔn)
- 橋區(qū)巖土工程勘察報(bào)告
評論
0/150
提交評論