前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解析BCD码

解析BCD码

作者头像
单片机技术宅
发布2020-03-17 10:02:50
2.4K0
发布2020-03-17 10:02:50
举报
文章被收录于专栏:初学单片机
近日有朋友问起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 char i; i = val&0x0f; //按位与,i得到低四位数。 val >>= 4; //右移四位,将高四位移到低四位的位置,得到高四位码值。 val =val&0x0f; //防止移位时高位补进1,只保留高四位码值 val= val*10; //高位码值乘以10 i= 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,大家一起交流学习。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单片机技术宅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档