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

📄 bcdandhex.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
字号:
;=====================================
;待转换的三字节BCD码整数在R4R5R6中.
;转换后的双字节十六进制整数仍在R4R5R6中.
;10000==2710H
BCD_HEX_3BYTES:
                        LCALL BCD_HEX_2BYTES	        ;将低字节,中字节转换成十六进制
			MOV A,R4		        ;将高字节转换成十六进制
			LCALL BCD_HEX_1BYTE
			MOV R4,A
			MOV B,#10H                      ;进位低字节
			MUL AB
			MOV R7,A	                ;低位暂存R7
			ADD A,R6
			MOV R6,A
			MOV A,B
			ADDC A,#00H
			MOV R7,A	                ;向高位进位
			MOV A,R4
			MOV B,#27H                      ;进位高字节
			MUL AB
			ADD A,R7
			ADDC A,R5
			MOV R5,A
			MOV A,B
			ADDC A,#00H
			MOV R4,A
			RET
;---------------------------------------------
;入口条件:待转换的双字节BCD码整数在R5R6中.
;出口信息:转换后的双字节十六进制整数仍在R5R6中.
;------------------------------------------------
BCD_HEX_2BYTES:	         	MOV	A,R6			;将低字节转换成十六进制
				LCALL	BCD_HEX_1BYTE
				MOV	R6,A
				MOV	A,R5			;将高字节转换成十六进制
				LCALL	BCD_HEX_1BYTE
				MOV	B,#100			;扩大一百倍
				MUL	AB
				ADD	A,R6			;和低字节按十六进制相加
				MOV	R6,A
				CLR	A
				ADDC    A,B
				MOV	R5,A
				RET
;---------------------------------------
;单字节BCD码转换为十六进制整数
;出口信息:转换后的16进制数A中,百位在R7中.
;---------------------------------------
BCD_HEX_1BYTE:		        MOV	B,#10H			;分离十位和个位
				DIV	AB                      ;A里为商;B里为余数
				MOV	R7,B			;余数暂存为个位
				MOV	B,#10			;将十位转换成十六进制
				MUL	AB
				ADD	A,R7			;按十六进制加上个位
				RET
;===============================================
;三字节十六进制整数转换BCD码.
;入口条件:待转换的三字节十六进制整数在R4R5R6中.
;出口信息:转换后的四字节BCD码整数在R1R2R3中,最高字节在B中.
;---------------------------------------------------------------------------------
HEX_BCD_3BYTES:
                                CLR	C	                 ;BCD码初始化为0
                                MOV     A,#00H
		                MOV	R1,#00H
		                MOV	R2,#00H
		                MOV	R3,#00H
		                MOV     B,#00H
		                MOV	R7,#18H		         ;转换三字节十六进制整数
HEX_BCD_LOOP3:
	                        MOV	A,R6		         ;低位字节
	           	        RLC	A                        ;从高端移出待转换数的一位到CY中
		                MOV	R6,A
		                MOV	A,R5                     ;中间字节
		                RLC	A
		                MOV	R5,A
		                MOV     A,R4                     ;高位字节
		                RLC     A
		                MOV     R4,A
		                MOV	A,R3		         ;BCD码带进位自身相加,相当于乘2
		                ADDC	A,R3                     ;低位字节带进位位相加
		                DA	A			 ;十进制调整
                                MOV	R3,A
		                MOV	A,R2                     ;中间字节
		                ADDC	A,R2
		                DA	A
                                MOV	R2,A
		                MOV	A,R1                     ;高位字节
		                ADDC	A,R1
		                DA      A
                                MOV	R1,A
		                MOV     A,B
		                ADDC    A,B
                                DA      A
		                MOV     B,A
		                DJNZ	R7,HEX_BCD_LOOP3         ;处理完24BIT
		                RET
;------------------------------------------------
;双字节十六进制整数转换BCD码.
;入口条件:待转换的双字节十六进制整数在R6R7中.
;出口信息:转换后的三字节BCD码整数在R3R4R5中.
;--------------------------------------------
HEX_BCD_2BYTES:		        CLR	A		        ;BCD码初始化
				MOV	R3,A
				MOV	R4,A
				MOV	R5,A
				MOV	R2,#10H			;转换双字节十六进制整数
HEX_BCD_LOOP2:	        	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,HEX_BCD_LOOP2	;处理完16BIT
				RET
;-------------------------------------------
;单字节十六进制整数转换BCD码.
;入口条件:待转换的单字节十六进制整数在累加器A中.
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中.
HEX_BCD_1BYTE:      	        MOV	B,#100	                 ;分离出百位,存放在R3中
			        DIV	AB
			        MOV	R3,A
			        MOV	A,#10		         ;余数继续分离十位和个位
			        XCH	A,B
			        DIV	AB
			        SWAP	A
			        ORL	A,B     	         ;将十位和个位拼装成BCD码
			        RET

⌨️ 快捷键说明

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