PIC单片机实现二进制码与压缩BCD码的相互转换

3/8/2017来源:ASP.NET技巧人气:1891

编写子程序Bin2BCD、BCD2Bin实现二进制数到压缩BCD码的相互转换。待转换的二进制数存放在w寄存器内,子程序调用完成后得到的BCD码仍存放在w寄存器内返回。例如:

movlw .45       ; w=45 call   Bin2BCD ; nop              ; w=0x45

一、实现二进制数到压缩BCD码的转换

二进制数转压缩BCD码的方法是将二进制码左移8次,每次移位后都检查低四位是否大于4,如果大于4则低四位加3,否则不加;高4位做同样处理。

程序框图:PIC二进制转BCD码

list p=16f877A ;标明所用的处理器类型 #include <p16f877A.inc> ;调用头文件 __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次。

程序框图:PIC单片机BCD码转二进制

list p=16f877A ;标明所用的处理器类型 #include <p16f877A.inc> ;调用头文件 __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 ; 程序结束