80C51的程序设计课件_第1页
80C51的程序设计课件_第2页
80C51的程序设计课件_第3页
80C51的程序设计课件_第4页
80C51的程序设计课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

1

80C51的程式設計

2

4.1

程式編制的方法和技巧

4.1.1程式編制的步驟

一、預完成任務的分析首先,要對單片機應用系統預完成的任務進行深入的分析,明確系統的設計任務、功能要求和技術指標。其次,要對系統的硬體資源和工作環境進行分析。這是單片機應用系統程式設計的基礎和條件。

3

二、進行演算法的優化

演算法是解決具體問題的方法。一個應用系統經過分析、研究和明確規定後,對應實現的功能和技術指標可以利用嚴密的數學方法或數學模型來描述,從而把一個實際問題轉化成由電腦進行處理的問題。同一個問題的演算法可以有多種,結果也可能不盡相同,所以,應對各種演算法進行分析比較,並進行合理的優化。比如,用迭代法解微分方程,需要考慮收斂速度的快慢(即在一定的時間裏能否達到精度要求)。而有的問題則受記憶體容量的限制而對時間要求並不苛刻。對於後一種情況,速度不快但節省記憶體的演算法則應是首選。4

三、程式總體設計及流程圖繪製經過任務分析、演算法優化後,就可以進行程式的總體構思,確定程式的結構和數據形式,並考慮資源的分配和參數的計算等。然後根據程式運行的過程,勾畫出程式執行的邏輯順序,用圖形符號將總體設計思路及程式流向繪製在平面圖上,從而使程式的結構關係直觀明瞭,便於檢查和修改。5

清晰正確的流程圖是編制正確無誤的應用程式的基礎和條件。所以,繪製一個好的流程圖,是程式設計的一項重要內容。流程圖可以分為總流程圖和局部流程圖。總流程圖側重反映程式的邏輯結構和各程式模組之間的相互關係。局部流程圖反映程式模組的具體實施細節。對於簡單的應用程式,可以不畫流程圖。但是當程式較為複雜時,繪製流程圖是一個良好的編程習慣。6

常用的流程圖符號有:開始和結束符號、工作任務符號、判斷分支符號、程式連接符號、程式流向符號等

7

4.1.2編制程式的方法和技巧

一、採用模組化程式設計方法應用系統的程式一般由包含多個模組的主程序和各種副程式組成。各程式模組都要完成一個明確的任務,實現某個具體的功能,如:發送、接收、延時、列印和顯示等。採用模組化的程式設計方法,就是將這些不同的具體功能程式進行獨立的設計和分別調試,最後將這些模組程式裝配成整體程式並進行聯調。模組化的程式設計方法具有明顯的優點。把一個多功能的複雜的程式劃分為若干個簡單的、功能單一的程式模組,有利於程式的設計和調試,有利於程式的優化和分工,提高了程式的閱讀性和可靠性,使程式的結構層次一目了然。

8

二、儘量採用迴圈結構和副程式採用迴圈結構和副程式可以使程式的長度減少、佔用記憶體空間減少。多重迴圈,注意各重迴圈的初值和迴圈結束條件,避免出現“死迴圈”現象;通用的副程式,除了用於存放副程式入口參數的寄存器外,副程式中用到的其他寄存器的內容應壓入堆疊進行現場保護,並要特別注意堆疊操作的壓入和彈出的平衡;中斷處理副程式除了要保護程式中用到的寄存器外,還應保護標誌寄存器。9

4.1.3組合語言的語句格式

語句行由四個字段組成:

[標號:]操作碼[運算元][;注釋]

括弧內的部分可以根據實際情況取捨。每個字段之間要用分隔符號分隔,可以用作分隔符號的符號有空格、冒號、逗號、分號等。如:LOOP:MOVA,#7FH;A←7FH10

一、標號標號是語句地址的標誌符號,用於引導對該語句的非順序訪問。有關標號的規定為:標號由1~8個ASCII字元組成。第一個字元必須是字母,其餘字元可以是字母、數字或其他特定字元;不能使用該組合語言已經定義了的符號作為標號。如指令助記符、寄存器符號名稱等;標號後邊必須跟冒號。二、操作碼操作碼用於規定語句執行的操作。它是彙編語句中唯一不能空缺的部分。它由指令助記符表示。

11

三、運算元運算元用於給指令的操作提供數據或地址。在一條彙編語句中運算元可能是空缺的,也可能包括一項,還可能包括兩項或三項。各運算元間以逗號分隔。運算元字段的內容可能包括以下幾種情況:(1)工作寄存器名;(2)特殊功能寄存器名;(3)標號名;(4)常數;(5)符號“$”,表示程式計數器PC的當前值;(6)運算式。12

四、注釋注釋不屬於彙編語句的功能部分,它只是對語句的說明。注釋字段可以增加程式的可讀性,有助於編程人員的閱讀和維護。注釋字段必須以分號“;”開頭,長度不限,當一行書寫不下時,可以換行接著書寫,但換行時應注意在開頭使用分號“;”。五、數據的表示形式80C51組合語言的數據可以有以下幾種表示形式:二進位數,末尾以字母B標識。如:10001111B;十進位數,末尾以字母D標識或將字母D省略。如:88D,66;十六進制數,末尾以字母H標識。如:78H,0A8H(但應注意的是,十六進制數以字母A~F開頭時應在其前面加上數字“0”。);ASCII碼,以單引號括起來標識。如:‘AB’,‘1245’

13

4.2根源程式的編輯和彙編

一、根源程式的編輯根源程式的編寫要依據80C51組合語言的基本規則,特別要用好常用的彙編命令(即偽指令),例如下麵的程式段:

ORG0040HMOVA,#7FHMOVR1,#44HEND

這裏的ORG和END是兩條偽指令,其作用是告訴組合語言程式此彙編根源程式的起止位置。編輯好的根源程式應以“.ASM”擴展名存盤,以備組合語言程式調用。

4.2.1根源程式的編輯與彙編

14

二、根源程式的彙編

將組合語言根源程式轉換為單片機能執行的機器碼形式的目標程式的過程叫彙編。常用的方法有兩種:手工彙編時,把程式用助記符指令寫出後,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機器碼,然後把得到的機器碼程式(以十六進制形式)鍵入到單片機開發機中,並進行調試。機器彙編是在常用的個人電腦PC上,使用交叉組合語言程式將組合語言根源程式轉換為機器碼形式的目標程式。彙編工作由電腦完成,生成的目標程式由PC機傳送到開發機上,經調試無誤後,再固化到單片機的程式記憶體ROM中。15

根源程式經過機器彙編後,形成的若干檔中含有兩個主要檔,一是列表檔,另一個是目標碼檔。因彙編軟體的不同,檔的格式及資訊會有一些不同。但主要資訊如下:列表檔主要資訊為:地址目標碼組合語言程式

ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標碼檔主要資訊為:首地址末地址目標碼0040H0044H747F794416

偽指令是組合語言程式能夠識別並對彙編過程進行某種控制的彙編命令。它不是單片機執行的指令,所以沒有對應的可執行目標碼,彙編後產生的目標程式中不會再出現偽指令。一、起始地址設定偽指令ORG格式為:ORG運算式該指令的功能是向組合語言程式說明下麵緊接的程式段或數據段存放的起始地址。運算式通常為16進制地址,也可以是已定義的標號地址。

4.2.2偽指令

17

ORG8000HSTART:MOVA,#30H……

此時規定該段程式的機器碼從地址8000H單元開始存放。在每一個組合語言根源程式的開始,都要設置一條ORG偽指令來指定該程式在記憶體中存放的起始位置。若省略ORG偽指令,則該程式段從0000H單元開始存放。在一個根源程式中,可以多次使用ORG偽指令規定不同程式段或數據段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。18

二、彙編結束偽指令END格式為:END該指令的功能是結束彙編。組合語言程式遇到END偽指令後即結束彙編。處於END之後的程式,組合語言程式將不處理。19

三、位元組數據定義偽指令DB[標號:]DB位元組數據表功能是從標號指定的地址開始,在ROM中定義位元組數據。位元組數據表可以是一個或多個位元組數據、字串或運算式。該偽指令將位元組數據表中的數據根據從左到右的順序依次存放在指定的存儲單元中。一個數據占一個存儲單元。例如:DB“howareyou?”把字串中的字元以ASCII碼的形式存放在連續的ROM單元中。又如:DB-2,-4,-6,8,10,18把6個數轉換為十六進製錶示(FEH,FCH,FAH,08H,0AH,12H),並連續地存放在6個ROM。

20

該偽指令常用於存放數據表格。如要存放顯示用的十六進制的字形碼,可以用多條DB指令完成:

DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDBC6H,A1H,86H,84H21

四、字數據定義偽指令DW[標號:]DW字數據表功能是從標號指定的地址單元開始,在程式記憶體中定義字數據。該偽指令將字或字表中的數據根據從左到右的順序依次存放在指定的存儲單元中。應特別注意:16位的二進位數,高8位存放在低地址單元,低8位存放在高地址單元。例如:

ORG1400HDATA:DW324AH,3CH……

彙編後,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。22

五、空間定義偽指令DS[標號:]DS運算式功能是從標號指定的地址單元開始,在程式記憶體中保留由運算式所指定的個數的存儲單元作為備用的空間,並都填以零值。例如:

ORG3000HBUF:DS50……彙編後,從地址3000H開始保留50個存儲單元作為備用單元。

23

六、賦值偽指令EQU符號名EQU運算式功能是將運算式的值或特定的某個彙編符號定義為一個指定的符號名。例如:

LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,AEND該程式的功能是,把BLOCK單元開始存放的10個無符號數進行求和,並將結果存入SUM單元中。24

七、位地址符號定義偽指令BIT格式為:符號名BIT位地址運算式功能是將位地址賦給指定的符號名。其中,位地址運算式可以是絕對地址,也可以是符號地址。例如:

STBITP1.0將P1.0的位地址賦給符號名ST,在其後的編程中就可以用ST來代替P1.0。25

4.3基本程式結構

4.3.1順序程式順序程式是指無分支、無迴圈結構的程式。其執行流程是依指令在記憶體中的存放順序進行的。一、數據傳送例內部RAM的2AH~2EH單元中存儲的數據如圖所示。試編寫程式實現圖示的數據傳送結果。

26

方法一:MOVA,2EH;2位元組,1個機器週期MOV2EH,2DH;3位元組,2個機器週期MOV2DH,2CH;3位元組,2個機器週期MOV2CH,2BH;3位元組,2個機器週期MOV2BH,#00H;3位元組,2個機器週期27

方法二:CLRA;1位元組,1個機器週期XCHA,2BH;2位元組,1個機器週期XCHA,2CH;2位元組,1個機器週期XCHA,2DH;2位元組,1個機器週期XCHA,2EH;2位元組,1個機器週期以上兩種方法均可以實現所要求的傳送任務。方法一使用14個位元組的指令代碼,執行時間為9個機器週期;方法二僅用了9個位元組的代碼,執行時間也減少到了5個機器週期。實際應用中應儘量採用指令代碼位元組數少、執行時間短的高效率程式,即注意程式的優化。28

例有一變數存放在片內RAM的20H單元,其取值範圍為:00H~05H。要求編制一段程式,根據變數值求其平方值,並存入片內RAM的21H單元。程式如下:

ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END。

29

在程式記憶體的一片存儲單元中建立起該變數的平方表。用數據指針DPTR指向平方表的首址,則變數與數據指針之和的地址單元中的內容就是變數的平方值。採樣MOVCA,@A+PC指令也可以實現查表功能,且不破壞DPTR的內容,從而可以減少保護DPTR的內容所需的開銷。但表格只能存放在MOVCA,@A+PC指令後的256位元組內,即表格存放的地點和空間有一定限制。

30

三、簡單運算由於80C51指令系統中只有單字節加法指令,因此對於多位元組的相加運算必須從低位位元組開始分位元組進行。除最低位元組可以使用ADD指令外,其他位元組相加時要把低位元組的進位考慮進去,這時就應該使用ADDC指令。例雙位元組無符號數加法。設被加數存放在內部RAM的51H、50H單元,加數存放在內部RAM的61H、60H單元,相加的結果存放在內部RAM的51H、50H單元,進位存放在位尋址區的00H位中。

31

程式段如下:MOVR0,#50H;被加數的低位元組地址 MOVR1,#60H;加數的低位元組地址 MOVA,@R0;取被加數低位元組ADDA,@R1;加上加數低位元組MOV@R0,A;保存低位元組相加結果INCR0;指向被加數高位元組INCR1;指向加數高位元組MOVA,@R0;取被加數高位元組ADDCA,@R1;加上加數高位元組(帶進位加)MOV@R0,A;存高位元組相加結果MOV00H,C;保存進位。

32

4.3.2分支程式

分支結構可以分成單分支、雙分支和多分支幾種情況:33

一、單分支程式例求雙位元組補數。設在內部RAM的addr1和addr+1單元存有一個雙位元組數(高位位元組存於高地址單元)。編寫程式將其讀出取補後再存入addr2和addr2+1單元。首先對低位元組取補,然後判其結果是否為全“0”。若是,則高位元組取補,否則高位元組取反。

34

START:MOVR0,#addr1;原碼低位元組地址送R0 MOVR1,#addr2;補數低位元組地址送R1 MOVA,@R0;原碼低位元組送A CPLA;A內容取補

INCAMOV@R1,A;存補數低位元組

INCR0;調整地址,指向下一單元

INCR1JZZERO;(A)=0時轉ZEROMOVA,@R0;原碼高位元組送A CPLAMOV@R1,A;高位元組反碼存入addr2+1單元

SJMPLOOP1ZERO:MOVA,@R0;高位元組取補存入addr2+1單元

CPLAINCAMOV@R1,ALOOP1:RET35

二、雙分支程式例設變數x以補數的形式存放在片內RAM的30H單元,變數y與x的關係是:當x大於0時,y=x;當x=0時,y=20H;當x小於0時,y=x+5。編制程式,根據x的大小求y並送回原單元。程式段如下:START:MOVA,30HJZNEXTANLA,#80H;判斷符號位

JZLPMOVA,#05HADDA,30HMOV30H,ASJMPLPNEXT:MOV30H,#20HLP:SJMP$

36

三、多分支程式例根據R7的內容轉向相應的處理程式。設R7的內容為0~N,對應的處理程式的入口地址分別為PP0~PPN。程式段如下:START:MOVDPTR,#TAB;置分支入口地址表首址

MOVA,R7;分支轉移序號送AADDA,R7;分支轉移序號乘以2MOVR3,A;暫存於R3MOVCA,@A+DPTR;取高位地址

XCHA,R3INCAMOVCA,@A+DPTR;取低位地址

MOVDPL,A;處理程式入口地址低8位送DPLMOVDPH,R3;處理程式入口地址高8位送DPLCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN

37

4.3.3迴圈程式

按某種控制規律重複執行的程式稱為迴圈程式。迴圈程式有先執行後判斷和先判斷後執行兩種基本結構:

38

