?? mcs-51單片機實用子程序庫.txt
字號:
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV ;運算成功
RET
(12) 標號: SH2功能:雙字節二進制無符號數開平方(快速)
入口條件:被開方數在R2、R3中。
出口信息:平方根仍在R2、R3中,整數部分的位數為原數的一半,其余為小數。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET ;被開方數為零,不必運算
SH20: MOV R7,#0 ;左規次數初始化
MOV A,R2
SH22: ANL A,#0C0H ;被開方數高字節小于40H否?
JNZ SQRH ;不小于40H,左規格化完成,轉開方過程
CLR C ;每左規一次,被開方數左移兩位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;左規次數加一
SJMP SH22 ;繼續左規
(13) 標號: SH4功能:四字節二進制無符號數開平方(快速)
入口條件:被開方數在R2、R3、R4、R5中。
出口信息:平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET ;被開方數為零,不必運算
SH40: MOV R7,#0 ;左規次數初始化
MOV A,R2
SH41: ANL A,#0C0H ;被開方數高字節小于40H否?
JNZ SQRH ;不小于40H,左規格化完成
MOV R6,#2 ;每左規一次,被開方數左移兩位
SH42: CLR C ;被開方數左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 ;被開方數左移完兩位
INC R7 ;左規次數加一
SJMP SH41 ;繼續左規
SQRH: MOV A,R2 ;規格化后高字節按折線法分為三個區間
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一區間的斜率
MOV R4,#80H ;第一區間的平方根基數
SJMP SQR3
SQR1: MOV B,#0B2H ;第二區間的斜率
MOV R4,#0A0H;第二區間的平方根基數
SJMP SQR3
SQR2: MOV B,#8DH ;第三區間的斜率
MOV R4,#0D0H;第三區間的平方根基數
SQR3: MUL AB ;與區間基點的偏移量乘區間斜率
MOV A,B
ADD A,R4 ;累加到平方根的基數上
MOV R4,A
MOV B,A
MUL AB ;求當前平方根的冪
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用減奇數法校正一個字節的平方根
MOV A,R4 ;當前平方根的兩倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于該奇數否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正結束,已達到一個字節的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
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 ;讀取第一個數據
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -