BCD码与十进制数间转换
一、前言:
這幾天在項目協議對接的時候有一部分功能是獲取系統時間功能與校時功能。小馬哥獲取到時間后打印了一下 2020-5-26 20:06:32,一看時間是對的,然后美滋滋的組裝協議發送平臺測試了。測試的時候發現月、日、時分秒數據都正常,就是2020年顯示的是一個三萬多的一個數,此事必有蹊蹺。
能打印出正確時間但是平臺顯示的是錯誤數據只有兩個原因。一個是獲取到時間后協議封裝有問題,另一個是平臺解析有問題。出現問題肯定是要先查自己部分看看是不是自己埋了個bug了。
查了幾分鐘發現是小馬哥開始看協議的時候粗心了,數據類型是BCD碼(當初看到BCD的時候還想了一下BCD碼是個什么東西,后面忘了。。。)。之前就大學的時候接觸過BCD碼,好久不用已經忘了BCD碼的概念,然后就上網查了一些資料,將時間進行轉換,平臺可以正確讀取時間數據了
BCD碼概念
BCD碼(Binary-Coded Decimal?)稱為二進碼十進數或二——十進制代碼。用4位二進制數來表示1位十進制數中的0~9這10個數碼。BCD碼可分為有權碼和無權碼兩類:有權BCD碼有8421碼、2421碼、5421碼,其中8421碼是最常用的BCD碼。無權BCD碼有余3碼,余3循環碼等。
1. 8421碼
8421 BCD碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的權值為8、4、2、1,故稱為有權BCD碼。和四位自然二進制碼不同的是,它只選用了四位二進制碼中前10組代碼,即用0000~1001分別代表它所對應的十進制數,余下的六組代碼不用。如十進制數8的BCD碼是1000。
2. 5421碼
5421 BCD碼是有權BCD碼,從高位到低位的權值分別為5、4、2、1。
3. 2421碼
2421 BCD碼為有權BCD碼,從高位到低位的權值分別為2、4、2、1。
4. 余3碼
余3碼是8421 BCD碼的每個碼組加3(0011)形成的。常用于BCD碼的運算電路中。
三、BCD 碼應用場合
BCD碼目前最常使用的應該是時鐘芯片中,從時鐘芯片中獲取的時間數據即是BCD碼格式,需要程序員將其轉換為十進制數據。其他應用場合還包括,PLC控制輸入、撥碼開關輸入、數碼管控制等。
四、.BCD 碼與十進制間轉換
下面是8421碼與是十進制間的相互轉換代碼,親測可用:
1. 8421碼轉十進制數
如,從時鐘芯片中讀出的時間數據,需轉換為十進制數。
unsigned char bcd_to_hex(unsigned char data) {unsigned char temp;temp = ((data>>4)*10 + (data&0x0f));return temp; }2. 十進制數轉8421碼
如,往時鐘芯片寫入數據時,需將待寫的十進制數轉換為8421碼。
unsigned char hex_to_bcd(unsigned char data) {unsigned char temp;temp = (((data/10)<<4) + (data%10));return temp; }相關BCD碼資料鏈接:https://blog.csdn.net/zhouzx9293/article/details/82182599
總結
以上是生活随笔為你收集整理的BCD码与十进制数间转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新处理器排名_安兔兔Android处理
- 下一篇: fastreport 直接调网络打印机_