一、先執行後判斷例50ms延時程式。若晶振頻率為12MHz,則一個機器週期為1μs。執行一條DJNZ指令需要2個機器週期,即2μs。採用迴圈計數法實現延時,迴圈次數可以通過計算獲得,並選擇先執行後判斷的迴圈結構。程式段如下:

DEL:MOVR7,#200;1μs

DEL1:MOVR6,#123;1μs

NOP ;1μs

DEL2:DJNZR6,DEL2;2μs,計(2×123)μs

DJNZR7,DEL1;2μs,

RET

共計[(2×123+2+2)×200+1]μs,即50.001ms

39

例無符號數排序程式。在片內RAM中,起始地址為30H的8個單元中存放有8個無符號數。試對這些無符號數進行昇冪排序。數據排序常用的方法是冒泡排序法。執行時從前向後進行相鄰數的比較,如數據的大小次序與要求的順序不符就將這兩個數互換,否則不互換。對於昇冪排序,通過這種相鄰數的互換,使小數向前移動,大數向後移動。從前向後進行一次冒泡(相鄰數的互換),就會把最大的數換到最後。再進行一次冒泡,就會把次大的數排在倒數第二的位置。設R7為比較次數計數器,初始值為07H,位地址00H為數據互換標誌位。

40

START:CLR00H;互換標誌清0 MOVR7,#07H;各次冒泡比較次數

MOVR0,#30H;數據區首址

LOOP:MOVA,@R0;取前數

MOV2BH,A;暫存

INCR0MOV2AH,@R0;取後數

CLRCSUBBA,@R0;前數減後數

JCNEXT;前數小於後數,不互換

MOV@R0,2BHDECR0MOV@R0,2AH;兩數交換

INCR0;準備下一次比較

SETB00H;置互換標誌

NEXT:DJNZR7,LOOP;進行下一次比較

JB00H,START;進行下一輪冒泡

SJMP$41

二、先判斷後執行例將內部RAM中起始地址為data的數據串傳送到外部RAM中起始地址為buffer的存儲區域內,直到發現‘$’字元停止傳送。由於迴圈次數事先不知道,但迴圈條件可以測試到。所以,採用先判斷後執行的結構比較適宜。程式段如下:

MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判斷是否為‘$’字元

SJMPLOOP2;是‘$’字元,轉結束LOOP1:MOVX@DPTR,A;不是‘$’字元,執行傳送

INCR0INCDPTRSJMPLOOP0;傳送下一數據

LOOP2:……

42

4.3.4副程式及其調用

一、副程式的調用在實際應用中,經常會遇到一些帶有通用性的問題,例如:數值轉換、數值計算等,在一個程式中可能要使用多次。這時可以將其設計成通用的副程式供隨時調用。副程式的結構與一般的程式並無多大區別,它的主要特點是,在執行過程中需要由其他程式來調用,執行完後又需要把執行流程返回到調用該副程式的主程序。副程式調用時要注意兩點:一是現場的保護和恢復;二是主程序與副程式的參數傳遞。43

二、現場保護與恢復在副程式執行過程中常常要用到單片機的一些通用單元,如工作寄存器R0~R7、累加器A、數據指針DPTR,以及有關標誌和狀態等。而這些單元中的內容在調用結束後的主程序中仍有用,所以需要進行保護,稱為現場保護。在執行完副程式,返回繼續執行主程序前恢復其原內容,稱為現場恢復。保護與恢復的方法有以下兩種:在主程序中實現;在副程式中實現。44

1、在主程序中實現示例如下:

PUSHPSW;保護現場

PUSHACC;

PUSHB;

MOVPSW,#10H;換當前工作寄存器組

LCALLaddr16;副程式調用

POPB;恢復現場

POPACC;

POPPSW;

……

其特點是結構靈活。45

2、在副程式中實現示例如下:SUB1:PUSHPSW;保護現場

PUSHACC;

PUSHB;

……MOVPSW,#10H;換當前工作寄存器組

