bios 发表于 2019-9-20 12:51:13

关于DS1302的BCD码,又糊涂了

资料上说,BCD是用二进制码表示10进制数
如果当前是23点,从时寄存器,读出来的数应该是多少呢,我认为是0x23,二进制表示:0b0010 0011,表示十位是2,个位是3
这样理解对不对呢?

huxiangming 发表于 2019-9-20 14:35:16

本帖最后由 huxiangming 于 2019-9-20 14:36 编辑

24小时模式下这么理解是对的,12小时模式下就是 1011 0001 第5位代表下午,第7位代表12小时模式。

当然,0x23就代表了24小时模式,因为最高位是0.

dale 发表于 2019-9-20 14:34:27

沒錯

十進制 0~9 等於 BCD碼 0000 ~ 1001
進位 9+1 = 10, BCD碼 = 0001 0000

bios 发表于 2019-9-20 15:22:12

谢谢各位指点
0x23这个数,到底是算多少进制的呢?
那么,如果我要把这个数取出来,+1进行调时操作,a=0x23
应该怎么做呢,网上有人是先由16进制转为10进制,+1后,再由10进制转为16进制,再写回去,还是糊涂

bios 发表于 2019-9-20 15:25:16

(a>>4)*10+(a&0x0f),得到的,是不是十进制数字23?

w6955 发表于 2019-9-20 15:37:19

本帖最后由 w6955 于 2019-9-20 15:41 编辑

bios 发表于 2019-9-20 15:22
谢谢各位指点
0x23这个数,到底是算多少进制的呢?
那么,如果我要把这个数取出来,+1进行调时操作,a= ...

0x23当然是16进制的数。0x---就是16进制的意思。 0X23+1=0X24,a+1就是了,“a+=1;”

bios 发表于 2019-9-20 15:39:39

0x23,也不是完全按16进制在走

dale 发表于 2019-9-20 15:45:06

bios 发表于 2019-9-20 15:39
0x23,也不是完全按16进制在走

那是因為你用的是 BCD碼
如果你把它當作 ASCII碼, 那就是 # 號了
而如果當成十六進制的數字, 那就是 十進制的 35

0x23 就只是一個數字, 你要把它當作甚麼東西, 完全取決於你自己

dale 发表于 2019-9-20 15:49:08

bios 发表于 2019-9-20 15:39
0x23,也不是完全按16进制在走

如果你寫 RS232 傳輸程式, 就會發現傳的資料都是 0x00~0xFF
那要怎麼分辨是數字還是文字?
這些都是取決於寫程式的人
你要把它當文字, 那他就是文字, 你要把它當數字, 那他就是數字

bios 发表于 2019-9-20 16:17:34

谢谢各位提醒,是这么个理
那么,我要把0x23当成十进制的23,应该怎么做呢

dale 发表于 2019-9-20 16:21:07

bios 发表于 2019-9-20 16:17
谢谢各位提醒,是这么个理
那么,我要把0x23当成十进制的23,应该怎么做呢

就是你在 5樓的寫法啊

夏国特 发表于 2019-9-20 16:46:15

DS1302是个什么东西?

dale 发表于 2019-9-20 17:07:17

夏国特 发表于 2019-9-20 16:46
DS1302是个什么东西?

Real Time Clock
即時時鐘晶片

w6955 发表于 2019-9-20 17:44:40

本帖最后由 w6955 于 2019-9-20 18:04 编辑

bios 发表于 2019-9-20 16:17
谢谢各位提醒,是这么个理
那么,我要把0x23当成十进制的23,应该怎么做呢

明明是十六进制的23 就是十进制35 非要当十进制的 23 那叫指鹿为马!非如此就得 0X23-12 于是OK,BCD 你就忘了那些,每四个二进制是一个数!只有0-9 没有其他。

bios 发表于 2019-9-20 18:02:49

怪我上面没说清楚
我是想把“小时”的值取出来,进行+1操作
但是+1是有个范围的,不能大于24,因此,必须取出来,换算成十进制才行。
页: [1] 2
查看完整版本: 关于DS1302的BCD码,又糊涂了