?? MCS-51單片機實用子程序庫(96年版).txt
字號:
RLC A
MOV R2,A
DJNZ R6,SH42 ;被開方數(shù)左移完兩位
INC R7 ;左規(guī)次數(shù)加一
SJMP SH41 ;繼續(xù)左規(guī)
SQRH MOV A,R2 ;規(guī)格化后高字節(jié)按折線法分為三個區(qū)間
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一區(qū)間的斜率
MOV R4,#80H ;第一區(qū)間的平方根基數(shù)
SJMP SQR3
SQR1 MOV B,#0B2H ;第二區(qū)間的斜率
MOV R4,#0A0H;第二區(qū)間的平方根基數(shù)
SJMP SQR3
SQR2 MOV B,#8DH ;第三區(qū)間的斜率
MOV R4,#0D0H;第三區(qū)間的平方根基數(shù)
SQR3 MUL AB ;與區(qū)間基點的偏移量乘區(qū)間斜率
MOV A,B
ADD A,R4 ;累加到平方根的基數(shù)上
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 ;用減奇數(shù)法校正一個字節(jié)的平方根
MOV A,R4 ;當前平方根的兩倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于該奇數(shù)否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正結(jié)束,已達到一個字節(jié)的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;繼續(xù)校正
SQR5 MOV A,R4 ;將一個字節(jié)精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最終偏移量的最高位
MOV A,R3
MOV R5,A ;將最終偏移量的低八位存入R5中
MOV R4,#8 ;通過(R5R6/R2)求根的低字節(jié)
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 ;根的第二字節(jié)計算完,在R3中
MOV A,R7 ;取原被開方數(shù)的左規(guī)次數(shù)
JZ SQRE ;未左規(guī),開方結(jié)束
SQR9 CLR C ;按左規(guī)次數(shù)右移平方根,得到實際根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE RET
(14) 標號: HASC 功能:單字節(jié)十六進制數(shù)轉(zhuǎn)換成雙字節(jié)ASCII碼
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制數(shù)在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
影響資源:PSW、A、B 堆棧需求: 4字節(jié)
HASC MOV B,A ;暫存待轉(zhuǎn)換的單字節(jié)十六進制數(shù)
LCALL HAS1 ;轉(zhuǎn)換低四位
XCH A,B ;存放低四位的ASCII碼
SWAP A ;準備轉(zhuǎn)換高四位
HAS1 ANL A,#0FH ;將累加器的低四位轉(zhuǎn)換成ASCII碼
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 標號: ASCH 功能:ASCII碼轉(zhuǎn)換成十六進制數(shù)
入口條件:待轉(zhuǎn)換的ASCII碼(30H~39H或41H~46H)在A中。
出口信息:轉(zhuǎn)換后的十六進制數(shù)(00H~0FH)仍在累加器A中。
影響資源:PSW、A 堆棧需求: 2字節(jié)
ASCH CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1 RET
(16) 標號:HBCD 功能:單字節(jié)十六進制整數(shù)轉(zhuǎn)換成單字節(jié)BCD碼整數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制整數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的BCD碼整數(shù)(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3 堆棧需求: 2字節(jié)
HBCD MOV B,#100 ;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數(shù)繼續(xù)分離十位和個位
XCH A,B
DIV AB
SWAP A
ORL A,B ;將十位和個位拼裝成BCD碼
RET
(17) 標號: HB2 功能:雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制整數(shù)在R6、R7中。
出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
HB2 CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
HB3 MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調(diào)整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
RET
(18) 標號: HBD 功能:單字節(jié)十六進制小數(shù)轉(zhuǎn)換成單字節(jié)BCD碼小數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制小數(shù)在累加器A中。
出口信息:CY=0時轉(zhuǎn)換后的BCD碼小數(shù)仍在A中。CY=1時原小數(shù)接近整數(shù)1。
影響資源:PSW、A、B 堆棧需求: 2字節(jié)
HBD MOV B,#100 ;原小數(shù)擴大一百倍
MUL AB
RLC A ;余數(shù)部分四舍五入
CLR A
ADDC A,B
MOV B,#10 ;分離出十分位和百分位
DIV AB
SWAP A
ADD A,B ;拼裝成單字節(jié)BCD碼小數(shù)
DA A ;調(diào)整后若有進位,原小數(shù)接近整數(shù)1
RET
(19) 標號: HBD2 功能:雙字節(jié)十六進制小數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼小數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制小數(shù)在R2、R3中。
出口信息:轉(zhuǎn)換后的雙字節(jié)BCD碼小數(shù)仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節(jié)
HBD2 MOV R4,#4 ;四位十進制碼
HBD3 MOV A,R3 ;原小數(shù)擴大十倍
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 ;拼裝成低字節(jié)BCD碼小數(shù)
MOV R3,A
POP ACC ;取出百分位
MOV R2,A
POP ACC ;取出十分位
SWAP A
ORL A,R2 ;拼裝成高字節(jié)BCD碼小數(shù)
MOV R2,A
RET
(20)標號:BCDH 功能:單字節(jié)BCD碼整數(shù)轉(zhuǎn)換成單字節(jié)十六進制整數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼整數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的單字節(jié)十六進制整數(shù)仍在累加器A中。
影響資源:PSW、A、B、R4 堆棧需求: 2字節(jié)
BCDH MOV B,#10H ;分離十位和個位
DIV AB
MOV R4,B ;暫存?zhèn)€位
MOV B,#10 ;將十位轉(zhuǎn)換成十六進制
MUL AB
ADD A,R4 ;按十六進制加上個位
RET
(21)標號: BH2 功能:雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進制整數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。
出口信息:轉(zhuǎn)換后的雙字節(jié)十六進制整數(shù)仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節(jié)
BH2 MOV A,R3 ;將低字節(jié)轉(zhuǎn)換成十六進制
LCALL BCDH
MOV R3,A
MOV A,R2 ;將高字節(jié)轉(zhuǎn)換成十六進制
LCALL BCDH
MOV B,#100 ;擴大一百倍
MUL AB
ADD A,R3 ;和低字節(jié)按十六進制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)標號: BHD 功能:單字節(jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進制小數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的單字節(jié)十六進制小數(shù)仍在累加器A中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié)
BHD MOV R2,#8 ;準備計算一個字節(jié)小數(shù)
BHD0 ADD A,ACC ;按十進制倍增
DA A
XCH A,R3
RLC A ;將進位標志移入結(jié)果中
XCH A,R3
DJNZ R2,BHD0 ;共計算8bit小數(shù)
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1 MOV A,R3 ;取結(jié)果
RET
(23)標號: BHD2 功能:雙字節(jié)BCD碼小數(shù)轉(zhuǎn)換成雙字節(jié)十六進制小數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼小數(shù)在R4、R5中。
出口信息:轉(zhuǎn)換后的雙字節(jié)十六進制小數(shù)在R2、R3中。
影響資源:PSW、A、R2~R6 堆棧需求: 2字節(jié)
BHD2 MOV R6,#10H ;準備計算兩個字節(jié)小數(shù)
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 ;將進位標志移入結(jié)果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共計算16bit小數(shù)
MOV A,R4
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4 RET
(24) 標號: MM 功能:求單字節(jié)十六進制無符號數(shù)據(jù)塊的極值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
MM MOV B,R7 ;保存數(shù)據(jù)個數(shù)
MOVX A,@DPTR ;讀取第一個數(shù)據(jù)
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數(shù)據(jù)的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MME ;只有一個數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護數(shù)據(jù)塊的首址
PUSH DPH
MM1 INC DPTR ;指向一個新的數(shù)據(jù)
MOVX A,@DPTR ;讀取這個數(shù)據(jù)
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 ;處理完全部數(shù)據(jù)
POP DPH ;恢復數(shù)據(jù)首址
POP DPL
MME RET
(25) 標號: MMS 功能:求單字節(jié)十六進制有符號數(shù)據(jù)塊的極值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
MMS MOV B,R7 ;保存數(shù)據(jù)個數(shù)
MOVX A,@DPTR ;讀取第一個數(shù)據(jù)
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數(shù)據(jù)的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MMSE ;只有一個數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護數(shù)據(jù)塊的首址
PUSH DPH
MMS1 INC DPTR ;調(diào)整數(shù)據(jù)指針
MOVX A,@DPTR ;讀取一個數(shù)據(jù)
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 ;處理完全部數(shù)據(jù)
POP DPH ;恢復數(shù)據(jù)首址
POP DPL
MMSE RET
(26) 標號: FDS1 功能:順序查找(ROM)單字節(jié)表格
入口條件:待查找的內(nèi)容在A中,表格首址在DPTR中,表格的字節(jié)數(shù)在R7中。
出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。
影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節(jié)
FDS1 MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;順序號初始化(指向表首)
MOV A,R7 ;保存表格的長度
MOV R6,A
FD11 MOV A,R2 ;按順序號讀取表格內(nèi)容
MOVC A,@A+DPTR
CJNE A,B,FD12;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R2 ;取對應(yīng)的順序號
RET
FD12 INC R2 ;指向表格中的下一個內(nèi)容
DJNZ R6,FD11 ;查完全部表格內(nèi)容
SETB OV ;未查找到,失敗
RET
(27) 標號: FDS2 功能:順序查找(ROM)雙字節(jié)表格
入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)總個數(shù)在R7中。
出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。
影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節(jié)
FDS2 MOV A,R7 ;保存表格中數(shù)據(jù)的個數(shù)
MOV R6,A
MOV R2,#0 ;順序號初始化(指向表首)
FD21 CLR A ;讀取表格內(nèi)容的高字節(jié)
MOVC A,@A+DPTR
XRL A,R4 ;與待查找內(nèi)容的高字節(jié)比較
JNZ FD22
MOV A,#1 ;讀取表格內(nèi)容的低字節(jié)
MOVC A,@A+DPTR
XRL A,R5 ;與待查找內(nèi)容的低字節(jié)比較
JNZ FD22
CLR OV ;相同,查找成功
MOV A,R2 ;取對應(yīng)的順序號
RET
FD22 INC DPTR ;指向下一個數(shù)據(jù)
INC DPTR
INC R2 ;順序號加一
DJNZ R6,FD21 ;查完全部數(shù)據(jù)
SETB OV ;未查找到,失敗
RET
(28) 標號:FDD1 功能:對分查找(ROM)單字節(jié)無符號增序數(shù)據(jù)表格
入口條件:待查找的內(nèi)容在累加器A中,表格首址在DPTR中,字節(jié)數(shù)在R7中。
出口信息:OV=0 時,順序號在累加器A中;OV=1 時,未找到。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節(jié)
FDD1 MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個數(shù)據(jù))
MOV A,R7
DEC A
MOV R3,A ;區(qū)間高端指針初始化(指向最后一個數(shù)據(jù))
FD61 CLR C ;判斷區(qū)間大小
MOV A,R3
SUBB A,R2
JC FD69 ;區(qū)間消失,查找失敗
RRC A ;取區(qū)間大小的一半
ADD A,R2 ;加上區(qū)間的低端
MOV R4,A ;得到區(qū)間的中心
MOVC A,@A+DPTR;讀取該點的內(nèi)容
CJNE A,B,FD65;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R4 ;取順序號
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -