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

📄 serial.src

📁 本人于2005年初开始准备将&micro C/OS-II嵌入式实时操作系统移植到8051单片机上
💻 SRC
📖 第 1 页 / 共 5 页
字号:
?C0044:
	MOV  	DPTR,#08H
	LJMP 	?C?ADDXBP
; END OF _?yyprintf

; 
; void PrintN(int n,int b) reentrant  //十进制显示整形数

	RSEG  ?PR?_?PrintN?SERIAL
_?PrintN:
	USING	0
			; SOURCE LINE # 383
	MOV  	DPTR,#0FFFEH
	LCALL	?C?ADDXBP
	MOV  	A,R4
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R5
	MOVX 	@DPTR,A
	MOV  	DPTR,#0FFFEH
	LCALL	?C?ADDXBP
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
; {
;     if(b==16){PrintWord(n);return;}
			; SOURCE LINE # 385
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,#010H
	ORL  	A,R6
	JNZ  	?C0072
	LCALL	L?0213
	SJMP 	?C0073
?C0072:
; 	if(n<0){PrintChar('-');n=-n;}
			; SOURCE LINE # 386
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	CLR  	C
	MOV  	A,R6
	XRL  	A,#080H
	SUBB 	A,#080H
	JNC  	?C0074
	MOV  	R7,#02DH
	LCALL	_?PrintChar
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	CLR  	A
	SUBB 	A,R7
	MOV  	R7,A
	CLR  	A
	SUBB 	A,R6
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
?C0074:
; 	if(n/b)
			; SOURCE LINE # 387
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	R5,AR3
	MOV  	R4,AR2
	LCALL	?C?SIDIV
	MOV  	A,R7
	ORL  	A,R6
	JZ   	?C0075
; 	    PrintN(n/b,b);
			; SOURCE LINE # 388
	MOV  	R5,AR3
	MOV  	R4,AR2
	LCALL	_?PrintN
?C0075:
; 	PrintChar(n%b+'0');
			; SOURCE LINE # 389
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?SIDIV
	MOV  	A,R5
	ADD  	A,#030H
	MOV  	R7,A
	LCALL	_?PrintChar
; }
			; SOURCE LINE # 390
?C0073:
	MOV  	DPTR,#04H
	LJMP 	?C?ADDXBP
; END OF _?PrintN

; 
; void PrintUN(unsigned int n,unsigned int b) reentrant  //十进制显示无符号整形数

	RSEG  ?PR?_?PrintUN?SERIAL
L?0210:
	USING	0
	MOV  	R4,#00H
L?0211:
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	LCALL	?C?ILDPTR
	MOV  	R7,A
	MOV  	R6,B
_?PrintUN:
	USING	0
			; SOURCE LINE # 392
	MOV  	DPTR,#0FFFEH
	LCALL	?C?ADDXBP
	MOV  	A,R4
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R5
	MOVX 	@DPTR,A
	MOV  	DPTR,#0FFFEH
	LCALL	?C?ADDXBP
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
; {
;     if(b==16){PrintWord(n);return;}
			; SOURCE LINE # 394
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,#010H
	ORL  	A,R6
	JNZ  	?C0076
	LCALL	L?0213
	SJMP 	?C0077
?C0076:
; 	if(n/b)
			; SOURCE LINE # 395
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	R5,AR3
	MOV  	R4,AR2
	LCALL	?C?UIDIV
	MOV  	A,R7
	ORL  	A,R6
	JZ   	?C0078
; 	    PrintUN(n/b,b);
			; SOURCE LINE # 396
	MOV  	R5,AR3
	MOV  	R4,AR2
	LCALL	_?PrintUN
?C0078:
; 	PrintChar(n%b+'0');
			; SOURCE LINE # 397
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	INC  	DPTR
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?UIDIV
	MOV  	A,R5
	ADD  	A,#030H
	MOV  	R7,A
	LCALL	_?PrintChar
; }
			; SOURCE LINE # 398
