?? 實用子程序庫.txt
字號:
MOV R3,B
SJMP SQR4 ;繼續校正
SQR5: MOV A,R4 ;將一個字節精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最終偏移量的最高位
MOV A,R3
MOV R5,A ;將最終偏移量的低八位存入R5中
MOV R4,#8 ;通過(R5R6/R2)求根的低字節
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字節計算完,在R3中
MOV A,R7 ;取原被開方數的左規次數
JZ SQRE ;未左規,開方結束
SQR9: CLR C ;按左規次數右移平方根,得到實際根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
(14) 標號: HASC 功能:單字節十六進制數轉換成雙字節ASCII碼
入口條件:待轉換的單字節十六進制數在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
影響資源:PSW、A、B 堆棧需求: 4字節
HASC: MOV B,A ;暫存待轉換的單字節十六進制數
LCALL HAS1 ;轉換低四位
XCH A,B ;存放低四位的ASCII碼
SWAP A ;準備轉換高四位
HAS1: ANL A,#0FH ;將累加器的低四位轉換成ASCII碼
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 標號: ASCH 功能:ASCII碼轉換成十六進制數
入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。
出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。
影響資源:PSW、A 堆棧需求: 2字節
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
(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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -