BCD码、十进制互相转换

记录今天用15单片机写DS1302时钟芯片程序的时候遇到的问题

时间显示是这个样的 0 1 2 3 4 5 6 7 8 9 16
9之后突变成16了,没有数据10...11...

why?

读取DS1302时钟芯片的数据是BCD码,需要将BCD码转换成十进制显示

写入数据的时候需要十进制转BCD码

1. BCD码

主要学习什么是BCD码,以及二进制、八进制、十进制、十六进制之间的相互转换

BCD码就是以四位二进制数为一个单位来表示相应的十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数。

如下图:

最后一列是BCD码的十进制表示形式,将BCD码按8421法相加即得出最后一栏的数值

图中可以看到0-9位 几个进制的BCD码都是以二进制的正常形式换算,从十开始的BCD码开始不一样了起来。

BCD码:用4位二进制数来表示1位十进制数。   逢九进一

例如:十进制数10的BCD码为0001 0000;
显而易见前四位的 0001 表示的是十进制的十位,0000则就是个位了。十六进制转BCD码也是同理。

进制转换:

BCD码转十进制:DEC = BCD / 16 * 10  +  BCD % 16 ;

详解:先将BCD的前一位提出BCD/16,再提出BCD后一位BCD%16。最后将两位数整合转换成十进制。多位BCD码同理。

十进制转BCD码:BCD = DEC / 10 * 16 + DEC % 10 ;

  1. "DEC / 10":这部分表示将原始的十进制数(DEC)除以 10。除以 10 的操作实际上是在原始数字中去掉了个位数。例如,对于十进制数 123,"DEC / 10" 等于 12,因为它去掉了个位数,只剩下十位数和百位数。

  2. "DEC / 10 * 16":在上一步之后,得到的结果乘以 16。这是因为BCD码中,每个十进制数字需要用4位二进制数来表示。乘以 16 等于将这个结果左移了4位。左移4位相当于在二进制数中在原来的数字后面加上了4个0。这是因为在二进制中,每一位的左移一位相当于乘以2,左移4位相当于乘以16。

举例来说,如果原始的十进制数是 12,那么 "DEC / 10" 等于 1(去掉个位数),然后 "DEC / 10 * 16" 等于 16。这是因为将1左移4位得到16。所以,最终的BCD码中会有两个4位的二进制数,分别表示十位数和个位数。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值