?? mcs-51單片機實用子程序庫.htm
字號:
R3,A<BR>CLR C<BR>MOV A,R5<BR>SUBB A,R2<BR>JB F0,SQR7<BR>JC
SQR8<BR>SQR7: MOV R5,A<BR>INC R3<BR>SQR8: CLR C<BR>MOV A,R5<BR>RLC
A<BR>MOV R5,A<BR>MOV F0,C<BR>DJNZ R4,SQR6 ;根的第二字節計算完,在R3中<BR>MOV
A,R7 ;取原被開方數的左規次數<BR>JZ SQRE ;未左規,開方結束<BR>SQR9: CLR C
;按左規次數右移平方根,得到實際根<BR>MOV A,R2<BR>RRC A<BR>MOV R2,A<BR>MOV
A,R3<BR>RRC A<BR>MOV R3,A<BR>DJNZ R7,SQR9<BR>SQRE: RET<BR> <BR>(14)
標號: HASC
功能:單字節十六進制數轉換成雙字節ASCII碼<BR><BR>入口條件:待轉換的單字節十六進制數在累加器A中。<BR>出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。<BR>影響資源:PSW、A、B
堆棧需求: 4字節<BR>HASC: MOV B,A ;暫存待轉換的單字節十六進制數<BR>LCALL HAS1
;轉換低四位<BR>XCH A,B ;存放低四位的ASCII碼<BR>SWAP A ;準備轉換高四位<BR>HAS1: ANL
A,#0FH ;將累加器的低四位轉換成ASCII碼<BR>ADD A,#90H<BR>DA A<BR>ADDC A,#40H<BR>DA
A<BR>RET<BR> <BR>(15) 標號: ASCH
功能:ASCII碼轉換成十六進制數<BR><BR>入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。<BR>出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。<BR>影響資源:PSW、A
堆棧需求: 2字節<BR>ASCH: CLR C<BR>SUBB A,#30H<BR>JNB ACC.4,ASH1<BR>SUBB
A,#7<BR>ASH1: RET<BR> <BR>(16) 標號:HBCD
功能:單字節十六進制整數轉換成單字節BCD碼整數<BR><BR>入口條件:待轉換的單字節十六進制整數在累加器A中。<BR>出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。<BR>影響資源:PSW、A、B、R3
堆棧需求: 2字節<BR>HBCD: MOV B,#100 ;分離出百位,存放在R3中<BR>DIV AB<BR>MOV
R3,A<BR>MOV A,#10 ;余數繼續分離十位和個位<BR>XCH A,B<BR>DIV AB<BR>SWAP A<BR>ORL
A,B ;將十位和個位拼裝成BCD碼<BR>RET<BR> <BR>(17) 標號: HB2
功能:雙字節十六進制整數轉換成雙字節BCD碼整數<BR><BR>入口條件:待轉換的雙字節十六進制整數在R6、R7中。<BR>出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。<BR>影響資源:PSW、A、R2~R7
堆棧需求: 2字節<BR>HB2: CLR A ;BCD碼初始化<BR>MOV R3,A<BR>MOV R4,A<BR>MOV
R5,A<BR>MOV R2,#10H ;轉換雙字節十六進制整數<BR>HB3: MOV A,R7
;從高端移出待轉換數的一位到CY中<BR>RLC A<BR>MOV R7,A<BR>MOV A,R6<BR>RLC A<BR>MOV
R6,A<BR>MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2<BR>ADDC A,R5<BR>DA A
;十進制調整<BR>MOV R5,A<BR>MOV A,R4<BR>ADDC A,R4<BR>DA A<BR>MOV
R4,A<BR>MOV A,R3<BR>ADDC A,R3<BR>MOV R3,A
;雙字節十六進制數的萬位數不超過6,不用調整<BR>DJNZ R2,HB3 ;處理完16bit<BR>RET <BR> <BR>(18)
標號: HBD
功能:單字節十六進制小數轉換成單字節BCD碼小數<BR><BR>入口條件:待轉換的單字節十六進制小數在累加器A中。<BR>出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。<BR>影響資源:PSW、A、B
堆棧需求: 2字節<BR>HBD: MOV B,#100 ;原小數擴大一百倍<BR>MUL AB<BR>RLC A
;余數部分四舍五入<BR>CLR A<BR>ADDC A,B<BR>MOV B,#10 ;分離出十分位和百分位<BR>DIV
AB<BR>SWAP A<BR>ADD A,B ;拼裝成單字節BCD碼小數<BR>DA A
;調整后若有進位,原小數接近整數1<BR>RET<BR> <BR>(19) 標號: HBD2
功能:雙字節十六進制小數轉換成雙字節BCD碼小數<BR><BR>入口條件:待轉換的雙字節十六進制小數在R2、R3中。<BR>出口信息:轉換后的雙字節BCD碼小數仍在R2、R3中。<BR>影響資源:PSW、A、B、R2、R3、R4、R5
堆棧需求: 6字節<BR>HBD2: MOV R4,#4 ;四位十進制碼<BR>HBD3: MOV A,R3
;原小數擴大十倍<BR>MOV B,#10<BR>MUL AB<BR>MOV R3,A<BR>MOV R5,B<BR>MOV
A,R2<BR>MOV B,#10<BR>MUL AB<BR>ADD A,R5<BR>MOV R2,A<BR>CLR A<BR>ADDC
A,B<BR>PUSH ACC ;保存溢出的一位十進制碼<BR>DJNZ R4,HBD3 ;計算完四位十進制碼<BR>POP ACC
;取出萬分位<BR>MOV R3,A<BR>POP ACC ;取出千分位<BR>SWAP A<BR>ORL A,R3
;拼裝成低字節BCD碼小數<BR>MOV R3,A<BR>POP ACC ;取出百分位<BR>MOV R2,A<BR>POP ACC
;取出十分位<BR>SWAP A<BR>ORL A,R2 ;拼裝成高字節BCD碼小數<BR>MOV R2,A
<BR>RET<BR> <BR>(20)標號:BCDH
功能:單字節BCD碼整數轉換成單字節十六進制整數<BR><BR>入口條件:待轉換的單字節BCD碼整數在累加器A中。<BR>出口信息:轉換后的單字節十六進制整數仍在累加器A中。<BR>影響資源:PSW、A、B、R4
堆棧需求: 2字節<BR>BCDH: MOV B,#10H ;分離十位和個位<BR>DIV AB<BR>MOV R4,B
;暫存個位<BR>MOV B,#10 ;將十位轉換成十六進制<BR>MUL AB<BR>ADD A,R4
;按十六進制加上個位<BR>RET<BR> <BR>(21)標號: BH2
功能:雙字節BCD碼整數轉換成雙字節十六進制整數<BR><BR>入口條件:待轉換的雙字節BCD碼整數在R2、R3中。<BR>出口信息:轉換后的雙字節十六進制整數仍在R2、R3中。<BR>影響資源:PSW、A、B、R2、R3、R4
堆棧需求: 4字節<BR>BH2: MOV A,R3 ;將低字節轉換成十六進制<BR>LCALL BCDH<BR>MOV
R3,A<BR>MOV A,R2 ;將高字節轉換成十六進制<BR>LCALL BCDH<BR>MOV B,#100
;擴大一百倍<BR>MUL AB<BR>ADD A,R3 ;和低字節按十六進制相加<BR>MOV R3,A<BR>CLR
A<BR>ADDC A,B<BR>MOV R2,A<BR>RET<BR> <BR>(22)標號: BHD
功能:單字節BCD碼小數轉換成單字節十六進制小數<BR><BR>入口條件:待轉換的單字節BCD碼數在累加器A中。<BR>出口信息:轉換后的單字節十六進制小數仍在累加器A中。<BR>影響資源:PSW、A、R2、R3
堆棧需求: 2字節<BR>BHD: MOV R2,#8 ;準備計算一個字節小數<BR>BHD0: ADD A,ACC
;按十進制倍增<BR>DA A<BR>XCH A,R3<BR>RLC A ;將進位標志移入結果中<BR>XCH A,R3<BR>DJNZ
R2,BHD0 ;共計算8bit小數<BR>ADD A,#0B0H ;剩余部分達到0.50否?<BR>JNC BHD1
;四舍<BR>INC R3 ;五入<BR>BHD1: MOV A,R3 ;取結果<BR>RET<BR> <BR>(23)標號: BHD2
功能:雙字節BCD碼小數轉換成雙字節十六進制小數<BR><BR>入口條件:待轉換的雙字節BCD碼小數在R4、R5中。<BR>出口信息:轉換后的雙字節十六進制小數在R2、R3中。*<BR>影響資源:PSW、A、R2~R6
堆棧需求: 2字節<BR>BHD2: MOV R6,#10H ;準備計算兩個字節小數<BR>BHD3: MOV A,R5
;按十進制倍增<BR>ADD A,R5<BR>DA A<BR>MOV R5,A<BR>MOV A,R4<BR>ADDC
A,R4<BR>DA A<BR>MOV R4,A<BR>MOV A,R3 ;將進位標志移入結果中<BR>RLC A<BR>MOV
R3,A<BR>MOV A,R2<BR>RLC A<BR>MOV R2,A<BR>DJNZ R6,BHD3
;共計算16bit小數<BR>MOV A,R4<BR>ADD A,#0B0H ;剩余部分達到0.50否?<BR>JNC BHD4
;四舍<BR>INC R3 ;五入<BR>MOV A,R3<BR>JNZ BHD4<BR>INC R2<BR>BHD4:
RET<BR> <BR>(24) 標號: MM
功能:求單字節十六進制無符號數據塊的極值<BR><BR>入口條件:數據塊的首址在DPTR中,數據個數在R7中。<BR>出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。<BR>影響資源:PSW、A、B、R1~R7
堆棧需求: 4字節<BR>MM: MOV B,R7 ;保存數據個數<BR>MOVX A,@DPTR ;讀取第一個數據<BR>MOV
R6,A ;作為最大值的初始值<BR>MOV R7,A ;也作為最小值的初始值<BR>MOV A,DPL
;取第一個數據的地址<BR>MOV R3,A ;作為最大值存放地址的初始值<BR>MOV R5,A
;也作為最小值存放地址的初始值<BR>MOV A,DPH<BR>MOV R2,A<BR>MOV R4,A<BR>MOV A,B
;取數據個數<BR>DEC A ;減一,得到需要比較的次數<BR>JZ MME ;只有一個數據,不需要比較<BR>MOV R1,A
;保存比較次數<BR>PUSH DPL ;保護數據塊的首址<BR>PUSH DPH<BR>MM1: INC DPTR
;指向一個新的數據<BR>MOVX A,@DPTR ;讀取這個數據<BR>MOV B,A ;保存<BR>SETB C
;與最大值比較<BR>SUBB A,R6<BR>JC MM2 ;不超過當前最大值,保持當前最大值<BR>MOV R6,B
;超過當前最大值,更新最大值存放地址<BR>MOV R2,DPH ;同時更新最大值存放地址<BR>MOV R3,DPL<BR>SJMP
MM3<BR>MM2: MOV A,B ;與最小值比較<BR>CLR C<BR>SUBB A,R7<BR>JNC MM3
;大于或等于當前最小值,保持當前最小值<BR>MOV R7,B ;更新最小值<BR>MOV R4,DPH
;更新最小值存放地址<BR>MOV R5,DPL<BR>MM3: DJNZ R1,MM1 ;處理完全部數據<BR>POP DPH
;恢復數據首址<BR>POP DPL<BR>MME: RET<BR> <BR>(25) 標號: MMS
功能:求單字節十六進制有符號數據塊的極值<BR><BR>入口條件:數據塊的首址在DPTR中,數據個數在R7中。<BR>出口信息:最大值在R6中,
地址在R2R3中;最小值在R7中,地址在R4R5中。<BR>影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節<BR>MMS:
MOV B,R7 ;保存數據個數<BR>MOVX A,@DPTR ;讀取第一個數據<BR>MOV R6,A
;作為最大值的初始值<BR>MOV R7,A ;也作為最小值的初始值<BR>MOV A,DPL ;取第一個數據的地址<BR>MOV
R3,A ;作為最大值存放地址的初始值<BR>MOV R5,A ;也作為最小值存放地址的初始值<BR>MOV A,DPH<BR>MOV
R2,A<BR>MOV R4,A<BR>MOV A,B ;取數據個數<BR>DEC A ;減一,得到需要比較的次數<BR>JZ MMSE
;只有一個數據,不需要比較<BR>MOV R1,A ;保存比較次數<BR>PUSH DPL ;保護數據塊的首址<BR>PUSH
DPH<BR>MMS1: INC DPTR ;調整數據指針<BR>MOVX A,@DPTR ;讀取一個數據<BR>MOV B,A
;保存<BR>SETB C ;與最大值比較<BR>SUBB A,R6<BR>JZ MMS4 ;相同,不更新最大值<BR>JNB
OV,MMS2 ;差未溢出,符號位有效<BR>CPL ACC.7 ;差溢出,符號位取反<BR>MMS2: JB
ACC.7,MMS4;差為負,不更新最大值<BR>MOV R6,B ;更新最大值<BR>MOV R2,DPH
;更新最大值存放地址<BR>MOV R3,DPL<BR>SJMP MMS7<BR>MMS4: MOV A,B
;與最小值比較<BR>CLR C<BR>SUBB A,R7<BR>JNB OV,MMS6 ;差未溢出,符號位有效<BR>CPL
ACC.7 ;差溢出,符號位取反<BR>MMS6: JNB ACC.7,MMS7;差為正,不更新最小值<BR>MOV R7,B
;更新最小值<BR>MOV R4,DPH ;更新最小值存放地址<BR>MOV R5,DPL<BR>MMS7: DJNZ R1,MMS1
;處理完全部數據<BR>POP DPH ;恢復數據首址<BR>POP DPL<BR>MMSE: RET <BR> <BR>(26)
標號: FDS1
功能:順序查找(ROM)單字節表格<BR><BR>入口條件:待查找的內容在A中,表格首址在DPTR中,表格的字節數在R7中。<BR>出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。<BR>影響資源:PSW、A、B、R2、R6
堆棧需求: 2字節<BR>FDS1: MOV B,A ;保存待查找的內容<BR>MOV R2,#0
;順序號初始化(指向表首)<BR>MOV A,R7 ;保存表格的長度<BR>MOV R6,A<BR>FD11: MOV A,R2
;按順序號讀取表格內容<BR>MOVC A,@A+DPTR<BR>CJNE A,B,FD12;與待查找的內容比較<BR>CLR OV
;相同,查找成功<BR>MOV A,R2 ;取對應的順序號<BR>RET <BR>FD12: INC R2
;指向表格中的下一個內容<BR>DJNZ R6,FD11 ;查完全部表格內容<BR>SETB OV
;未查找到,失敗<BR>RET<BR> <BR>(27) 標號: FDS2
功能:順序查找(ROM)雙字節表格<BR><BR>入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據總個數在R7中。<BR>出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。<BR>影響資源:PSW、A、R2、R6、DPTR
堆棧需求: 2字節<BR>FDS2: MOV A,R7 ;保存表格中數據的個數<BR>MOV R6,A<BR>MOV R2,#0
;順序號初始化(指向表首)<BR>FD21: CLR A ;讀取表格內容的高字節<BR>MOVC A,@A+DPTR<BR>XRL
A,R4 ;與待查找內容的高字節比較<BR>JNZ FD22<BR>MOV A,#1 ;讀取表格內容的低字節<BR>MOVC
A,@A+DPTR<BR>XRL A,R5 ;與待查找內容的低字節比較<BR>JNZ FD22<BR>CLR OV
;相同,查找成功<BR>MOV A,R2 ;取對應的順序號<BR>RET <BR>FD22: INC DPTR
;指向下一個數據<BR>INC DPTR<BR>INC R2 ;順序號加一<BR>DJNZ R6,FD21
;查完全部數據<BR>SETB OV ;未查找到,失敗<BR>RET<BR> <BR>(28) 標號:FDD1
功能:對分查找(ROM)單字節無符號增序數據表格<BR><BR><BR>入口條件:待查找的內容在累加器A中,表格首址在DPTR中,字節數在R7中。<BR>出口信息:OV=0
時,順序號在累加器A中;OV=1 時,未找到。<BR>影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節<BR>FDD1:
MOV B,A ;保存待查找的內容<BR>MOV R2,#0 ;區間低端指針初始化(指向第一個數據)<BR>MOV
A,R7<BR>DEC A<BR>MOV R3,A ;區間高端指針初始化(指向最后一個數據)<BR>FD61: CLR C
;判斷區間大小<BR>MOV A,R3<BR>SUBB A,R2<BR>JC FD69 ;區間消失,查找失敗<BR>RRC A
;取區間大小的一半<BR>ADD A,R2 ;加上區間的低端<BR>MOV R4,A ;得到區間的中心<BR>MOVC
A,@A+DPTR;讀取該點的內容<BR>CJNE A,B,FD65;與待查找的內容比較<BR>CLR OV
;相同,查找成功<BR>MOV A,R4 ;取順序號<BR>RET <BR>FD65: JC FD68
;該點的內容比待查找的內容大否?<BR>MOV A,R4 ;偏大,取該點位置<BR>DEC A ;減一<BR>MOV R3,A
;作為新的區間高端<BR>SJMP FD61 ;繼續查找<BR>FD68: MOV A,R4 ;偏小,取該點位置<BR>INC A
;加一<BR>MOV R2,A ;作為新的區間低端<BR>SJMP FD61 ;繼續查找<BR>FD69: SETB OV
;查找失敗<BR>RET<BR> <BR>(29) 標號:FDD2
功能:對分查找(ROM)雙字節無符號增序數據表格<BR><BR>入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。<BR>出口信息:OV=0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -