當(dāng)前位置:首頁 > 電源 > 數(shù)字電源
[導(dǎo)讀] 導(dǎo)語:單片機(jī)對于初學(xué)者來說確實(shí)很難理解,不少學(xué)過單片機(jī)的同學(xué)或電子愛好者,甚至在畢業(yè)時仍舊是一無所獲?;诖耍娮影l(fā)燒友網(wǎng)將整合《單片機(jī)學(xué)習(xí)知識點(diǎn)全攻略》,共分為四個系列,以饗讀者,敬請期待!此系列對

 

導(dǎo)語:單片機(jī)對于初學(xué)者來說確實(shí)很難理解,不少學(xué)過單片機(jī)的同學(xué)或電子愛好者,甚至在畢業(yè)時仍舊是一無所獲?;诖?,電子發(fā)燒友網(wǎng)將整合《單片機(jī)學(xué)習(xí)知識點(diǎn)全攻略》,共分為四個系列,以饗讀者,敬請期待!此系列對于業(yè)內(nèi)電子工程師也有收藏和參考價(jià)值。

       本單片機(jī)系列關(guān)鍵知識點(diǎn)一覽:

系列二

  8:單片機(jī)尋址方式與指令系統(tǒng)

  9:單片機(jī)數(shù)據(jù)傳遞類指令

  10:單片機(jī)數(shù)據(jù)傳送類指令

  11:單片機(jī)算術(shù)運(yùn)算指令

  12:單片機(jī)邏輯運(yùn)算類指令

  13:單片機(jī)邏輯與或異或指令祥解

  14:單片機(jī)條件轉(zhuǎn)移指令

8、單片機(jī)尋址方式與指令系統(tǒng)

  通過前面的學(xué)習(xí),我們已經(jīng)了解了單片機(jī)內(nèi)部的結(jié)構(gòu),并且也已經(jīng)知道,要控制單片機(jī),讓它為我們干學(xué),要用指令,我們已學(xué)了幾條指令,但很零散,從現(xiàn)在開始,我們將要系統(tǒng)地學(xué)習(xí)8051單片機(jī)的指令部份。

  一、概述

  1、指令的格式

  我們已知,要讓計(jì)算機(jī)做事,就得給計(jì)算機(jī)以指令,并且我們已知,計(jì)算機(jī)很“笨”,只能懂得數(shù)字,如前面我們寫進(jìn)機(jī)器的75H,90H,00H等等,所以指令的第一種格式就是機(jī)器碼格式,也說是數(shù)字的形式。但這種形式實(shí)在是為難我們?nèi)肆?,太難記了,于是有另一種格式,助記符格式,如MOV P1,#0FFH,這樣就好記了。 這兩種格式之間的關(guān)系呢,我們不難理解,本質(zhì)上它們完全等價(jià),只是形式不一樣而已。

  2、匯編

  我們寫指令使用匯編格式,而計(jì)算機(jī)和單片機(jī)只懂機(jī)器碼格式,所以要將我們寫的匯編格式的指令轉(zhuǎn)換為機(jī)器碼格式,這種轉(zhuǎn)換有兩種辦法:手工匯編和機(jī)器匯編。手工匯編實(shí)際上就是查表,因?yàn)檫@兩種格式純粹是格式不一樣,所以是一一對應(yīng)的,查一張表格就行了。不過手工查表總是嫌麻煩,所以就有了計(jì)算機(jī)軟件,用計(jì)算機(jī)軟件來替代手工查表,這就是機(jī)器匯編。

  二、單片機(jī)的尋址

  讓我們先來復(fù)習(xí)一下我們學(xué)過的一些指令:MOV P1,#0FFH,MOV R7,#0FFH這些指令都是將一些數(shù)據(jù)送到對應(yīng)的位置中去,為什么要送數(shù)據(jù)呢?第一個因?yàn)樗腿氲臄?shù)能讓燈全滅掉,第二個是為了要實(shí)現(xiàn)延時,從這里我們能看出來,在用單片機(jī)的編程語言編程時,經(jīng)常要用到數(shù)據(jù)的傳遞,事實(shí)上數(shù)據(jù)傳遞是單片機(jī)編程時的一項(xiàng)重要工作,一共有28條指令(單片機(jī)共111條指令)。下面我們就從數(shù)據(jù)傳遞類指令開始吧。

  分析一下MOV P1,#0FFH這條指令,我們不難得出結(jié)論,第一個詞MOV是命令動詞,也就是決定做什么事情的,MOV是MOVE少寫了一個E,所以就是“傳遞”,這就是指令,規(guī)定做什么事情,后面還有一些參數(shù),分析一下,數(shù)據(jù)傳遞必須要有一個“源”也就是你要送什么數(shù),必須要有一個“目的”,也就是你這個數(shù)要送到什么地方去,顯然在上面那條單片機(jī)指令中,要送的數(shù)(源)就是0FFH,而要送達(dá)的地方(目的地)就是P1這個寄存器。在數(shù)據(jù)傳遞類指令中,均將目的地寫在指令的后面,而將源寫在最后。

  這條指令中,送給P1是這個數(shù)本身,換言之,做完這條指令后,我們能明確地知道,P1中的值是0FFH,但是并不是任何時候都能直接給出數(shù)本身的。例如,在我們前面給出的單片機(jī)延時程序例是這樣寫的:

  MAIN: SETB P1.0    ??;(1)

  LCALL DELAY ;(2)

  CLR P1.0      ;(3)

  LCALL DELAY  ??;(4)

  AJMP MAIN    ;(5)

 ?。灰韵伦映绦?/p>

  DELAY: MOV R7,#250   ;(6)

  D1: MOV R6,#250  ?。唬ǎ罚?/p>

  D2: DJNZ R6,D2   ?。唬ǎ福?/p>

  DJNZ R7,D1   ;(9)

  RET        ;(10)

  END        ;(11)

  表1

  -----------------------------------------------------

  MAIN: SETB P1.0    ?。唬ǎ保?/p>

  MOV 30H,#255

  LCALL DELAY ;

  CLR P1.0      ;(3)

  MOV 30H,#200

  LCALL DELAY  ?。唬ǎ矗?/p>

  AJMP MAIN   ?。唬ǎ担?/p>

 ?。灰韵伦映绦?/p>

  DELAY: MOV R7,30H  ??;(6)

  D1: MOV R6,#250   ;(7)

  D2: DJNZ R6,D2   ??;(8)

  DJNZ R7,D1   ;(9)

  RET        ;(10)

  END       ??;(11)

  這樣一來,我每次調(diào)用延時程序延時的時間都是相同的(大致都是0.13S),如果我提出這樣的要求:燈亮后延時時間為0.13S燈滅,燈滅后延時0.1秒燈亮,如此循環(huán),這樣的程序還能滿足要求嗎?不能,怎么辦?我們能把延時程序改成這樣(見表2):調(diào)用則見表2中的主程,也就是先把一個數(shù)送入30H,在子程序中R7中的值并不固定,而是根據(jù)30H單元中傳過來的數(shù)確定。這樣就能滿足要求。

  從這里我們能得出結(jié)論,在數(shù)據(jù)傳遞中要找到被傳遞的數(shù),很多時候,這個數(shù)并不能直接給出,需要變化,這就引出了一個概念:如何尋找操作數(shù),我們把尋找操作數(shù)所在單元的地址稱之為尋址。在這里我們直接使用數(shù)所在單元的地址找到了操作數(shù),所以稱這種辦法為直接尋址。除了這種辦法之外,還有一種,如果我們把數(shù)放在工作寄存器中,從工作寄存器中尋找數(shù)據(jù),則稱之為寄存器尋址。例:MOV A,R0就是將R0工作寄存器中的數(shù)據(jù)送到累加器A中去。提一個問題:我們知道,工作寄存器就是內(nèi)存單元的一部份,如果我們選擇工作寄存器組0,則R0就是RAM的00H單元,那么這樣一來,MOV A,00H,和MOV A,R0不就沒什么區(qū)別了嗎?為什么要加以區(qū)別呢?的確,這兩條指令執(zhí)行的結(jié)果是完全相同的,都是將00H單元中的內(nèi)容送到A中去,但是執(zhí)行的過程不一樣,執(zhí)行第一條指令需要2個周期,而第二條則只需要1個周期,第一條指令變成最終的目標(biāo)碼要兩個字節(jié)(E5H 00H),而第二條則只要一個字節(jié)(E8h)就能了。

  這么斤斤計(jì)較!不就差了一個周期嗎,如果是12M的晶體震蕩器的話,也就1個微秒時間了,一個字節(jié)又能有多少?

  不對,如果這條指令只執(zhí)行一次,也許無所謂,但一條指令如果執(zhí)行上1000次,就是1毫秒,如果要執(zhí)行1000000萬次,就是1S的誤差,這就很可觀了,單片機(jī)做的是實(shí)時控制的事,所以必須如此“斤斤計(jì)較”。字節(jié)數(shù)同樣如此。

  再來提一個問題,現(xiàn)在我們已知,尋找操作數(shù)能通過直接給的方式(立即尋址)和直接給出數(shù)所在單元地址的方式(直接尋址),這就夠了嗎?

  看這個問題,要求從30H單元開始,取20個數(shù),分別送入A累加器。

  就我們目前掌握的辦法而言,要從30H單元取數(shù),就用MOV A,30H,那么下一個數(shù)呢?是31H單元的,怎么取呢?還是只能用MOV A,31H,那么20個數(shù),不是得20條指令才能寫完嗎?這里只有20個數(shù),如果要送200個或2000個數(shù),那豈不要寫上200條或2000條命令?這未免太笨了吧。為什么會出現(xiàn)這樣的狀況?是因?yàn)槲覀冎粫训刂穼懺谥噶钪校跃蜎]辦法了,如果我們不是把地址直接寫在指令中,而是把地址放在另外一個寄存器單元中,根據(jù)這個寄存器單元中的數(shù)值決定該到哪個單元中取數(shù)據(jù),比如,當(dāng)前這個寄存器中的值是30H,那么就到30H單元中去取,如果是31H就到31H單元中去取,就能解決這個問題了。怎么個解決法呢?既然是看的寄存器中的值,那么我們就能通過一定的辦法讓這里面的值發(fā)生變化,比如取完一個數(shù)后,將這個寄存器單元中的值加1,還是執(zhí)行同一條指令,可是取數(shù)的對象卻不一樣了,不是嗎。通過例程來說明吧。

  MOV R7,#20

  MOV R0,#30H

  LOOP:MOV A,@R0

  INC R0

  DJNZ R7,LOOP

  這個例程中大部份指令我們是能看懂的,第一句,是將立即數(shù)20送到R7中,執(zhí)行完后R7中的值應(yīng)當(dāng)是20。第二句是將立即數(shù)30H送入R0工作寄存器中,所以執(zhí)行完后,R0單元中的值是30H,第三句,這是看一下R0單元中是什么值,把這個值作為地址,取這個地址單元的內(nèi)容送入A中,此時,執(zhí)行這條指令的結(jié)果就相當(dāng)于MOV A,30H。第四句,沒學(xué)過,就是把R0中的值加1,因此執(zhí)行完后,R0中的值就是31H,第五句,學(xué)過,將R7中的值減1,看是否等于0,不等于0,則轉(zhuǎn)到標(biāo)號LOOP處繼續(xù)執(zhí)行,因此,執(zhí)行完這句后,將轉(zhuǎn)去執(zhí)行MOV A,@R0這句話,此時相當(dāng)于執(zhí)行了MOV A,31H(因?yàn)榇藭r的R0中的值已是31H了),如此,直到R7中的值逐次相減等于0,也就是循環(huán)20次為止,就實(shí)現(xiàn)了我們的要求:從30H單元開始將20個數(shù)據(jù)送入A中。

  這也是一種尋找數(shù)據(jù)的辦法,由于數(shù)據(jù)是間接地被找到的,所以就稱之為間址尋址。注意,在間址尋址中,只能用R0或R1存放等尋找的數(shù)據(jù)。

9、單片機(jī)數(shù)據(jù)傳遞類指令

  單片機(jī)數(shù)據(jù)傳遞類指令

 ?。?)以直接地址為目的操作數(shù)的指令

  MOV direct,A 例: MOV 20H,A

  MOV direct,Rn MOV 20H,R1

  MOV direct1,direct2 MOV 20H,30H

  MOV direct,@Ri MOV 20H,@R1

  MOV direct,#data MOV 20H,#34H

 ?。?)以間接地址為目的操作數(shù)的指令

  MOV @Ri,A 例:MOV @R0,A

  MOV @Ri,direct MOV @R1,20H

  MOV @Ri,#data MOV @R0,#34H

 ?。?)十六位數(shù)的傳遞指令

  MOV DPTR,#data16

  8051是一種8位機(jī),這是唯一的一條16位立即數(shù)傳遞指令,其功能是將一個16位的立即數(shù)送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H,則執(zhí)行完了之后DPH中的值為12H,DPL中的值為34H。反之,如果我們分別向DPH,DPL送數(shù),則結(jié)果也一樣。如有下面兩條指令:MOV DPH,#35H,MOV DPL,#12H。則就相當(dāng)于執(zhí)行了MOV DPTR,#3512H。

  數(shù)據(jù)傳遞類指令綜合練習(xí):

  給出每條指令執(zhí)行后的結(jié)果

  上機(jī)練習(xí):

  說明:用括號括起來代表內(nèi)容,如(23H)則代表內(nèi)部RAM23H單元中的值,(A)則代表累加器A單元中的值。

  進(jìn)入DOS狀態(tài),進(jìn)入WAVE所在的目錄,例D:WAVE

  鍵入MCS51,出現(xiàn)如下畫面

  

《單片機(jī)數(shù)據(jù)傳遞指令》圖1

  按File-》Open,出現(xiàn)對話框后,在Name處輸入一個文件名(見圖2),如果是下面列表中已存在的,則打開這個文件,如果不存在這個文件,則新建一個文件(見圖3)

  

圖2

  在空白處將上面的程序輸入。見圖4。用ALT+A匯編通過。用F8即可單步執(zhí)行,在執(zhí)行過程中注意觀察屏幕左邊的工作寄存器及A累加器中的值的變化。[!--empirenews.page--]

  

圖4

  內(nèi)存中值的變化在此是看不到的,可以用如下方法觀察(看圖5):將鼠標(biāo)移到DATA,雙擊,則光標(biāo)進(jìn)入此行,此時可以鍵盤上的上下光標(biāo)鍵上下翻動來觀察內(nèi)存值的變化。本行的最前面DATA后面的數(shù)據(jù)代表的是“一段”的開始地址,如現(xiàn)在為20H,再看屏幕的最上方,數(shù)字從0到F,顯示兩者相加就等于真正的地址值,如現(xiàn)在圖上所示的內(nèi)存20H、21H、22H、23H中的值分別是FBH 、0EH、E8H、30H。

  

圖5

  6、當(dāng)運(yùn)行完程序后,即進(jìn)入它的反匯編區(qū),不是我們想要的東西。為了再從頭開始,可以用CTRL+F2功能鍵復(fù)位PC值。注意此時不會看到原來的窗口,為看到原來的窗口,請用ALT+4或ALT+5等來切換。當(dāng)然以上操作也可以菜單進(jìn)行。CTRL+F2是程序復(fù)位,用RUN菜單。窗口用WINDOWS菜單。

  此次大家就用用熟這個軟件吧,說實(shí)話,我并不很喜歡它,操作起來不方便,但給我的機(jī)器只能上這個,沒辦法,下次再給網(wǎng)友單獨(dú)介紹一個好一點(diǎn)的吧?,F(xiàn)在最好的是keil 。