?C0077:
	MOV  	DPTR,#04H
	LJMP 	?C?ADDXBP
; END OF _?PrintUN

; 
; 
; void PrintLN(long n,long b) reentrant  //十进制显示长整形数

	RSEG  ?PR?_?PrintLN?SERIAL
_?PrintLN:
	USING	0
			; SOURCE LINE # 401
	MOV  	DPTR,#0FFFCH
	LCALL	?C?ADDXBP
	LCALL	?C?LSTXDATA
; {
;     if(b==16){PrintLong(n);return;}
			; SOURCE LINE # 403
	CLR  	A
	MOV  	R7,#010H
	MOV  	R6,A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	CLR  	C
	LCALL	?C?SLCMP
	JNZ  	?C0079
	LCALL	L?0212
	LJMP 	?C0080
?C0079:
; 	if(n<0){PrintChar('-');n=-n;}
			; SOURCE LINE # 404
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	A,R4
	RLC  	A
	JNC  	?C0081
	MOV  	R7,#02DH
	LCALL	_?PrintChar
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?LNEG
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	LCALL	?C?LSTXDATA
?C0081:
; 	if(n/b)
			; SOURCE LINE # 405
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?SLDIV
	MOV  	A,R4
	ORL  	A,R5
	ORL  	A,R6
	ORL  	A,R7
	JZ   	?C0082
; 	    PrintLN(n/b,b);
			; SOURCE LINE # 406
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#0FFFCH
	LCALL	?C?ADDXBP
	LCALL	?C?LSTXDATA
	MOV  	DPTR,#08H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?SLDIV
	LCALL	_?PrintLN
?C0082:
; 	PrintChar(n%b+'0');
			; SOURCE LINE # 407
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?SLDIV
	MOV  	A,R3
	ADD  	A,#030H
	MOV  	R7,A
	LCALL	_?PrintChar
; }
			; SOURCE LINE # 408
?C0080:
	MOV  	DPTR,#08H
	LJMP 	?C?ADDXBP
; END OF _?PrintLN

; 
; void PrintLUN(unsigned long n,unsigned long b) reentrant  //十进制显示无符号长整形数

	RSEG  ?PR?_?PrintLUN?SERIAL
_?PrintLUN:
	USING	0
			; SOURCE LINE # 410
	MOV  	DPTR,#0FFFCH
	LCALL	?C?ADDXBP
	LCALL	?C?LSTXDATA
; {
;     if(b==16){PrintLong(n);return;}
			; SOURCE LINE # 412
	CLR  	A
	MOV  	R7,#010H
	MOV  	R6,A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	CLR  	C
	LCALL	?C?ULCMP
	JNZ  	?C0083
	LCALL	L?0212
	LJMP 	?C0084
?C0083:
; 	if(n/b)
			; SOURCE LINE # 413
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	MOV  	A,R4
	ORL  	A,R5
	ORL  	A,R6
	ORL  	A,R7
	JZ   	?C0085
; 	    PrintLUN(n/b,b);
			; SOURCE LINE # 414
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#0FFFCH
	LCALL	?C?ADDXBP
	LCALL	?C?LSTXDATA
	MOV  	DPTR,#08H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	LCALL	_?PrintLUN
?C0085:
; 	PrintChar(n%b+'0');
			; SOURCE LINE # 415
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	MOV  	A,R3
	ADD  	A,#030H
	MOV  	R7,A
	LCALL	_?PrintChar
; }
			; SOURCE LINE # 416
?C0084:
	MOV  	DPTR,#08H
	LJMP 	?C?ADDXBP
; END OF _?PrintLUN

