此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处
十六进制和BCD码之间的相互转换是C语言程序设计以及单片机编程中经常会碰到的事情。 我在日常工作中也碰到了这样的情况,所以就写了两段程序:一个是BCD码转十六进制,另一个是十六进制转BCD码,功能实现后,就随手发了两个帖子到EEWORLD,分享一下,大家一起学习。
本帖实现的是十六进制到BCD码的转换。
我们知道,计算机和单片机中数据的存储都是以二进制数存储的,但是使用过程中为简化起见,一般都以十六进制数(HEX)来表达。而BCD码就是我们一般俗称的8421码(当然,还有2421BCD码,5421BCD码,这两种不常用,本帖中我们指的是8421BCD码)。
因为在计算机或单片机中最常用的是单字节、2字节、4字节的数据,所以本帖中,我们分别做了这三种数据类型的十六进制转BCD码的转换。
另外,根据网友意见,将该程序分开几部分,分别实现单字节、2字节、4字节的hex转BCD码,这样看起来、用起来更方便一些。
特别说明:既然有了HEX转BCD的过程,那也会有BCD转换HEX的逆过程。所以我也搞了这个转换的。另外发了一个帖子,有兴趣的话可以看一下。
单字节,100以内的hex转BCD
- void HEXtoBCDData(void)
- {
- unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
- unsigned int uiHEXdata = 0;
- unsigned long int ulHEXdata = 0;
- //单字节十六进制数转BCD码,并且转换出来的BCD码的最大值为99,超过99就要用两个字节装载BCD码
- ucHEXdata[0] = 0x63; //十进制为99
- ucBCDdata[0] = (ucHEXdata[0]/10)*0x10 + (ucHEXdata[0]%10);
- //ucBCDdata[0]=99;//转换出来的
-
- }
单字节0~255以内的hex转BCD- void HEXtoBCDData(void)
- {
- unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
- unsigned int uiHEXdata = 0;
- unsigned long int ulHEXdata = 0;
-
- //单字节十六进制数转BCD码,并且转换出来的BCD码的超过99
- ucHEXdata[0] = 0xf5; //十进制为245
- ucHEXdata[1] = ucHEXdata[0]/100;
- ucHEXdata[2] = ucHEXdata[0]%100;
- ucBCDdata[0] = ucHEXdata[1];
- ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
- //ucBCDdata[1]=2,ucBCDdata[0]=45
-
- }
2字节的hex转BCD
- void HEXtoBCDData(void)
- {
- unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
- unsigned int uiHEXdata = 0;
- unsigned long int ulHEXdata = 0;
-
- //2字节十六进制数转BCD码,2字节十六进制数最大值为0xffff=65535,所以转换出来的BCD码需要用3个字节装载
- uiHEXdata = 0xfff5; //十进制为65525
- ucHEXdata[1] = uiHEXdata%100;
- ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
- uiHEXdata = uiHEXdata/100;
- ucHEXdata[2] = uiHEXdata%100;
- ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
- uiHEXdata = uiHEXdata/100;
- ucHEXdata[3] = uiHEXdata%100;
- ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
- //ucBCDdata[2]=6,ucBCDdata[1]=55,ucBCDdata[0]=25
-
-
- }
4字节的hex转BCD
- void HEXtoBCDData(void)
- {
- unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
- unsigned int uiHEXdata = 0;
- unsigned long int ulHEXdata = 0;
-
- //4字节十六进制数转BCD码,2字节十六进制数最大值为0xffffffff=4294967295,所以转换出来的BCD码需要用5个字节装载
- ulHEXdata = 0xfffffff5; //十进制为4294967285
- ucHEXdata[1] = ulHEXdata%100;
- ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
- ulHEXdata = ulHEXdata/100;
- ucHEXdata[2] = ulHEXdata%100;
- ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
- ulHEXdata = ulHEXdata/100;
- ucHEXdata[3] = ulHEXdata%100;
- ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
- ulHEXdata = ulHEXdata/100;
- ucHEXdata[4] = ulHEXdata%100;
- ucBCDdata[3] = (ucHEXdata[4]/10)*0x10 + (ucHEXdata[4]%10);
- ulHEXdata = ulHEXdata/100;
- ucHEXdata[5] = ulHEXdata%100;
- ucBCDdata[4] = (ucHEXdata[5]/10)*0x10 + (ucHEXdata[5]%10);
- //ucBCDdata[4]=42,ucBCDdata[3]=94,
- //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=85
-
-
- }
4字节的hex转BCD,优化程序
- void HEXtoBCDData(void)
- {
- unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
- unsigned int uiHEXdata = 0;
- unsigned long int ulHEXdata = 0;
-
- //4字节十六进制数转BCD码,可以做成一个循环转换的程序
- ulHEXdata = 0xfffffff4; //十进制为42 94 96 72 84
- for(int i=0;i<5;i++)
- {
- ucHEXdata=ulHEXdata%100;
- ulHEXdata=ulHEXdata/100;
- ucBCDdata=(ucHEXdata/10)*0x10+ucHEXdata%10;
- }
- //ucBCDdata[4]=42,ucBCDdata[3]=94,
- //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=84
- }
本帖最后由 tiankai001 于 2018-12-3 18:19 编辑