10、單片機(jī)數(shù)據(jù)傳送類指令

  單片機(jī)的累加器A與片外RAM之間的數(shù)據(jù)傳遞類指令

  MOVX A,@Ri

  MOVX @Ri,A

  MOVX A,@DPTR

  MOVX @DPTR,A

  說明:

  1)在51系列單片機(jī)中,與外部存儲器RAM打交道的只能是A累加器。所有需要傳送入外部RAM的數(shù)據(jù)必需要通過A送去,而所有要讀入的外部RAM中的數(shù)據(jù)也必需通過A讀入。在此我們能看出內(nèi)外部RAM的區(qū)別了,內(nèi)部RAM間能直接進(jìn)行數(shù)據(jù)的傳遞,而外部則不行,比如,要將外部RAM中某一單元(設(shè)為0100H單元的數(shù)據(jù))送入另一個單元(設(shè)為0200H單元),也必須先將0100H單元中的內(nèi)容讀入A,然后再傳送到0200H單元中去。

  要讀或?qū)懲獠康腞AM,當(dāng)然也必須要知道RAM的地址,在后兩條單片機(jī)指令中,地址是被直接放在DPTR中的。而前兩條指令,由于Ri(即R0或R1)只是一個8位的寄存器,所以只供給低8位地址。因?yàn)橛袝r擴(kuò)展的外部RAM的數(shù)量比較少,少于或等于256個,就只需要供給8位地址就夠了。

  使用時應(yīng)當(dāng)首先將要讀或?qū)懙牡刂匪腿隓PTR或Ri中,然后再用讀寫命令。

  例:將單片機(jī)外部RAM中100H單元中的內(nèi)容送入外部RAM中200H單元中。

  MOV DPTR,#0100H

  MOVX A,@DPTR

  MOV DPTR,#0200H

  MOVX @DPTR,A

  程序存儲器向累加器A傳送指令

  MOVC A,@A+DPTR 本指令是將ROM中的數(shù)送入A中。本指令也被稱為單片機(jī)查表指令,常用此指令來查一個已做好在ROM中的表格 說明:

  此條指令引出一個新的尋址辦法:變址尋址。本指令是要在ROM的一個地址單元中找出數(shù)據(jù),顯然必須知道這個單元的地址,這個單元的地址是這樣確定的:在執(zhí)行本指令立腳點(diǎn)DPTR中有一個數(shù),A中有一個數(shù),執(zhí)行指令時,將A和DPTR中的數(shù)加起為,就成為要查找的單元的地址。

  查找到的結(jié)果被放在A中,因此,本條指令執(zhí)行前后,A中的值不一定相同。

  例:有一個數(shù)在R0中,要求用查表的辦法確定它的平方值(此數(shù)的取值范圍是0-5)

  MOV DPTR,#TABLE

  MOV A,R0

  MOVC A,@A+DPTR

  TABLE: DB 0,1,4,9,16,25

  設(shè)R0中的值為2,送入A中,而DPTR中的值則為TABLE,則最終確定的ROM單元的地址就是TABLE+2,也就是到這個單元中去取數(shù),取到的是4,顯然它正是2的平方。其它數(shù)據(jù)也能類推。

  標(biāo)號的真實(shí)含義:從這個地方也能看到另一個問題,我們使用了標(biāo)號來替代具體的單元地址。事實(shí)上,標(biāo)號的真實(shí)含義就是地址數(shù)值。在這里它代表了,0,1,4,9,16,25這幾個數(shù)據(jù)在ROM中存放的起點(diǎn)位置。而在以前我們學(xué)過的如LCALL DELAY單片機(jī)指令中,DELAY 則代表了以DELAY為標(biāo)號的那段程序在ROM中存放的起始地址。事實(shí)上,CPU正是通過這個地址才找到這段程序的。

  能通過以下的例程再來看一看標(biāo)號的含義:

  MOV DPTR,#100H

  MOV A,R0

  MOVC A,@A+DPTR

  ORG 0100H.

  DB 0,1,4,9,16,25

  如果R0中的值為2,則最終地址為100H+2為102H,到102H單元中找到的是4。這個能看懂了吧?

  那為什么不這樣寫程序,要用標(biāo)號呢?不是增加疑惑嗎?

  如果這樣寫程序的話,在寫程序時,我們就必須確定這張表格在ROM中的具體的位置,如果寫完程序后,又想在這段程序前插入一段程序,那么這張表格的位置就又要變了,要改ORG 100H這句話了,我們是經(jīng)常需要修改程序的,那多麻煩,所以就用標(biāo)號來替代,只要一編譯程序,位置就自動發(fā)生變化,我們把這個麻煩事交給計(jì)算機(jī)��指我們用的電腦去做了。

  堆棧操作

  PUSH direct

  POP direct

  第一條指令稱之為推入,就是將direct中的內(nèi)容送入堆棧中,第二條指令稱之為彈出,就是將堆棧中的內(nèi)容送回到direct中。推入指令的執(zhí)行過程是,首先將SP中的值加1,然后把SP中的值當(dāng)作地址,將direct中的值送進(jìn)以SP中的值為地址的RAM單元中。例:

  MOV SP,#5FH

  MOV A,#100

  MOV B,#20

  PUSH ACC

  PUSH B

  則執(zhí)行第一條PUSH ACC指令是這樣的:將SP中的值加1,即變?yōu)?0H,然后將A中的值送到60H單元中,因此執(zhí)行完本條指令后, 內(nèi)存60H單元的值就是100,同樣,執(zhí)行PUSH B時,是將SP+1,即變?yōu)?1H,然后將B中的值送入到61H單元中,即執(zhí)行完本條指令后,61H單元中的值變?yōu)?0。

  POP指令的在單片機(jī)中執(zhí)行是這樣的,首先將SP中的值作為地址,并將此地址中的數(shù)送到POP指令后面的那個direct中,然后SP減1。

  接上例:

  POP B

  POP ACC

  則執(zhí)行過程是:將SP中的值(現(xiàn)在是61H)作為地址,取61H單元中的數(shù)值(現(xiàn)在是20),送到B中,所以執(zhí)行完本條指令后B中的值是20,然后將SP減1,因此本條指令執(zhí)行完后,SP的值變?yōu)?0H,然后執(zhí)行POP ACC,將SP中的值(60H)作為地址,從該地址中取數(shù)(現(xiàn)在是100),并送到ACC中,所以執(zhí)行完本條指令后,ACC中的值是100。

  這有什么意義呢?ACC中的值本來就是100,B中的值本來就是20,是的,在本例中,的確沒有意義,但在實(shí)際工作中,則在PUSH B后一般要執(zhí)行其他指令,而且這些指令會把A中的值,B中的值改掉,所以在程序的結(jié)束,如果我們要把A和B中的值恢復(fù)原值,那么這些指令就有意義了。

  還有一個問題,如果我不用堆棧,比如說在PUSH ACC指令處用MOV 60H,A,在PUSH B處用指令MOV 61H,B,然后用MOV A,60H,MOV B,61H來替代兩條POP指令,不是也一樣嗎?是的,從結(jié)果上看是一樣的,但是從過程看是不一樣的,PUSH和POP指令都是單字節(jié),單周期指令,而MOV指令則是雙字節(jié),雙周期指令。更何況,堆棧的作用不止于此,所以一般的計(jì)算機(jī)上都設(shè)有堆棧,單片機(jī)也是一樣,而我們在編寫子程序,需要保存數(shù)據(jù)時,常常也不采用后面的辦法,而是用堆棧的辦法來實(shí)現(xiàn)。

  例:寫出以下單片機(jī)程序的運(yùn)行結(jié)果

  MOV 30H,#12

  MOV 31H,#23

  PUSH 30H

  PUSH 31H

  POP 30H

  POP 31H

  結(jié)果是30H中的值變?yōu)?3,而31H中的值則變?yōu)?2。也就兩者進(jìn)行了數(shù)據(jù)交換。從這個例程能看出:使用堆棧時,入棧的書寫次序和出棧的書寫次序必須相反,才能保證數(shù)據(jù)被送回原位,不然就要出錯了。

  作業(yè):在MCS51下執(zhí)行上面的例程,注意觀察內(nèi)存窗口和堆棧窗口的變化。

11、單片機(jī)算術(shù)運(yùn)算指令

  不帶進(jìn)位位的單片機(jī)加法指令

  ADD A,#DATA ;例:ADD A,#10H

  ADD A,direct ;例:ADD A,10H

  ADD A,Rn ;例:ADD A,R7

  ADD A,@Ri ;例:ADD A,@R0

  用途:將A中的值與其后面的值相加,最終結(jié)果否是回到A中。

  例:MOV A,#30H

  ADD A,#10H

  則執(zhí)行完本條指令后,A中的值為40H。

  下面的題目自行練習(xí)

  MOV 34H,#10H

  MOV R0,#13H

  MOV A,34H

  ADD A,R0

  MOV R1,#34H

  ADD A,@R1

  帶進(jìn)位位的加法指令

  ADDC A,Rn

  ADDC A,direct

  ADDC A,@Ri

  ADDC A,#data

  用途:將A中的值和其后面的值相加,并且加上進(jìn)位位C中的值。[!--empirenews.page--]

  說明:由于51單片機(jī)是一種8位機(jī),所以只能做8位的數(shù)學(xué)運(yùn)算,但8位運(yùn)算的范圍只有0-255,這在實(shí)際工作中是不夠的,因此就要進(jìn)行擴(kuò)展,一般是將2個8位的數(shù)學(xué)運(yùn)算合起來,成為一個16位的運(yùn)算,這樣,能表達(dá)的數(shù)的范圍就能達(dá)到0-65535。如何合并呢?其實(shí)很簡單,讓我們看一個10進(jìn)制數(shù)的例程:

  66+78。

  這兩個數(shù)相加,我們根本不在意這的過程,但事實(shí)上我們是這樣做的:先做6+8(低位),然后再做6+7,這是高位。做了兩次加法,只是我們做的時候并沒有刻意分成兩次加法來做罷了,或者說我們并沒有意識到我們做了兩次加法。之所以要分成兩次來做,是因?yàn)檫@兩個數(shù)超過了一位數(shù)所能表達(dá)的范置(0-9)。

  在做低位時產(chǎn)生了進(jìn)位,我們做的時候是在適當(dāng)?shù)奈恢命c(diǎn)一下,然后在做高位加法是將這一點(diǎn)加進(jìn)去。那么計(jì)算機(jī)中做16位加法時同樣如此,先做低8位的,如果兩數(shù)相加產(chǎn)生了進(jìn)位,也要“點(diǎn)一下”做個標(biāo)記,這個標(biāo)記就是進(jìn)位位C,在PSW中。在進(jìn)行高位加法是將這個C加進(jìn)去。例:1067H+10A0H,先做67H+A0H=107H,而107H顯然超過了0FFH,因此最終保存在A中的是7,而1則到了PSW中的CY位了,換言之,CY就相當(dāng)于是100H。然后再做10H+10H+CY,結(jié)果是21H,所以最終的結(jié)果是2107H。

  帶借位的單片機(jī)減法指令

  SUBB A,Rn

  SUBB A,direct

  SUBB A,@Ri

  SUBB A,#data

  設(shè)(每個H,(R2)=55H,CY=1,執(zhí)行指令SUBB A,R2之后,A中的值為73H。

  說明:沒有不帶借位的單片機(jī)減法指令,如果需要做不帶位的減法指令(在做第一次相減時),只要將CY清零即可。

  乘法指令

  MUL AB

  此單片機(jī)指令的功能是將A和B中的兩個8位無符號數(shù)相乘,兩數(shù)相乘結(jié)果一般比較大,因此最終結(jié)果用1個16位數(shù)來表達(dá),其中高8位放在B中,低8位放在A中。在乘積大于FFFFFH(65535)時,0V置1(溢出),不然OV為0,而CY總是0。

  例:(A)=4EH,(B)=5DH,執(zhí)行指令

  MUL AB后,乘積是1C56H,所以在B中放的是1CH,而A中放的則是56H。

  除法指令

  DIV AB

  此單片機(jī)指令的功能是將A中的8位無符號數(shù)除了B中的8位無符號數(shù)(A/B)。除法一般會出現(xiàn)小數(shù),但計(jì)算機(jī)中可沒法直接表達(dá)小數(shù),它用的是我們小學(xué)生還沒接觸到小數(shù)時用的商和余數(shù)的概念,如13/5,其商是2,余數(shù)是3。除了以后,商放在A中,余數(shù)放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除數(shù)為0,那么0V=1。

  加1指令

  INC A

  INC Rn

  INC direct

  INC @Ri

  INC DPTR

  用途很簡單,就是將后面目標(biāo)中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H)=22H,DPTR=1234H。執(zhí)行下面的指令:

  INC A (A)=13H

  INC R2 (R0)=34H

  INC 21H (21H)=33H

  INC @R0 (34H)=23H

  INC DPTR ( DPTR)=1235H

  后結(jié)果如上所示。

  說明:從結(jié)果上看INC A和ADD A,#1差不多,但I(xiàn)NC A是單字節(jié),單周期指令,而ADD #1則是雙字節(jié),雙周期指令,而且INC A不會影響PSW位,如(A)=0FFH,INC A后(A)=00H,而CY依然保持不變。如果是ADD A ,#1,則(A)=00H,而CY一定是1。因此加1指令并不適合做加法,事實(shí)上它主要是用來做計(jì)數(shù)、地址增加等用途。另外,加法類指令都是以A為核心的��其中一個數(shù)必須放在A中,而運(yùn)算結(jié)果也必須放在A中,而加1類指令的對象則廣泛得多,能是寄存器、內(nèi)存地址、間址尋址的地址等等。

  減1指令

  減1指令

  DEC A

  DEC RN

  DEC direct

  DEC @Ri

  與加1指令類似,就不多說了。

  綜合練習(xí):

  MOV A,#12H

  MOV R0,#24H

  MOV 21H,#56H

  ADD A,#12H

  MOV DPTR,#4316H

  ADD A,DPH

  ADD A,R0

  CLR C

  SUBB A,DPL

  SUBB A,#25H

  INC A

  SETB C

  ADDC A,21H

  INC R0

  SUBB A,R0

  MOV 24H,#16H

  CLR C

  ADD A,@R0

  先寫出每步運(yùn)行結(jié)果,然后將以上題目建入,并在軟件仿真中運(yùn)行,觀察寄存器及有關(guān)單元的內(nèi)容的變化,是否與自已的預(yù)想結(jié)果相同。

