⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 MCS-51定点运算子程序库及其使用说明.txt

📁 MCS-51定点运算子程序库及其使用说明 对这方面不了解的朋友可以看哈
💻 TXT
📖 第 1 页 / 共 3 页
字号:

入口条件:被开方数在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	;读取第一个数据
	MOV	R6,A	;作为最大值的初始值
	MOV	R7,A	;也作为最小值的初始值
	MOV	A,DPL	;取第一个数据的地址
	MOV	R3,A	;作为最大值存放地址的初始值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -