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

📄 hex-bcd.asm

📁 一段二进制转压缩BCD(我认为是好东东
💻 ASM
字号:
NAME HEX_BCD
;*************************************************************************
; Hex to 压缩BCD码的转换(每4位代表一位bcd码)
; 输入Hex:R6R7     返回地址:bcdData
;*bcdData = BCD(R6R7)
; http://www.xiao-qi.com/晓奇工作室收集整理,Keil C51下调试运行通过
;*************************************************************************
?PR?_HEX_BCD?HEX_BCD SEGMENT CODE 	; 码段定义叙述,需要对本文件内的所有
?PR?_BCD_ADJ?HEX_BCD SEGMENT CODE 	; 码段定义叙述,需要对本文件内的所有
PUBLIC _HEX_BCD
EXTRN	DATA(bcdData)

RSEG  ?PR?_HEX_BCD?HEX_BCD
_HEX_BCD:CLR     A                  ;目标数据清零初始化
        MOV     bcdData, A
        MOV     bcdData+1, A
        MOV     bcdData+2, A
        MOV     R2, #15             ; 共进行15次循环移位运算
H_B0:   MOV     A, R7               ; 低8位
        RLC     A                   ; 大循环左移
        MOV     R7, A               ; 回存
        MOV     A, R6               ; 高8位
        RLC     A                   ; 大循环左移
        MOV     R6, A               ; 回存。至此已获得当前数据的最高位

        MOV     A, bcdData+2        ; 目标数最低8位
        RLC     A                   ; 移入原数据的最高位
        ACALL   _BCD_ADJ            ; 压缩BCD码的十进制调整
        MOV     bcdData+2, A        ; 存回
        MOV     A, bcdData+1        ; 目标数中间8位
        RLC     A                   ; 移入进位位
        ACALL   _BCD_ADJ            ; 压缩BCD码的十进制调整
        MOV     bcdData+1, A        ; 存回
        MOV     A, bcdData          ; 目标数最高8位
        RLC     A                   ; 移入进位位
        ACALL   _BCD_ADJ            ; 压缩BCD码的十进制调整
        MOV     bcdData, A          ; 存回
        DJNZ    R2, H_B0            ; 继续下一轮循环

; 目标数据再左移一位,将原数据的最后一位放入,这样总共进行了16次循环移位
        MOV     A, R6
        RLC     A
        MOV     A, bcdData+2
        RLC     A
        MOV     bcdData+2, A
        MOV     A, bcdData+1
        RLC     A
        MOV     bcdData+1, A
        MOV     A, bcdData
        RLC     A
        MOV     bcdData, A
        RET

;*************************************************************************
; 压缩BCD码的十进制调整,基本思路:逢十进一,在这里因为还保留着最后一次左
; 移, 所以进位判别的0AH(0A0H)变成相对右移了一位的05H(050H), 而强迫进行进位
; 的方法是加上一个数字3(左移一位后就是6)。程序保护PSW
; 输入返回均使用Acc累加器
;*************************************************************************
RSEG  ?PR?_BCD_ADJ?HEX_BCD

_BCD_ADJ:
	PUSH    PSW
        PUSH    ACC
        CJNE    A, #50H, $+3    ; 高4位。做一个比较产生状态标志
        JC      B1              ; 如果小于#50H, 不用进位处理
        POP     ACC             ; 取原数据作修改
        ADD     A, #30H         ; 加上#30h,留待下一轮左移时产生进位
        PUSH    ACC             ; 存回原数据
  B1:   ANL     A, #0FH         ; 仅考虑低4位
        CJNE    A, #5, $+3      ; 做一个比较产生状态标志
        JC      B2              ; 如果小于#5H, 不用进位处理
        POP     ACC             ; 取原数据作修改
        ADD     A, #3           ; 加上#3h,留待下一轮左移时产生进位
        PUSH    ACC             ; 存回原数据
  B2:   POP     ACC             ; 恢复现场
        POP     PSW
        RET 

end

⌨️ 快捷键说明

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