×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-16 发布时间:
|

编写子程序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                 


关键字:PIC单片机  二进制码  压缩BCD码  相互转换 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址