BCD码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BCD码(Binary-Coded Decimal)亦称二进码十进制数或二-十进制代码。
用4位二进制数来表示1位十进制数中的0~9这10个数字。
是一种二进制的数字编码形式,其本质是二进制,用二进制编码的十进制代码。
BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
我们前边讲过十六进制和二进制本质上是一回事,十六进制仅仅是二进制的一种缩写形式而已。
而十进制的一位数字,从0到9,最大的数字就是9,再加1就要进位,所以用4位二进制表示十进制,就是从0000到1001,不存在1010、1011、1100、1101、1110、1111这6个数字。
BCD码如果到了1001,再加1的话,数字就变成了0001 0000这样的数字了,相当于用了8位的二进制数字表示了2位的十进制数字。
BCD码的应用还是非常广泛的,比如我们这节课要学的实时时钟,日期时间在时钟芯片中的存储格式就是BCD码,当我们需要把它记录的时间转换成可以直观显示的ASCII码时(比如在液晶上显示),就可以省去一步由二进制的整型数到ASCII的转换过程,而直接取出表示十进制1位数字的4个二进制位然后再加上0x30就可组成一个ASCII码字节了,这样就会方便的多,
比如十进制54321,用BCD码表示就是0x54321,十六进制表示0xD431。
十进制数---8421BCD码----编码后用等价的十六进制数表示
0-----------0000----------0x0
1-----------0001----------0x1
2-----------0010----------0x2
3-----------0011----------0x3
4-----------0100----------0x4
5-----------0101----------0x5
6-----------0110----------0x6
7-----------0111----------0x7
8-----------1000----------0x8
9-----------1001----------0x9
知道了编码规则,那么将2位8421bcd码编号的数,还原为十进制数也就方便了。
函数参数是一个字节那么决定了此8421BCD码是两位码即高四位是一个码值、低四位是一个码值,将高四位乘以10加上低四位码值就得到了十进制数。
byte bcd2_hex(byte val)
{
byte i;
i = val&0x0f; //按位与,i得到低四位数。
val >>= 4; //右移四位,将高四位移到低四位的位置,得到高四位码值。
val &= 0x0f; //防止移位时高位补进1,只保留高四位码值
val *= 10; //高位码值乘以10
i += val; //然后与第四位码值相加。
return i; //将得到的十进制数返回
}
ds1302是以BCD码形式存储数据,而我们从DS1302中读出的数据也是BCD码
比如读出秒放在tem中,要分别显示秒的十位与个位,shi=tem/16;ge=tem%16.
程序里的数据我们都是用的十六进制数,比如说要给DS1302一个初值,就拿秒这个数来说,我要让它一开始从30开始走,但是不能直接把30付给秒,因为30是个十进制数,也就是十六进制的1E,显然就会出问题,要给0X30才对,那如何让30转换成0X30呢,这就是付初值时的十进制转BCD码步骤:n=((n/10)<<4) + ((n%10) & 0x0f));而如果我们是从DS1302中读出数据显示:直接将数据除16,余16就可以分离十位与个位shi=n/16;ge=n%16.
10进制的24用BCD码表示是24(BCD),即00100100,变换方法就是,24/10*16+24% 10
24除10是2乘16是32,用二进制表示是00100000;
24%10是4,用二进制表示是0100,加起来就是00100100.。