在使用RTC外設(shè)時,我們常常會接觸 BCD碼的概念,同時魚鷹在介紹 USB協(xié)議版本時也說了 BCD碼,那么什么是 BCD碼? BCD 碼分為多種,今天魚鷹介紹最常用的 8421 BCD碼。
進(jìn)制 | 高四位 | 低四位 |
BCD碼 | 4 | 5 |
十六進(jìn)制 | 4 | 5 |
十進(jìn)制 | 6 | 9 |
假如我們需要設(shè)置 RTC時鐘的秒值為 45 秒,因為一般芯片會使用 BCD碼進(jìn)行存儲,所以我們需要存儲到芯片寄存器的值就是 0x45,注意這是十六進(jìn)制表示,如果你寫入寄存器時用十進(jìn)制表示,那么就是 69。 代碼表示如下:
//假設(shè) REG_SEC 為秒寄存器 REG_SEC = 0x45; // 十六進(jìn)制寫入寄存器 REG_SEC = 69; // 十進(jìn)制寫入寄存器不管你使用哪種方式,最終寫入的二進(jìn)制都是一樣的,沒有任何區(qū)別。不過因為是 BCD碼格式,當(dāng)寫入的值為立即數(shù)時,建議使用十六進(jìn)制,這樣看起來更直觀一些。 從這個例子中我們其實也可以看出一點規(guī)律,那就是所謂的 BCD 碼就是把十六進(jìn)制的寫法直接認(rèn)為是十進(jìn)制的值。 實際上也確實如此。 BCD 碼中,使用4個位(二進(jìn)制位)來表示一個十進(jìn)制的值,范圍 0~9。 也就是說,本來十六進(jìn)制 4 個位可以表示0~15,但因為十進(jìn)制的范圍是 0~9,所以這四個位的范圍也因此被限制住了。 同時在一個字節(jié)中,高四位代表十進(jìn)制的十位,低四位代表十進(jìn)制的個位。 了解這一點,你就知道該如何把十進(jìn)制轉(zhuǎn)化成BCD碼的形式進(jìn)行存儲,又該如何將 BCD碼轉(zhuǎn)化為十進(jìn)制了。 還是以存儲秒寄存器(BCD碼存儲)為例:
// BCD 碼 轉(zhuǎn) 十進(jìn)制#define BCD_TO_DECIMAL(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f)) // 十進(jìn)制 轉(zhuǎn) BCD 碼#define DECIMAL_TO_BCD(x) ((((x) / 10) << 4) + ((x) % 10)) // 以十進(jìn)制形式寫入秒寄存器,最終將以 BCD 碼存儲REG_SEC = DECIMAL_TO_BCD(45); // 設(shè)置為 45 秒 // 讀取秒寄存器中的 BCD 碼,并轉(zhuǎn)化為十進(jìn)制值,方便處理second = BCD_TO_DECIMAL(REG_SEC);通過以上兩個宏,我們就可以在0 ~ 99 范圍內(nèi)隨意轉(zhuǎn)化,當(dāng)需要更大范圍時,理解原理,修改起來也不就是那么麻煩了。
-
時鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131480 -
RTC
+關(guān)注
關(guān)注
2文章
538瀏覽量
66528 -
BCD碼
+關(guān)注
關(guān)注
1文章
52瀏覽量
18298
原文標(biāo)題:啥是 BDC 碼?
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論