记录今天用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 ;
-
"DEC / 10":这部分表示将原始的十进制数(DEC)除以 10。除以 10 的操作实际上是在原始数字中去掉了个位数。例如,对于十进制数 123,"DEC / 10" 等于 12,因为它去掉了个位数,只剩下十位数和百位数。
-
"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位的二进制数,分别表示十位数和个位数。