?? mcs-51單片機實用子程序庫.txt
字號:
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數據的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數據個數
DEC A ;減一,得到需要比較的次數
JZ MME ;只有一個數據,不需要比較
MOV R1,A ;保存比較次數
PUSH DPL ;保護數據塊的首址
PUSH DPH
MM1: INC DPTR ;指向一個新的數據
MOVX A,@DPTR ;讀取這個數據
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JC MM2 ;不超過當前最大值,保持當前最大值
MOV R6,B ;超過當前最大值,更新最大值存放地址
MOV R2,DPH ;同時更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNC MM3 ;大于或等于當前最小值,保持當前最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 ;處理完全部數據
POP DPH ;恢復數據首址
POP DPL
MME: RET
(25) 標號: MMS功能:求單字節十六進制有符號數據塊的極值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
MMS: MOV B,R7 ;保存數據個數
MOVX A,@DPTR ;讀取第一個數據
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數據的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數據個數
DEC A ;減一,得到需要比較的次數
JZ MMSE ;只有一個數據,不需要比較
MOV R1,A ;保存比較次數
PUSH DPL ;保護數據塊的首址
PUSH DPH
MMS1: INC DPTR ;調整數據指針
MOVX A,@DPTR ;讀取一個數據
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JZ MMS4 ;相同,不更新最大值
JNB OV,MMS2 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS2: JB ACC.7,MMS4;差為負,不更新最大值
MOV R6,B ;更新最大值
MOV R2,DPH ;更新最大值存放地址
MOV R3,DPL
SJMP MMS7
MMS4: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNB OV,MMS6 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MMS7: DJNZ R1,MMS1 ;處理完全部數據
POP DPH ;恢復數據首址
POP DPL
MMSE: RET
(26) 標號: FDS1功能:順序查找(ROM)單字節表格
入口條件:待查找的內容在A中,表格首址在DPTR中,表格的字節數在R7中。
出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。
影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節
FDS1: MOV B,A ;保存待查找的內容
MOV R2,#0 ;順序號初始化(指向表首)
MOV A,R7 ;保存表格的長度
MOV R6,A
FD11: MOV A,R2 ;按順序號讀取表格內容
MOVC A,@A+DPTR
CJNE A,B,FD12;與待查找的內容比較
CLR OV ;相同,查找成功
MOV A,R2 ;取對應的順序號
RET
FD12: INC R2 ;指向表格中的下一個內容
DJNZ R6,FD11 ;查完全部表格內容
SETB OV ;未查找到,失敗
RET
(27) 標號: FDS2功能:順序查找(ROM)雙字節表格
入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據總個數在R7中。
出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。
影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節
FDS2: MOV A,R7 ;保存表格中數據的個數
MOV R6,A
MOV R2,#0 ;順序號初始化(指向表首)
FD21: CLR A ;讀取表格內容的高字節
MOVC A,@A+DPTR
XRL A,R4 ;與待查找內容的高字節比較
JNZ FD22
MOV A,#1 ;讀取表格內容的低字節
MOVC A,@A+DPTR
XRL A,R5 ;與待查找內容的低字節比較
JNZ FD22
CLR OV ;相同,查找成功
MOV A,R2 ;取對應的順序號
RET
FD22: INC DPTR ;指向下一個數據
INC DPTR
INC R2 ;順序號加一
DJNZ R6,FD21 ;查完全部數據
SETB OV ;未查找到,失敗
RET
(28) 標號:FDD1功能:對分查找(ROM)單字節無符號增序數據表格
入口條件:待查找的內容在累加器A中,表格首址在DPTR中,字節數在R7中。
出口信息:OV=0 時,順序號在累加器A中;OV=1 時,未找到。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求:2字節
FDD1: MOV B,A ;保存待查找的內容
MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
MOV A,R7
DEC A
MOV R3,A ;區間高端指針初始化(指向最后一個數據)
FD61: CLR C ;判斷區間大小
MOV A,R3
SUBB A,R2
JC FD69 ;區間消失,查找失敗
RRC A ;取區間大小的一半
ADD A,R2 ;加上區間的低端
MOV R4,A ;得到區間的中心
MOVC A,@A+DPTR;讀取該點的內容
CJNE A,B,FD65;與待查找的內容比較
CLR OV ;相同,查找成功
MOV A,R4 ;取順序號
RET
FD65: JC FD68 ;該點的內容比待查找的內容大否?
MOV A,R4 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區間高端
SJMP FD61 ;繼續查找
FD68: MOV A,R4 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區間低端
SJMP FD61 ;繼續查找
FD69: SETB OV ;查找失敗
RET
(29) 標號:FDD2功能:對分查找(ROM)雙字節無符號增序數據表格
入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。
出口信息:OV=0 時順序號在累加器A中,址在DPTR中;OV=1 時未找到。
影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求:2字節
FDD2: MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
MOV A,R7
DEC A
MOV R3,A ;區間高端指針初始化,指向最后一個數據
MOV R6,DPH ;保存表格首址
MOV R7,DPL
FD81: CLR C ;判斷區間大小
MOV A,R3
SUBB A,R2
JC FD89 ;區間消失,查找失敗
RRC A ;取區間大小的一半
ADD A,R2 ;加上區間的低端
MOV R1,A ;得到區間的中心
MOV DPH,R6
CLR C ;計算區間中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A ;讀取該點的內容的高字節
MOVC A,@A+DPTR
MOV B,R4 ;與待查找內容的高字節比較
CJNE A,B,FD84;不相同
MOV A,#1 ;讀取該點的內容的低字節
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84;與待查找內容的低字節比較
MOV A,R1 ;取順序號
CLR OV ;查找成功
RET
FD84: JC FD86 ;該點的內容比待查找的內容大否?
MOV A,R1 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區間高端
SJMP FD81 ;繼續查找
FD86: MOV A,R1 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區間低端
SJMP FD81 ;繼續查找
FD89: MOV DPH,R6 ;相同,恢復首址
MOV DPL,R7
SETB OV ;查找失敗
RET
(30) 標號: DDM1功能:求單字節十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:平均值在累加器A中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節
DDM1: MOV A,R7 ;保存數據個數
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;讀取一個數據
ADD A,R5 ;累加到累加和中
MOV R5,A
JNC DM12
INC R4
DM12: INC DPTR ;調整指針
DJNZ R2,DM11 ;累加完全部數據
LCALL D457 ;求平均值(R4R5/R7-→R3)
MOV A,R3 ;取平均值
POP DPL
POP DPH
RET
(31) 標號: DDM2功能:求雙字節十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R7中。
出口信息:平均值在R4、R5中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節
DDM2: MOV A,R7 ;保存數據個數
MOV R2,A ;初始化數據指針
PUSH DPL ;保持首址
PUSH DPH
CLR A ;初始化累加和
MOV R3,A
MOV R4,A
MOV R5,A
DM20: MOVX A,@DPTR ;讀取一個數據的高字節
MOV B,A
INC DPTR
MOVX A,@DPTR ;讀取一個數據的低字節
INC DPTR
ADD A,R5 ;累加到累加和中
MOV R5,A
MOV A,B
ADDC A,R4
MOV R4,A
JNC DM21
INC R3
DM21: DJNZ R2,DM20 ;累加完全部數據
POP DPH ;恢復首址
POP DPL
LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值
(32) 標號: XR1功能:求單字節數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,數據的個數在R6、R7中。
出口信息:校驗和在累加器A中。
影響資源:PSW、A、B、R4~R7 堆棧需求: 2字節
XR1: MOV R4,DPH ;保存數據塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節計數器調整
JZ XR10
INC R6
XR10: MOV B,#0 ;校驗和初始化
XR11: MOVX A,@DPTR ;讀取一個數據
XRL B,A ;異或運算
INC DPTR ;指向下一個數據
DJNZ R7,XR11 ;雙字節計數器減一
DJNZ R6,XR11
MOV DPH,R4 ;恢復數據首址
MOV DPL,R5
MOV A,B ;取校驗和
RET
(33) 標號: XR2功能:求雙字節數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R6、R7中。
出口信息:校驗和在R2、R3中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節
XR2: MOV R4,DPH ;保存數據塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節計數器調整
JZ XR20
INC R6
XR20: CLR A ;校驗和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;讀取一個數據的高字節
XRL A,R2 ;異或運算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;讀取一個數據的低字節
XRL A,R3 ;異或運算
MOV R3,A
INC DPTR ;指向下一個數據
DJNZ R7,XR21 ;雙字節計數器減一
DJNZ R6,XR21
MOV DPH,R4 ;恢復數據首址
MOV DPL,R5
RET
(34) 標號: SORT功能:單字節無符號數據塊排序(增序)
入口條件:數據塊的首址在R0中,字節數在R7中。
出口信息:完成排序(增序)
影響資源:PSW、A、R2~R6 堆棧需求: 2字節
SORT: MOV A,R7
MOV R5,A ;比較次數初始化
SRT1: CLR F0 ;交換標志初始化
MOV A,R5 ;取上遍比較次數
DEC A ;本遍比上遍減少一次
MOV R5,A ;保存本遍次數
MOV R2,A ;復制到計數器中
JZ SRT5 ;若為零,排序結束
MOV A,R0 ;保存數據指針
MOV R6,A
SRT2: MOV A,@R0 ;讀取一個數據
MOV R3,A
INC R0 ;指向下一個數據
MOV A,@R0 ;再讀取一個數據
MOV R4,A
CLR C
SUBB A,R3 ;比較兩個數據的大小
JNC SRT4 ;順序正確(增序或相同),不必交換
SETB F0 ;設立交換標志
MOV A,R3 ;將兩個數據交換位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一個數據
SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數
MOV A,R6 ;恢復數據首址
MOV R0,A
JB F0,SRT1 ;本遍若進行過交換,則需繼續排序
SRT5: RET ;排序結束
END
(綜合電子論壇)
*注:部份文章為網上收錄供大家共同學習參考之用,并不代表本站意見。如存在版權問題請馬上通知我們,我們將馬上刪除。
Copyright AVRW.COM is Allright
粵ICP備05011569號
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -