(玩電子) 電子技術(shu)學習與(yu)研(yan)究
當前(qian)位置︰單片機教程(cheng)網 >> 基礎教程(cheng) >> 瀏覽(lan)文章(zhang)

上海福彩网官网

作者:佚名   來(lai)源:本站原創(chuang)   點擊數:x  更新時間︰2007年(nian)08月15日   【字體︰

ANL A,Rn ;A與(yu)Rn中的(de)值按(an)位'與(yu)',結果送入A中

ANL A,direct ;A與(yu)direct中的(de)值按(an)位'與(yu)',結果送入A中

ANL A,@Ri ;A與(yu)間址尋址單元@Ri中的(de)值按(an)位'與(yu)',結果送入A中

ANL A,#data ;A與(yu)立即(ji)數data按(an)位'與(yu)',結果送入A中

ANL direct,A ;direct中值與(yu)A中的(de)值按(an)位'與(yu)',結果送入direct中

ANL direct,#data ;direct中的(de)值與(yu)立即(ji)數data按(an)位'與(yu)',結果送入direct中。

這幾條指(zhi)令的(de)關(guan)鍵是知道什麼是邏輯與(yu)。這里的(de)邏輯與(yu)是指(zhi)按(an)位與(yu)

例︰71H和56H相與(yu)則將兩數寫成二進制形(xing)式︰

(71H) 01110001

(56H) 00100110

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

理解了(liao)邏輯與(yu)的(de)運(yun)算規則,結果自然就出來(lai)了(liao)。看每(mei)條指(zhi)令後面的(de)注釋(shi)

下面再舉一(yi)些例程(cheng)來(lai)看。

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

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

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

ANL A,@R1 ;45H與(yu)79H按(an)位與(yu),結果送入A中xing)41H (A)=41H

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

ANL 25H,A ;25H中的(de)值(11H)與(yu)A中的(de)值(41H)相與(yu),結果為(wei)(25H)=11H

在知道了(liao)邏輯與(yu)指(zhi)令的(de)功能後,邏輯或和邏輯異(yi)或的(de)功能就很簡單了(liao)。邏輯或是qian)an)位“或”,即(ji)有“1”為(wei)1,全(quan)“0”為(wei)0。例︰

10011000

或 01100001

結果 11111001

而異(yi)或則是qian)an)位“異(yi)或”,相同為(wei)“0”,相異(yi)為(wei)“1”。例︰

10011000

異(yi)或 01100001

結果 11111001

而所有的(de)或指(zhi)令,就是將與(yu)指(zhi)仿中的(de)ANL 換成ORL,而異(yi)或指(zhi)令則是將ANL 換成XRL。即(ji)

或指(zhi)令︰

ORL A,Rn ;A和Rn中的(de)值按(an)位'或',結果送入A中

ORL A,direct ;A和與(yu)間址尋址單元@Ri中的(de)值按(an)位'或',結果送入A中

ORL A,#data ;A和立direct中的(de)值按(an)位'或',結果送入A中

ORL A,@Ri ;A和即(ji)數data按(an)位'或',結果送入A中

ORL direct,A ;direct中值和A中的(de)值按(an)位'或',結果送入direct中

ORL direct,#data ;direct中的(de)值和立即(ji)數data按(an)位'或',結果送入direct中。

異(yi)或指(zhi)令︰

XRL A,Rn ;A和Rn中的(de)值按(an)位'異(yi)或',結果送入A中

XRL A,direct ;A和direct中的(de)值按(an)位'異(yi)或',結果送入A中

XRL A,@Ri ;A和間址尋址單元@Ri中的(de)值按(an)位'異(yi)或',結果送入A中

XRL A,#data ;A和立即(ji)數data按(an)位'異(yi)或',結果送入A中

XRL direct,A ;direct中值和A中的(de)值按(an)位'異(yi)或',結果送入direct中

XRL direct,#data ;direct中的(de)值和立即(ji)數data按(an)位'異(yi)或',結果送入direct中。

練習︰

MOV A,#24H

MOV R0,#37H

ORL A,R0

XRL A,#29H

MOV 35H,#10H

ORL 35H,#29H

MOV R0,#35H

ANL A,@R0

四、控(kong)制轉移類(lei)指(zhi)令

無條件轉移類(lei)指(zhi)令

短轉移類(lei)指(zhi)令

AJMP addr11

長轉移類(lei)指(zhi)令

LJMP addr16

相對轉移指(zhi)令

SJMP rel

上面的(de)三條指(zhi)令,如(ru)果要仔細分析的(de)話(hua),區別較大,但開始學習時,可不理會這麼多,統統理解成︰JMP 標號,也就是跳(tiao)轉到一(yi)個(ge)標號處(chu)。事實上,LJMP 標號,在前(qian)面的(de)例程(cheng)中xing)頤且呀喲?guo),並且也知道如(ru)何來(lai)使(shi)用了(liao)。而AJMP和SJMP也是一(yi)樣(yang)。那(na)麼ci)塹de)na)鷙臥諛ne)?在于跳(tiao)轉的(de)範圍(wei)不一(yi)樣(yang)。好(hao)比(bi)跳(tiao)遠,LJMP一(yi)下就能跳(tiao)64K這麼遠(當bi)喚jin)了(liao)更沒關(guan)系了(liao))。而AJMP 最多只能跳(tiao)2K距離,而SJMP則最多只能跳(tiao)256這麼遠。原則上,所有用SJMP或AJMP的(de)地方(fang)都能用LJMP來(lai)替代。因此(ci)在開始學習時,需要跳(tiao)轉時能全(quan)用LJMP,除了(liao)一(yi)個(ge)場合。什麼場合呢(ne)?先了(liao)解一(yi)下AJMP,AJMP是一(yi)條雙字節指(zhi)令,也就說這條指(zhi)令本身佔(zhan)用存(cun)儲器(ROM)的(de)兩個(ge)單元。而LJMP則是三字節指(zhi)令,即(ji)這條指(zhi)令佔(zhan)用存(cun)儲器(ROM)的(de)三個(ge)單元。下面是第四條跳(tiao)轉指(zhi)令。

間接轉移指(zhi)令

JMP @A+DPTR

這條指(zhi)令的(de)用途也是跳(tiao)轉,轉到什麼地方(fang)去呢(ne)?這可不能由標號簡單地決定了(liao)。讓我(wo)們從一(yi)個(ge)實際的(de)例程(cheng)入手吧。

MOV DPTR,#TAB ;將TAB所代表(biao)的(de)地址送入DPTR

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

MOV B,#2

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

JMP A,@A+DPTR ;跳(tiao)轉

TAB: AJMP S1 ;跳(tiao)轉表(biao)格

AJMP S2

AJMP S3

圖2

圖3

  應用背(bei)景介紹︰在單片機開發中,經(jing)常要用到鍵盤,見上面的(de)9個(ge)按(an)鈕的(de)鍵盤。我(wo)們的(de)要求是︰當按(an)下功能鍵A………..G時bi)?瓿剎灰yi)樣(yang)的(de)功能。這用程(cheng)序設計的(de)語言(yan)來(lai)表(biao)達的(de)話(hua),就是︰按(an)下不一(yi)樣(yang)的(de)鍵去執行不一(yi)樣(yang)的(de)程(cheng)序段,以完成不一(yi)樣(yang)的(de)功能。怎麼樣(yang)來(lai)實現(xian)呢(ne)?

  看圖2,前(qian)面的(de)程(cheng)序讀入的(de)是qian)an)鈕的(de)值,如(ru)按(an)下'A'鍵後獲得的(de)鍵值是0,按(an)下'B'鍵後獲得的(de)值是'1'等等,然後根據不一(yi)樣(yang)的(de)值進行跳(tiao)轉,如(ru)鍵值為(wei)0就轉到S1執行,為(wei)1就轉到S2執行。。。。如(ru)何來(lai)實現(xian)這一(yi)功能呢(ne)?

  先從程(cheng)序的(de)下面看起(qi),是若(ruo)干個(ge)AJMP語句,這若(ruo)干個(ge)AJMP語句最後在存(cun)儲器中是這樣(yang)存(cun)放的(de)(見圖3),也就是每(mei)個(ge)AJMP語句都佔(zhan)用了(liao)兩個(ge)存(cun)儲器的(de)空zhan)洌 ?沂橇 xu)存(cun)放的(de)。而AJMP S1存(cun)放的(de)地址是TAB,到底TAB等于多少(shao),我(wo)們不需要知道,把它留給(gei)匯編程(cheng)序來(lai)算好(hao)了(liao)。

  下面我(wo)們來(lai)看這段程(cheng)序的(de)執行過(guo)程(cheng)︰第一(yi)句MOV DPTR,#TAB執行完了(liao)之後,DPTR中的(de)值就是TAB,第二句是MOV A,R0,我(wo)們假設R0是由按(an)鈕處(chu)理程(cheng)序獲得的(de)鍵值,比(bi)如(ru)按(an)下A鍵,R0中的(de)值是0,按(an)下B鍵,R0中的(de)值是1,以此(ci)類(lei)推,現(xian)在我(wo)們假設按(an)下的(de)是B鍵,則執行完第二條指(zhi)令後,A中的(de)值就是1。並且按(an)我(wo)們的(de)分析,按(an)下B後應當執行S2這段程(cheng)序,讓我(wo)們來(lai)看一(yi)看是否是這樣(yang)呢(ne)?第三條、第四條指(zhi)令是將A中的(de)值乘2,即(ji)執行完第4條指(zhi)令後A中的(de)值是2。下面就執行JMP @A+DPTR了(liao),現(xian)在DPTR中的(de)值是TAB,而A+DPTR後就是TAB+2,因此(ci),執行此(ci)句程(cheng)序後,將會跳(tiao)到TAB+2這個(ge)地址繼(ji)續(xu)執行。看一(yi)看在TAB+2這個(ge)地址里面放的(de)是什麼?就是AJMP S2這條指(zhi)令。因此(ci),馬(ma)上又執行AJMP S2指(zhi)令,程(cheng)序將跳(tiao)到S2處(chu)往(wang)下執行,這與(yu)我(wo)們的(de)要求相符(fu)合。

請大家自行分析按(an)下鍵“A”、“C”、“D”……之後的(de)na)榭觥/p>

  這樣(yang)我(wo)們用JMP @A+DPTR就實現(xian)了(liao)按(an)下一(yi)鍵跳(tiao)到對應的(de)程(cheng)序段去執行的(de)這樣(yang)一(yi)個(ge)要求。再問大家一(yi)個(ge)問題,為(wei)什麼取得鍵值後要乘2?如(ru)果例程(cheng)下面的(de)所有指(zhi)令換成LJMP,即(ji)︰

LJMP S1,LJMP S2……這段程(cheng)序還能正確地執行嗎?如(ru)果不能,應該(gai)怎麼改(gai)?

發表(biao)評論】【告訴好(hao)友】【收藏此(ci)文】【關(guan)閉窗口(kou)

上海福彩网官网

上海福彩网官网 | 下一页