单片机中如何将BCD码拆开_解析BCD码 - 单片机技术宅的个人空间 - OSCHINA - 中文开源技术交流社区...

戳上面的蓝字关注我们哦!

近日有朋友问起BCD码,在此我们就来说说这BCD码。为什么会有BCD码?由于日常生活中,人们最熟悉的数制是十进制,但计算机内部通常采用2进制和十六进制的形式读写,专业人员理解没问题,但是我们大众要理解2进制,16进制就有些困难了,因此专门规定了一种二进制的十进制码,称为BCD码,它是一种以二进制表示的十进制数码。

二进制编码的十进制数,简称BCD码(Binarycoded Decimal),我们又常叫它8421码,这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。 十进制数和8421BCD编码和16进制数的对应关系如下:

十进制数---8421BCD码----十六进制数

0-----------0000----------0x00    1-----------0001----------0x01    2-----------0010----------0x02    3-----------0011----------0x03    4-----------0100----------0x04    5-----------0101----------0x05    6-----------0110----------0x06    7-----------0111----------0x07

8-----------1000----------0x08    9-----------1001----------0x09

由上面的编码可以 ,

知道了编码规则,那么将2位BCD码,还原为十进制数就简单了。具体编程函数如下,函数中参数val是一个字节数,那么此BCD码是两位的BCD码,即高四位是一个码值、低四位是一个码值,所以将高四位乘以10加上低四位码值就得到了十进制数。

unsigned char bcd2(byte val){unsigned chari;    i = val&0x0f; //按位与,i得到低四位数。    val >>= 4; //右移四位,将高四位移到低四位的位置,得到高四位码值。    val =val&0x0f; //防止移位时高位补进1,只保留高四位码值    val= val*10; //高位码值乘以10i= val+i; //然后与低四位码值相加。    return i;    //将得到的十进制数返回}

以上运算后返回的变量i就是十进制数了。

其实在实际运用中,我们也没必要做这样的运算,直接用BCD码的十六进制数就好,比如在时钟芯片DS1302运用中,从DS1302中读取到的时间数据就是BCD码的,那我们现实出来的,人们习惯看到的都是十进制的数,这里我们用个小技巧,大家看上面的编码的对应关系,四位的BCD码,刚好对应一个8位数的十六进制中的四位,比如十六进制0x23,对应的BCD码是0010 0011,也就说十六进制的十位对应一个4位的BCD码,个位又对应一个BCD码,恰巧这个BCD码对应的十进制数就是十六进制的十位和各位,也就说0x23中的2,对应0010,又对应十进制的2,这样一来,我们做显示的时候,直接把十六进制的BCD码除以16,这样就分离出BCD码的十位,余数就是各位,这样显示出来的就是十进制了,其实除以16就是把变量右移4位,在C中右移1位等译除以2,所以除以16就等于右移4位,得到的是高四位,余数自然是低四位,道理和上面的是一样的。例如下面程序:

void lcm_w_yy(void){

yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中

lcm_w_test(0,0x80);

lcm_w_word("20");//显示内容字符20

lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示

lcm_w_test(1,yy%16+0x30);//函数参数1,代表本行写数据,YY%得出年个位数字的显示码地址,送显示

}

这里程序中的除以16就是做分离十位和个位用的,其实质就是右移4位取高四位,余数为低四位。

到此,BCD码的转换讲完啦,直接手敲进去的,有错的请大家指出,有不懂的可以加微信:dianzi126,大家一起交流学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值