将BCD码转化成10进制数

1:目的

将BCD码转化成10进制数,并按照低位到高位的形式组合在一起。例如0x23和0x45 转化成 十进制4523

2:实现

/*******************************************************************************
  * @file          pow.c
  * @verison       v1.0.0
  * @copyright     COPYRIGHT © 2020 CSG
  * @author        ShiYanKai
  * @date:         2021-07-03
  * @brief
  * @bug
  * - 2021-07-03  SYK Created
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

unsigned char bcd_to_hex(unsigned char bcd)
{
    if (((bcd & 0x0f) > 0x09) || ((bcd & 0xf0) > 0x90))
        return 0;
    return (bcd & 0x0f) + (bcd >> 4) * 10; 
}

void bcd_to_hex_for_bytes(const void *p_src, void *p_dst, unsigned char size)
{
    unsigned char i;
    unsigned long long hex = 0;
    unsigned char a;

    for (i = size; i > 0; i--)
    {   
        hex += (unsigned long long) bcd_to_hex(((unsigned char*) p_src)[i - 1]) * pow(10, 2 * (i - 1));
        // double pow(double x, double y) 返回 x 的 y 次幂,即 xy。
    }
    memcpy((unsigned char*) p_dst, &hex, size);
}

int32_t DLT645_bcd_to_hex(uint8_t *p_src, uint8_t len, bool has_sign)
{
    uint8_t sign = 0;
    uint32_t hex = 0;

    if (has_sign == true)
    {
        if (p_src[len - 1] & 0x80)
        {
            sign = 1;
            p_src[len - 1] &= ~0x80;
        }
    }

    bcd_to_hex_for_bytes(p_src, &hex, len);

    if (sign == 1)
        return -hex;
    else
        return hex;
}


int main()
{
    float f_tmp = 0;
    unsigned char a[] = {0x23, 0x45};
    f_tmp = DLT645_bcd_to_hex(a, 2, false);

    printf("%f\n", f_tmp);
    printf("%f\n", f_tmp * 0.1);
}

3:编译并执行

yankaishi@zx-dev:~/test$ gcc pow.c -lm
yankaishi@zx-dev:~/test$ ./a.out 
4523.000000
452.300000
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个很有趣的问题!下面是用MASM和LINK编写的汇编语言程序,实现输入一个十进制并输出对应的二进制、十六进制BCD码的过程: ```assembly .model small .stack 100h .data decimal db ? binary db 9 dup('$') hexa db 3 dup('$') bcd db 6 dup('$') newline db 0Dh, 0Ah, '$' .code main proc mov ax, @data mov ds, ax ; 读取输入的字符 call readchar ; 将十进制转化为二进制 mov al, decimal call convert_2 mov binary, al ; 将十进制转化为十六进制 mov al, decimal call convert_16 mov hexa, al ; 将十进制转化BCD码 mov al, decimal call convert_BCD mov bcd, al ; 输出结果 mov ah, 09h mov dx, offset binary int 21h mov dx, offset newline int 21h mov dx, offset hexa int 21h mov dx, offset newline int 21h mov dx, offset bcd int 21h mov ah, 4Ch int 21h main endp ; 子程序:读取输入的字符 readchar proc mov ah, 01h int 21h sub al, 30h ; 将ASCII码转化十进制 mov decimal, al ret readchar endp ; 子程序:将十进制转化为二进制 convert_2 proc mov bl, 2 ; 除为2 xor bh, bh mov cl, 7 ; 循环7次,处理8位二进制 mov si, 0 ; 存储结果的偏移地址 convert_2_loop: mov ah, 0 ; 清空高位字节 div bl ; 除法运算 add ah, 30h ; 结果转化为ASCII码 mov [binary+si], ah ; 存储结果 inc si loop convert_2_loop ret convert_2 endp ; 子程序:将十进制转化为十六进制 convert_16 proc mov bl, 16 ; 除为16 xor bh, bh mov cl, 2 ; 循环2次,处理两位十六进制 mov si, 0 ; 存储结果的偏移地址 convert_16_loop: mov ah, 0 ; 清空高位字节 div bl ; 除法运算 cmp ah, 9 ; 判断余是否大于9 jbe convert_16_digit ; 如果余小于等于9,直接转化为ASCII码 add ah, 07h ; 如果余大于9,转化为字母的ASCII码 convert_16_digit: add ah, 30h ; 结果转化为ASCII码 mov [hexa+si], ah ; 存储结果 inc si loop convert_16_loop ret convert_16 endp ; 子程序:将十进制转化BCD码 convert_BCD proc xor ah, ah ; 清空高位字节 xor si, si ; 初始化偏移地址 convert_BCD_loop: mov al, decimal ; 将十进制复制到al aam ; 将al中的十位和个位分别存放在ah和al中 add ah, 30h ; 十位转化为ASCII码 mov [bcd+si], ah ; 存储十位 add al, 30h ; 个位转化为ASCII码 mov [bcd+si+1], al ; 存储个位 add si, 2 ; 偏移地址增加2个字节 cmp ah, 0 ; 判断十位是否为0 jne convert_BCD_loop ret convert_BCD endp end main ``` 这个程序使用DOSbox来运行,可以输入一个十进制,然后输出对应的二进制、十六进制BCD码。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值