……POPB;恢復現場

POPACC;

POPPSW;

RET其特點是程式規範、清晰。注意,無論哪種方法保護與恢復的順序要對應。46

三、參數傳遞

由於副程式是主程序的一部分,所以,在程式的執行時必然要發生數據上的聯繫。在調用副程式時,主程序應通過某種方式把有關參數(即副程式的入口參數)傳給副程式,當副程式執行完畢後,又需要通過某種方式把有關參數(即副程式的出口參數)傳給主程序。在80C51單片機中,傳遞參數的方法有三種:

1、利用累加器或寄存器在這種方式中,要把預傳遞的參數存放在累加器A或工作寄存器R0~R7中。即在主程序調用副程式時,應事先把子程式需要的數據送入累加器A或指定的工作寄存器中,當副程式執行時,可以從指定的單元中取得數據,執行運算。反之,副程式也可以用同樣的方法把結果傳送給主程序。47

例編寫程式,實現c=a2+b2。設a,b,c分別存於內部RAM的30H,31H,32H三個單元中。程式段如下:START:MOVA,30H;取aACALLSQR;調用查平方表

MOVR1,A;a2暫存於R1中

MOVA,31H;取bACALLSQR;調用查平方表

ADDA,R1;a2+b2存於A中

MOV32H,A;存結果

SJMP$SQR:MOVDPTR,#TAB;副程式

MOVCA,@A+DPTR;

RETTAB:DB0,1,4,9,16,25,36,49,64,81

48

2、利用記憶體當傳送的數據量比較大時,可以利用記憶體實現參數的傳遞。在這種方式中,事先要建立一個參數表,用指針指示參數表所在的位置。當參數表建立在內部RAM時,用R0或R1作參數表的指針。當參數表建立在外部RAM時,用DPTR作參數表的指針。

例將R0和R1指向的內部RAM中兩個3位元組無符號整數相加,結果送到由R0指向的內部RAM中。入口時,R0和R1分別指向加數和被加數的低位位元組;出口時,R0指向結果的高位位元組。低位元組在高地址,高位元組在低地址。

49

實現程式:NADD:MOVR7,#3;三位元組加法

CLRC;NADD1:MOVA,@R0;取加數低位元組

ADDCA,@R1;被加數低位元組加AMOV@R0,A;

DECR0DECR1DJNZR7,NADD1INCR0RET

50

3、利用堆疊利用堆疊傳遞參數是在副程式嵌套中常採用的一種方法。在調用副程式前,用PUSH指令將副程式中所需數據壓入堆疊,進入執行副程式時,再用POP指令從堆疊中彈出數據。

例把內部RAM中20H單元中的1個位元組十六進制數轉換為2位ASCII碼,存放在R0指示的兩個單元中。

51

MAIN:MOVA,20H;

SWAPAPUSHACC;參數入棧

ACALLHEASCPOPACCMOV@R0,A;存高位十六進制數轉換結果

INCR0;修改指針

PUSH20H;參數入棧

ACALLHEASCPOPACCMOV@R0,A;存低位十六進制數轉換結果

SJMP$HEASC:MOVR1,SP;借用R1為堆疊指針

DECR1DECR1;R1指向被轉換數據

XCHA,@R1;取被轉換數據

ANLA,#0FH;取一位十六進制數

ADDA,#2;偏移量調整,所加值為MOVC與DB間位元組數

MOVCA,@A+PC;查表

XCHA,@R1;1位元組指令,存結果於堆疊

RET;1位元組指令ASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H

52

一般說來:當相互傳遞的數據較少時,採用寄存器傳遞方式可以獲得較快的傳遞速度;當相互傳遞的數據較多時,宜採用記憶體或堆疊方式傳遞;如果是副程式嵌套時,最好是採用堆疊方式。53

4.4常用程式舉例4.4.1算術運算程式一、多位元組數的加、減運算

80C51單片機的指令系統提供的是位元組運算指令,所以在處理多位元組數的加減運算時,要合理地運用進位(借位)標誌。例多位元組無符號數的加法。設兩個N位元組的無符號數分別存放在內部RAM中以DATA1和DATA2開始的單元中。相加後的結果要求存放在DATA2數據區。54

MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N; 置位元組數

CLRC;LOOP:MOVA,@R0;

ADDCA,@R1;求和

MOV@R1,A;存結果

INCR0;修改指針

INCR1;

DJNZR7,LOOP;55

二、多位元組數乘法運算例雙位元組無符號數的乘法。設雙位元組的無符號被乘數存放在R3、R2中,乘數存放在R5、R4中,R0指向積的高位。

56

例多位元組無符號數的減法。

設兩個N位元組的無符號數分別存放在內部RAM中以DATA1和DATA2開始的單元中。相減後的結果要求存放在DATA2數據區。

MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N;置位元組數

CLRC;LOOP:MOVA,@R0;

SUBBA,@R1;求差

MOV@R1,A;存結果

INCR0;修改指針

INCR1;

DJNZR7,LOOP;57

主程序段如下:MULTB:MOVR7,#04;結果單元清0LOOP:MOV@R0,#00H;

DJNZR7,LOOP;

DECR0ACALLBMUL;

SJMP$另有2段子程式:

BMULRADD(在BMUL中被調用)58

先看副程式段:

RADD:ADDA,@R0;

MOV@R0,A;

MOVA,B;

INCR0;

ADDCA,@R0;

MOV@R0,A;

INCR0;

MOVA,@R0;

ADDCA,#00H;加進位

MOV@R0,A;

RET59

BMUL:MOVA,R2;

MOVB,R4;

MULAB;低位乘

ACALLRADD;

MOVA,R2;

MOVB,R5;

MULAB;交叉乘

DECR0;

ACALLRADD;

MOVA,R4;

MOVB,R3;

MULAB;交叉乘

DECR0;

DECR0;

ACALLRADD;

MOVA,R5;

MOVB,R3;

MULAB;高位元組乘

DECR0;

ACALLRADD;

DECR0RET60

一、十六進制數與ASCII碼間的轉換

十六進制數與ASCII碼的對應關係如表所示。當十六進制數在0~9之間時,其對應的ASCII碼值為該十六進制數加30H;當十六進制數在A~F之間時,其對應的ASCII碼值為該十六進制數加37H。4.4.2碼型轉換

61

例將1位十六進制數轉換成相應的ASCII碼。設十六進制數存放在R0中,轉換後的ASCII碼存放於R2中。實現程式如下:HASC:MOVA,R0;取4位二進位數

ANLA,#0FH;遮罩掉高4位

PUSHACC;4位二進位數入棧

CLRC;清進(借)位位

SUBBA,#0AH;用借位位的狀態判斷該數在0~9還是A~F之間

POPACC;彈出原4位二進位數

JCLOOP;借位位為1,跳轉至LOOPADDA,#07H;借位位為0,該數在A~F之間,加37HLOOP:ADDA,#30H;該數在0~9之間,加30HMOVR2,A;ASCII碼存於R2RET

62

例將多位十六進制數轉換成ASCII碼。設地址指針R0指向十六進制數低位,R2中存放位元組數,轉換後地址指針R0指向十六進制數的高位。R1指向要存放的ASCII碼的高位地址。實現程式如下:63

HTASC:MOVA,@R0;取低4位二進位數

ANLA,#0FH;

ADDA,#15;偏移量修正

MOVCA,@A+PC;查表

MOV@R1,A;存ASCII碼

INCR1;

MOVA,@R0;取十六進制高4位

SWAPAANLA,#0FH;

ADDA,#06H;偏移值修正

MOVCA,@A+PC;

MOV@R1,AINCR0;指向下一單元

INCR1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论