首页 > 学院 > 开发设计 > 正文

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

2019-11-06 07:45:30
字体:
来源:转载
供稿:网友

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

movlw .45       ; w=45call   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 0X0100Bin2BCD 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 RETURNADDHI ; 高四位加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 0X0100BCD2Bin 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 ; 加低四位,完成转换 RETURNMPY10 ADDWF BIN,F DECFSZ COUNT,F ; 高4位乘10存放于BIN,即加10次高4位 GOTO MPY10 RETURN ;*****************************************************************************END ; 程序结束
上一篇:udp socket

下一篇:ubuntu 学习资料整理

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表