; 
; //============================================================================================
; //KEIL C51的float类型采用IEEE-754标准存储,占4字节。
; //    S E E E E E E E E E (1) M M M M M M M M M M M M M M M M M M M M M M M
; //  S    1bit    正负标志位0=正;1=负
; //  E    8bit    二进制阶码=(EEEEEEEE)-127
; //  M   23bit    24bit尾数,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效数,提高了精度。
; //
; //  尾数为24bit,最高可表达的整数值为2^24-1=16777215,也就是说,小于等于16777215的整数可以被精确
; //显示。这决定了十进制浮点数的有效位数为7位,10^7<16777215<10^8,10的7次方以内的数小于16777215,
; //可以精确表示。使用科学记数法时,整数部分占1位,所以小数部分最大占7-1=6位,即最大有6位精度。
; //  长整形数和浮点数都占4字节,但表示范围差别很大。浮点数的范围为+-1.175494E-38到+-3.402823E+38,
; //无符号长整形数范围为0到4294967295。显示浮点数要用到长整形数保存数据,可他们范围差这么多,怎么办呢?
; //  仔细观察十进制浮点数的显示,有一个尾数和一个阶码,由上面论证可知32位浮点数最大有效数字为7位十进制
; //数,超出此范围的数字有截断误差,不必理会,因此,使浮点数尾数能够放在长整形数里保存。阶码为-38到38,
; //一个char型变量就可以保存。
; //  综上所述,以10^7的最大跨度为窗口(小于10^7也可以,如:10,100...10000等,但决不能大于它,那样会
; //超出精度范围),定位浮点数的量级,然后取出7位尾数的整数值,再调整阶码,就可以精确显示此浮点数。
; //  量级尺度如下:
; //    (-38)-(-35)-(-28)-(-21)-(-14)-(-7)-(0)-(7)-(14)-(21)-(28)-(35)-(38)
; //  请严格按照KEIL手册给出的浮点数范围显示,因为数值空间没有完全使用,有些值用于错误指示和表示正负无穷。
; //小于1.175494E-38的数仍可以显示一些,但最好不用,以免出错。我采用直接判断的方法,剔除此种情况。
; //  在计算机里结合律不成立,(a*b)*c!=a*(b*c),原则是先让计算结果值动态范围小的两个数运算,请注意程序里
; //的写法。
; //  注:(1E38/b)*1E6不要写成1E44/b,因为无法在32位浮点数里保存1E44,切记!
; //  计算机使用二进制数计算,能有效利用电子器件高速开关的特性,而人习惯于十进制数表示,二进制和十进制
; //没有方便的方法转换,只能通过大量计算实现,浮点数的十进制科学记数法显示尤其需要大量的运算,可见,显示
; //一个浮点数要经过若干次浮点运算,没有必要就不要显示,花在显示上的时间比计算的耗时都要多得多。
; //============================================================================================
; void DispF(float f) reentrant  //用科学记数法显示浮点数,在float全范围内精确显示,超出范围给出提示。

	RSEG  ?PR?_?DispF?SERIAL
_?DispF:
	USING	0
			; SOURCE LINE # 446
	MOV  	DPTR,#0FFFCH
	LCALL	?C?ADDXBP
	LCALL	?C?LSTXDATA
	MOV  	DPTR,#0FFF2H
	LCALL	?C?ADDXBP
; {                              //+-1.175494E-38到+-3.402823E+38
;     float tf,b;
;     unsigned long w;
;     char i,j;
;     if(f<0){
			; SOURCE LINE # 451
	CLR  	A
	MOV  	R7,A
	MOV  	R6,A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	DPTR,#0EH
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	LCALL	?C?FPCMP3
	JNC  	?C0086
;         PrintChar('-');
			; SOURCE LINE # 452
	MOV  	R7,#02DH
	LCALL	_?PrintChar
;         f=-1.0*f;
			; SOURCE LINE # 453
	MOV  	DPTR,#0EH
	LCALL	?C?XBPOFF
	PUSH 	DPH
	PUSH 	DPL
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A

⌨️ 快捷键说明

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