(16) 標號:HBCD功能:單字節十六進制整數轉換成單字節BCD碼整數
入口條件:待轉換的單字節十六進制整數在累加器A中。
出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3 堆棧需求: 2字節
HBCD: MOV B,#100 ;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數繼續分離十位和個位
XCH A,B
DIV AB
SWAP A
ORL A,B ;將十位和個位拼裝成BCD碼
RET
(17) 標號: HB2功能:雙字節十六進制整數轉換成雙字節BCD碼整數
入口條件:待轉換的雙字節十六進制整數在R6、R7中。
出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit
RET
(18) 標號: HBD功能:單字節十六進制小數轉換成單字節BCD碼小數
入口條件:待轉換的單字節十六進制小數在累加器A中。
出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。
影響資源:PSW、A、B 堆棧需求: 2字節
HBD: MOV B,#100 ;原小數擴大一百倍
MUL AB
RLC A ;余數部分四舍五入
CLR A
ADDC A,B
MOV B,#10 ;分離出十分位和百分位
DIV AB
SWAP A
ADD A,B ;拼裝成單字節BCD碼小數
DA A ;調整后若有進位,原小數接近整數1
RET
(19) 標號: HBD2功能:雙字節十六進制小數轉換成雙字節BCD碼小數
入口條件:待轉換的雙字節十六進制小數在R2、R3中。
出口信息:轉換后的雙字節BCD碼小數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求:6字節
HBD2: MOV R4,#4 ;四位十進制碼
HBD3: MOV A,R3 ;原小數擴大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC ;保存溢出的一位十進制碼
DJNZ R4,HBD3 ;計算完四位十進制碼
POP ACC ;取出萬分位
MOV R3,A
POP ACC ;取出千分位
SWAP A
ORL A,R3 ;拼裝成低字節BCD碼小數
MOV R3,A
POP ACC ;取出百分位
MOV R2,A
POP ACC ;取出十分位
SWAP A
ORL A,R2 ;拼裝成高字節BCD碼小數
MOV R2,A
RET
(20)標號:BCDH功能:單字節BCD碼整數轉換成單字節十六進制整數
入口條件:待轉換的單字節BCD碼整數在累加器A中。
出口信息:轉換后的單字節十六進制整數仍在累加器A中。
影響資源:PSW、A、B、R4 堆棧需求: 2字節
BCDH: MOV B,#10H ;分離十位和個位
DIV AB
MOV R4,B ;暫存個位
MOV B,#10 ;將十位轉換成十六進制
MUL AB
ADD A,R4 ;按十六進制加上個位
RET
(21)標號: BH2功能:雙字節BCD碼整數轉換成雙字節十六進制整數
入口條件:待轉換的雙字節BCD碼整數在R2、R3中。
出口信息:轉換后的雙字節十六進制整數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求:4字節
BH2: MOV A,R3 ;將低字節轉換成十六進制
LCALL BCDH
MOV R3,A
MOV A,R2 ;將高字節轉換成十六進制
LCALL BCDH
MOV B,#100 ;擴大一百倍
MUL AB
ADD A,R3 ;和低字節按十六進制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)標號: BHD功能:單字節BCD碼小數轉換成單字節十六進制小數
入口條件:待轉換的單字節BCD碼數在累加器A中。
出口信息:轉換后的單字節十六進制小數仍在累加器A中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
BHD: MOV R2,#8 ;準備計算一個字節小數
BHD0: ADD A,ACC ;按十進制倍增
DA A
XCH A,R3
RLC A ;將進位標志移入結果中
XCH A,R3
DJNZ R2,BHD0 ;共計算8bit小數
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1: MOV A,R3 ;取結果
RET
(23)標號: BHD2功能:雙字節BCD碼小數轉換成雙字節十六進制小數
入口條件:待轉換的雙字節BCD碼小數在R4、R5中。
出口信息:轉換后的雙字節十六進制小數在R2、R3中。*
影響資源:PSW、A、R2~R6 堆棧需求: 2字節
BHD2: MOV R6,#10H ;準備計算兩個字節小數
BHD3: MOV A,R5 ;按十進制倍增
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3 ;將進位標志移入結果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共計算16bit小數
MOV A,R4
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4: RET
(24) 標號: MM功能:求單字節十六進制無符號數據塊的極值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:值在R6中,地址在R2R3中;小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
MM: 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 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
MCS-51單片機實用子程序庫(二)
更新時間: 2007-01-23 15:34:33來源: 粵嵌教育瀏覽量:1378