12、單片機(jī)邏輯運(yùn)算類指令

  對單片機(jī)的累加器A的邏輯操作:

  CLR A ;將A中的值清0,單周期單字節(jié)指令,與MOV A,#00H效果相同。

  CPL A ;將A中的值按位取反

  RL A ;將A中的值邏輯左移

  RLC A ;將A中的值加上進(jìn)位位進(jìn)行邏輯左移

  RR A ;將A中的值進(jìn)行邏輯右移

  RRC A ;將A中的值加上進(jìn)位位進(jìn)行邏輯右移

  SWAP A ;將A中的值高、低4位交換。

  例:(A)=73H,則執(zhí)行CPL A,這樣進(jìn)行:

  73H化為二進(jìn)制為01110011,

  逐位取反即為 10001100,也就是8CH。

  RL A是將(A)中的值的第7位送到第0位,第0位送1位,依次類推。

  例:A中的值為68H,執(zhí)行RL A。68H化為二進(jìn)制為01101000,按上圖進(jìn)行移動。01101000化為11010000,即D0H。

  RLC A,是將(A)中的值帶上進(jìn)位位(C)進(jìn)行移位。

  例:A中的值為68H,C中的值為1,則執(zhí)行RLC A

  1 01101000后,結(jié)果是0 11010001,也就是C進(jìn)位位的值變成了0,而(A)則變成了D1H。

  RR A和RRC A就不多談了,請大家參考上面兩個例程自行練習(xí)吧。

  SWAP A,是將A中的值的高、低4位進(jìn)行交換。

  例:(A)=39H,則執(zhí)行SWAP A之后,A中的值就是93H。怎么正好是這么前后交換呢?因?yàn)檫@是一個16進(jìn)制數(shù),每1個16進(jìn)位數(shù)字代表4個二進(jìn)位。注意,如果是這樣的:(A)=39,后面沒H,執(zhí)行SWAP A之后,可不是(A)=93。要將它化成二進(jìn)制再算:39化為二進(jìn)制是10111,也就是0001,0111高4位是0001,低4位是0111,交換后是01110001,也就是71H,即113。

  練習(xí),已知(A)=39H,執(zhí)行下列單片機(jī)指令后寫出每步的結(jié)果

  CPL A

  RL A

  CLR C

  RRC A

  SETB C

  RLC A

  SWAP A

  通過前面的學(xué)習(xí),我們已經(jīng)掌握了相當(dāng)一部份的單片機(jī)指令,大家對這些枯燥的單片機(jī)指令可能也有些厭煩了,下面讓我們輕松一下,做個實(shí)驗(yàn)。

  實(shí)驗(yàn)五:

  ORG 0000H

  LJMP START

  ORG 30H

  START:

  MOV SP,#5FH

  MOV A,#80H

  LOOP:

  MOV P1,A

  RL A

  LCALL DELAY

  LJMP LOOP

  delay:

  mov r7,#255

  d1: mov r6,#255

  d2: nop

  nop

  nop

  nop

  djnz r6,d2

  djnz r7,d1

  ret

  END

  先讓我們將程序?qū)懭肫校b進(jìn)實(shí)驗(yàn)板,看一看現(xiàn)象。

  看到的是一個暗點(diǎn)流動的現(xiàn)象,讓我們來分析一下吧。

  前而的ORG 0000H、LJMP START、ORG 30H等我們稍后分析。從START開始,MOV SP,#5FH,這是初始化堆棧,在本程序中有無此句無關(guān)緊要,不過我們慢慢開始接觸正規(guī)的編程,我也就慢慢給大家培養(yǎng)習(xí)慣吧。

  MOV A,#80H,將80H這個數(shù)送到A中去。干什么呢?不知道,往下看。

  MOV P1,A。將A中的值送到P1端口去。此時A中的值是80H,所以送出去的也就是80H,因此P1口的值是80H,也就是10000000B,通過前面的分析,我們應(yīng)當(dāng)知道,此時P1。7接的LED是不亮的,而其它的LED都是亮的,所以就形成了一個“暗點(diǎn)”。繼續(xù)看,RL A,RL A是將A中的值進(jìn)行左移,算一下,移之后的結(jié)果是什么?對了,是01H,也就是00000001B,這樣,應(yīng)當(dāng)是接在P1。0上的LED不亮,而其它的都亮了,從現(xiàn)象上看“暗點(diǎn)”流到了后面。然后是調(diào)用延時程序,這個我們很熟悉了,讓這個“暗點(diǎn)”“暗”一會兒。然后又調(diào)轉(zhuǎn)到LOOP處(LJMP LOOP)。請大家計(jì)算一下,下面該哪個燈不亮了。。。。。對了,應(yīng)當(dāng)是接在P1。1上燈不亮了。這樣依次循環(huán),就形成了“暗點(diǎn)流動”這一現(xiàn)象。

  問題:

  如何實(shí)現(xiàn)亮點(diǎn)流動?

  如何改變流動的方向?

  答案:

  1、將A中的初始值改為7FH即可。

  2、將RL A改為RR A即可。

