编写子程序Bin2BCD、BCD2Bin实现二进制数到压缩BCD码的相互转换。待转换的二进制数存放在w寄存器内,子程序调用完成后得到的BCD码仍存放在w寄存器内返回。例如:
movlw .45 ; w=45
call Bin2BCD ;
nop ; w=0x45
一、实现二进制数到压缩BCD码的转换
二进制数转压缩BCD码的方法是将二进制码左移8次,每次移位后都检查低四位是否大于4,如果大于4则低四位加3,否则不加;高4位做同样处理。
程序框图:
list p=16f877A ;标明所用的处理器类型
#include ;调用头文件
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;*****************变量定义*******************************************************
BIN EQU 0x20 ; 存放二进制数
BCD EQU 0x21 ; 存放压缩BCD码
BCDLO EQU 0x22 ; 存放BCD码低四位
BCDHI EQU 0x23 ; 存放BCD码高四位
LOW3 EQU 0x24 ; 用于与低四位相加
HIGH3 EQU 0x25 ; 用于与高四位相加
COUNT EQU 0x26 ; 循环次数
;*******************************************************************************
ORG 0x0000 ; 复位入口地址
nop ; 兼容ICD调试工具,必须加nop
goto Main ; 跳转至Main函数
;*************************Main 函数的代码******************************
Main
MOVLW b'00101101' ; 二进制数00101101送BIN
MOVWF BIN
CLRF BCD ; BCD清零
MOVLW 0x03 ; 0x03送LOW3
MOVWF LOW3
MOVLW 0x30 ; 0x30送HIGH3
MOVWF HIGH3
MOVLW 0x07 ; 初始化循环次数
MOVWF COUNT
CALL Bin2BCD ; 调用转换程序
RLF BIN
RLF BCD ; 第八次左移,结果应为0x45
nop
goto $ ; 停机
;**************************二进制转压缩BCD码子程序 ********************
ORG 0X0100
Bin2BCD
RLF BIN
RLF BCD ; 二进制码从高位到低位依次送入BCD
MOVLW b'00001111' ; W寄存器高四位清零
ANDWF BCD,W ; BCD高四位清零,结果存放在W寄存器中
MOVWF BCDLO ; 暂存此处,用于判断
MOVLW 0x04
BCF STATUS,C ; 标志位清零
SUBWF BCDLO,F ; 判断低四位是否大于4
BTFSC STATUS,C ; C位为0则跳
CALL ADDLO ; C=1,即低四位大于4,则低四位加3
nop
MOVLW b'11110000' ; W寄存器低四位清零
ANDWF BCD,W ; BCD低四位清零,结果存放在W寄存器中
MOVWF BCDHI ; 暂存此处,用于判断
MOVLW 0x40
BCF STATUS,C ; 标志位清零
SUBWF BCDHI,F ; 判断高四位是否大于4
BTFSC STATUS,C ; C位为0则跳
CALL ADDHI ; C=1,即高四位大于4,则高四位加3
nop
DECFSZ COUNT,F ; 循环
GOTO Bin2BCD
RETURN
;******************************************************************
ADDLO ; 低四位加3
MOVF LOW3,W
ADDWF BCD,F
RETURN
ADDHI ; 高四位加3
MOVF HIGH3,W
ADDWF BCD,F
RETURN
;*****************************************************************************
END ; 程序结束
二、实现压缩BCD码到二进制数的转换
因为压缩BCD码为十进制数,所以只要取其高四位和低四位,将高四位乘10D加上低四位即可。为了编程的方便,可以将乘10D转化为累加10次。
程序框图:
list p=16f877A ;标明所用的处理器类型
#include ;调用头文件
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;*****************变量定义*******************************************************
BIN EQU 0x20 ; 存放二进制数
BCD EQU 0x21 ; 存放压缩BCD码
BCDLO EQU 0x22 ; 存放BCD码低四位
BCDHI EQU 0x23 ; 存放BCD码高四位
COUNT EQU 0x24 ; 高位乘10(加自身9次)循环变量
;*******************************************************************************
ORG 0x0000 ; 复位入口地址
nop ; 兼容ICD调试工具,必须加nop
goto Main ; 跳转至Main函数
;*************************Main 函数的代码******************************
Main
MOVLW b'01000101' ; BCD码01000101送BCD
MOVWF BCD
MOVLW .10 ; 初始化循环次数
MOVWF COUNT
CLRF BIN ; 清零
CALL BCD2Bin ; 调用转换程序
nop
goto $ ; 停机
;**************************压缩BCD码转二进制子程序 ********************
ORG 0X0100
BCD2Bin
MOVLW b'00001111'
ANDWF BCD,W ; BCD高四位清零,结果存放在W寄存器中
MOVWF BCDLO ; 获得BCD低四位
MOVLW b'11110000'
ANDWF BCD,W ; BCD低四位清零,结果存放在W寄存器中
MOVWF BCDHI
SWAPF BCDHI,F ; 获得BCD高四位
MOVF BCDHI,W
CALL MPY10 ; 调用MPY10,将高四位乘10
nop
MOVF BCDLO,W
ADDWF BIN,F ; 加低四位,完成转换
RETURN
MPY10
ADDWF BIN,F
DECFSZ COUNT,F ; 高4位乘10存放于BIN,即加10次高4位
GOTO MPY10
RETURN
;*****************************************************************************
END ; 程序结束