13、單片機(jī)邏輯與或異或指令詳解

  ANL A,Rn ;A與Rn中的值按位‘與’,結(jié)果送入A中

  ANL A,direct ;A與direct中的值按位‘與’,結(jié)果送入A中

  ANL A,@Ri ;A與間址尋址單元@Ri中的值按位‘與’,結(jié)果送入A中

  ANL A,#data ;A與立即數(shù)data按位‘與’,結(jié)果送入A中

  ANL direct,A ;direct中值與A中的值按位‘與’,結(jié)果送入direct中

  ANL direct,#data ;direct中的值與立即數(shù)data按位‘與’,結(jié)果送入direct中。

  這幾條指令的關(guān)鍵是知道什么是邏輯與。這里的邏輯與是指按位與

  例:71H和56H相與則將兩數(shù)寫成二進(jìn)制形式:

 ?。?1H) 01110001

 ?。?6H) 00100110

  結(jié)果 00100000 即20H,從上面的式子能看出,兩個參與運(yùn)算的值只要其中有一個位上是0,則這位的結(jié)果就是0,兩個同是1,結(jié)果才是1。

  理解了邏輯與的運(yùn)算規(guī)則,結(jié)果自然就出來了??疵織l指令后面的注釋

  下面再舉一些例程來看。

  MOV A,#45H ;(A)=45H

  MOV R1,#25H ;(R1)=25H

  MOV 25H,#79H ;(25H)=79H

  ANL A,@R1 ;45H與79H按位與,結(jié)果送入A中為 41H (A)=41H

  ANL 25H,#15H ;25H中的值(79H)與15H相與結(jié)果為(25H)=11H)

  ANL 25H,A ;25H中的值(11H)與A中的值(41H)相與,結(jié)果為(25H)=11H[!--empirenews.page--]

  在知道了邏輯與指令的功能后,邏輯或和邏輯異或的功能就很簡單了。邏輯或是按位“或”,即有“1”為1,全“0”為0。例:

  10011000

  或 01100001

  結(jié)果 11111001

  而異或則是按位“異或”,相同為“0”,相異為“1”。例:

  10011000

  異或 01100001

  結(jié)果 11111001

  而所有的或指令,就是將與指仿中的ANL 換成ORL,而異或指令則是將ANL 換成XRL。即

  或指令:

  ORL A,Rn ;A和Rn中的值按位‘或’,結(jié)果送入A中

  ORL A,direct ;A和與間址尋址單元@Ri中的值按位‘或’,結(jié)果送入A中

  ORL A,#data ;A和立direct中的值按位‘或’,結(jié)果送入A中

  ORL A,@Ri ;A和即數(shù)data按位‘或’,結(jié)果送入A中

  ORL direct,A ;direct中值和A中的值按位‘或’,結(jié)果送入direct中

  ORL direct,#data ;direct中的值和立即數(shù)data按位‘或’,結(jié)果送入direct中。

  異或指令:

  XRL A,Rn ;A和Rn中的值按位‘異或’,結(jié)果送入A中

  XRL A,direct ;A和direct中的值按位‘異或’,結(jié)果送入A中

  XRL A,@Ri ;A和間址尋址單元@Ri中的值按位‘異或’,結(jié)果送入A中

  XRL A,#data ;A和立即數(shù)data按位‘異或’,結(jié)果送入A中

  XRL direct,A ;direct中值和A中的值按位‘異或’,結(jié)果送入direct中

  XRL direct,#data ;direct中的值和立即數(shù)data按位‘異或’,結(jié)果送入direct中。

  練習(xí):

  MOV A,#24H

  MOV R0,#37H

  ORL A,R0

  XRL A,#29H

  MOV 35H,#10H

  ORL 35H,#29H

  MOV R0,#35H

  ANL A,@R0

 14、控制轉(zhuǎn)移類指令

  無條件轉(zhuǎn)移類指令

  短轉(zhuǎn)移類指令

  AJMP addr11

  長轉(zhuǎn)移類指令

  LJMP addr16

  相對轉(zhuǎn)移指令

  SJMP rel

  上面的三條指令,如果要仔細(xì)分析的話,區(qū)別較大,但開始學(xué)習(xí)時,可不理會這么多,統(tǒng)統(tǒng)理解成:JMP 標(biāo)號,也就是跳轉(zhuǎn)到一個標(biāo)號處。事實(shí)上,LJMP 標(biāo)號,在前面的例程中我們已接觸過,并且也知道如何來使用了。而AJMP和SJMP也是一樣。那么他們的區(qū)別何在呢?在于跳轉(zhuǎn)的范圍不一樣。好比跳遠(yuǎn),LJMP一下就能跳64K這么遠(yuǎn)(當(dāng)然近了更沒關(guān)系了)。而AJMP 最多只能跳2K距離,而SJMP則最多只能跳256這么遠(yuǎn)。原則上,所有用SJMP或AJMP的地方都能用LJMP來替代。因此在開始學(xué)習(xí)時,需要跳轉(zhuǎn)時能全用LJMP,除了一個場合。什么場合呢?先了解一下AJMP,AJMP是一條雙字節(jié)指令,也就說這條指令本身占用存儲器(ROM)的兩個單元。而LJMP則是三字節(jié)指令,即這條指令占用存儲器(ROM)的三個單元。下面是第四條跳轉(zhuǎn)指令。

  間接轉(zhuǎn)移指令

  JMP @A+DPTR

  這條指令的用途也是跳轉(zhuǎn),轉(zhuǎn)到什么地方去呢?這可不能由標(biāo)號簡單地決定了。讓我們從一個實(shí)際的例程入手吧。

  MOV DPTR,#TAB ;將TAB所代表的地址送入DPTR

  MOV A,R0 ;從R0中取數(shù)(詳見下面說明)

  MOV B,#2

  MUL A,B ;A中的值乘2(詳見下面的說明)

  JMP A,@A+DPTR ;跳轉(zhuǎn)

  TAB: AJMP S1 ;跳轉(zhuǎn)表格

  AJMP S2

  AJMP S3

  應(yīng)用背景介紹:在單片機(jī)開發(fā)中,經(jīng)常要用到鍵盤,見上面的9個按鈕的鍵盤。我們的要求是:當(dāng)按下功能鍵A………。.G時去完成不一樣的功能。這用程序設(shè)計(jì)的語言來表達(dá)的話,就是:按下不一樣的鍵去執(zhí)行不一樣的程序段,以完成不一樣的功能。怎么樣來實(shí)現(xiàn)呢?

 前面的程序讀入的是按鈕的值,如按下‘A’鍵后獲得的鍵值是0,按下‘B’鍵后獲得的值是‘1’等等,然后根據(jù)不一樣的值進(jìn)行跳轉(zhuǎn),如鍵值為0就轉(zhuǎn)到S1執(zhí)行,為1就轉(zhuǎn)到S2執(zhí)行。。。。如何來實(shí)現(xiàn)這一功能呢?

  先從程序的下面看起,是若干個AJMP語句,這若干個AJMP語句最后在存儲器中是這樣存放的(見圖3),也就是每個AJMP語句都占用了兩個存儲器的空間,并且是連續(xù)存放的。而AJMP S1存放的地址是TAB,到底TAB等于多少,我們不需要知道,把它留給匯編程序來算好了。

  下面我們來看這段程序的執(zhí)行過程:第一句MOV DPTR,#TAB執(zhí)行完了之后,DPTR中的值就是TAB,第二句是MOV A,R0,我們假設(shè)R0是由按鈕處理程序獲得的鍵值,比如按下A鍵,R0中的值是0,按下B鍵,R0中的值是1,以此類推,現(xiàn)在我們假設(shè)按下的是B鍵,則執(zhí)行完第二條指令后,A中的值就是1。并且按我們的分析,按下B后應(yīng)當(dāng)執(zhí)行S2這段程序,讓我們來看一看是否是這樣呢?第三條、第四條指令是將A中的值乘2,即執(zhí)行完第4條指令后A中的值是2。下面就執(zhí)行JMP @A+DPTR了,現(xiàn)在DPTR中的值是TAB,而A+DPTR后就是TAB+2,因此,執(zhí)行此句程序后,將會跳到TAB+2這個地址繼續(xù)執(zhí)行??匆豢丛赥AB+2這個地址里面放的是什么?就是AJMP S2這條指令。因此,馬上又執(zhí)行AJMP S2指令,程序?qū)⑻絊2處往下執(zhí)行,這與我們的要求相符合。

  請大家自行分析按下鍵“A”、“C”、“D”……之后的情況。

  這樣我們用JMP @A+DPTR就實(shí)現(xiàn)了按下一鍵跳到對應(yīng)的程序段去執(zhí)行的這樣一個要求。再問大家一個問題,為什么取得鍵值后要乘2?如果例程下面的所有指令換成LJMP,即:

  LJMP S1,LJMP S2……這段程序還能正確地執(zhí)行嗎?如果不能,應(yīng)該怎么改?

  14、單片機(jī)條件轉(zhuǎn)移指令

  條件轉(zhuǎn)移指令是指在滿足一定條件時進(jìn)行相對轉(zhuǎn)移。

  判A內(nèi)容是否為0轉(zhuǎn)移指令

  JZ rel

  JNZ rel

  第一指令的功能是:如果(A)=0,則轉(zhuǎn)移,不然次序執(zhí)行(執(zhí)行本指令的下一條指令)。轉(zhuǎn)移到什么地方去呢?如果按照傳統(tǒng)的辦法,就要算偏移量,很麻煩,好在現(xiàn)在我們能借助于機(jī)器匯編了。因此這第指令我們能這樣理解:JZ 標(biāo)號。即轉(zhuǎn)移到標(biāo)號處。下面舉一例說明:

  MOV A,R0

  JZ L1

  MOV R1,#00H

  AJMP L2

  L1: MOV R1,#0FFH

  L2: SJMP L2

  END

  在執(zhí)行上面這段程序前如果R0中的值是0的話,就轉(zhuǎn)移到L1執(zhí)行,因此最終的執(zhí)行結(jié)果是R1中的值為0FFH。而如果R0中的值不等于0,則次序執(zhí)行,也就是執(zhí)行 MOV R1,#00H指令。最終的執(zhí)行結(jié)果是R1中的值等于0。

  第一條指令的功能清楚了,第二條當(dāng)然就好理解了,如果A中的值不等于0,就轉(zhuǎn)移。把上面的那個例程中的JZ改成JNZ試試吧,看看程序執(zhí)行的結(jié)果是什么?

  比較轉(zhuǎn)移指令

  CJNE A,#data,rel

  CJNE A,direct,rel

  CJNE Rn,#data,rel

  CJNE @Ri,#data,rel

  第一條指令的功能是將A中的值和立即數(shù)data比較,如果兩者相等,就次序執(zhí)行(執(zhí)行本指令的下一條指令),如果不相等,就轉(zhuǎn)移,同樣地,我們能將rel理解成標(biāo)號,即:CJNE A,#data,標(biāo)號。這樣利用這條指令,我們就能判斷兩數(shù)是否相等,這在很多場合是非常有用的。但有時還想得知兩數(shù)比較之后哪個大,哪個小,本條指令也具有這樣的功能,如果兩數(shù)不相等,則CPU還會反映出哪個數(shù)大,哪個數(shù)小,這是用CY(進(jìn)位位)來實(shí)現(xiàn)的。如果前面的數(shù)(A中的)大,則CY=0,不然CY=1,因此在程序轉(zhuǎn)移后再次利用CY就可判斷出A中的數(shù)比data大還是小了。

  例:

  MOV A,R0

  CJNE A,#10H,L1

  MOV R1,#0FFH

  AJMP L3

  L1: JC L2

  MOV R1,#0AAH

  AJMP L3

  L2: MOV R1,#0FFH

  L3: SJMP L3

  上面的程序中有一條單片機(jī)指令我們還沒學(xué)過,即JC,這條指令的原型是JC rel,作用和上面的JZ類似,但是它是判CY是0,還是1進(jìn)行轉(zhuǎn)移,如果CY=1,則轉(zhuǎn)移到JC后面的標(biāo)號處執(zhí)行,如果CY=0則次序執(zhí)行(執(zhí)行它的下面一條指令)。

  分析一下上面的程序,如果(A)=10H,則次序執(zhí)行,即R1=0。如果(A)不等于10H,則轉(zhuǎn)到L1處繼續(xù)執(zhí)行,在L1處,再次進(jìn)行判斷,如果(A)》10H,則CY=1,將次序執(zhí)行,即執(zhí)行MOV R1,#0AAH指令,而如果(A)《10H,則將轉(zhuǎn)移到L2處指行,即執(zhí)行MOV R1,#0FFH指令。因此最終結(jié)果是:本程序執(zhí)行前,如果(R0)=10H,則(R1)=00H,如果(R0)》10H,則(R1)=0AAH,如果(R0)《10H,則(R1)=0FFH。

  弄懂了這條指令,其它的幾條就類似了,第二條是把A當(dāng)中的值和直接地址中的值比較,第三條則是將直接地址中的值和立即數(shù)比較,第四條是將間址尋址得到的數(shù)和立即數(shù)比較,這里就不詳談了,下面給出幾個對應(yīng)的例程。

  CJNE A,10H ;把A中的值和10H中的值比較(注意和上題的區(qū)別)

  CJNE 10H,#35H ;把10H中的值和35H中的值比較

  CJNE @R0,#35H ;把R0中的值作為地址,從此地址中取數(shù)并和35H比較

  循環(huán)轉(zhuǎn)移指令

  DJNZ Rn,rel

  DJNZ direct,rel

  第一條指令在前面的例程中有詳細(xì)的分析,這里就不多談了。第二條指令,只是將Rn改成直接地址,其它一樣,也不多說了,給一個例程。

  DJNZ 10H,LOOP

  3.調(diào)用與返回指令

  (1)主程序與子程序 在前面的燈的實(shí)驗(yàn)中,我們已用到過了子程序,只是我們并沒有明確地介紹。子程序是干什么用的,為什么要用子程序技術(shù)呢?舉個例程,我們數(shù)據(jù)老師布置了10道算術(shù)題,經(jīng)過觀察,每一道題中都包含一個(3*5+2)*3的運(yùn)算,我們能有兩種選擇,第一種,每做一道題,都把這個算式算一遍,第二種選擇,我們能先把這個結(jié)果算出來,也就是51,放在一邊,然后要用到這個算式時就將51代進(jìn)去。這兩種辦法哪種更好呢?不必多言。設(shè)計(jì)程序時也是這樣,有時一個功能會在程序的不一樣地方反復(fù)使用,我們就能把這個功能做成一段程序,每次需要用到這個功能時就“調(diào)用”一下。

 ?。?)調(diào)用及回過程:主程序調(diào)用了子程序,子程序執(zhí)行完之后必須再回到主程序繼續(xù)執(zhí)行,不能“一去不回頭”,那么回到什么地方呢?是回到調(diào)用子程序的下面一條指令繼續(xù)執(zhí)行(當(dāng)然啦,要是還回到這條指令,不又要再調(diào)用子程序了嗎?那可就沒完沒了了……)。參考圖1

  

  調(diào)用指令

  LCALL addr16 ;長調(diào)用指令

  ACALL addr11 ;短調(diào)用指令

  上面兩條指令都是在主程序中調(diào)用子程序,兩者有一定的區(qū)別,但在開始學(xué)習(xí)單片機(jī)的這些指令時,能不加以區(qū)別,而且能用LCALL 標(biāo)號,ACALL 標(biāo)號,來理解,即調(diào)用子程序。

 ?。?)返回指令則說了,子程序執(zhí)行完后必須回到主程序,如何返回呢?只要執(zhí)行一條返回指令就能了,即執(zhí)行 ret指令

  4.空操作指令

  nop 就是 空操作,就是什么事也不干,停一個周期,一般用作短時間的延時。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