关于BCD和格雷码

举报
ReCclay 发表于 2022/02/22 00:36:22 2022/02/22
【摘要】 写在前面的体会 1、原来关于keil的DeBug的printf用法,其实并没有像当初写这篇博文那样麻烦。 只是需要 TI = 1; 再加上 stdio.h 就行了。 2、unsigned long...

写在前面的体会

1、原来关于keil的DeBug的printf用法,其实并没有像当初写这篇博文那样麻烦。
只是需要 TI = 1; 再加上 stdio.h 就行了。

2、unsigned long 最大可达42亿,10位

BCD

BCD码,感觉以前没怎么在意,其实用的也最多了。

实际上就是4位二进制数构成0-9的1位十进制数,取值范围0000 ~ 1001。
eg: 十进制的12,8421BCD表示为0001 0010, 而=二进制数为18。

#include <stdio.h>
#include <reg52.h>

unsigned char buf[10];

void LongToBCD(unsigned long x)
{
    buf[0] = x % 10;
    buf[1] = x/10 % 10;
    buf[2] = x/100 % 10;
    buf[3] = x/1000 % 10;
    buf[4] = x/10000 % 10;
    buf[5] = x/100000 % 10;
    buf[6] = x/1000000 % 10;
    buf[7] = x/10000000 % 10;
    buf[8] = x/100000000 % 10;
    buf[9] = x/1000000000 % 10;

}

void main()
{   
    unsigned long x = 1234567890;
    TI = 1;
    LongToBCD(x);

    while(1);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

哦,对了。。还有BCD的一个知识点,
一般时钟芯片里面的都是BCD码存储格式,要把对应的BCD码转化成ASCII只需要加上0x30或者,’0’,就可以了。

格雷码

格雷码是一种无权码,可靠性比有权码高!
没有权,换言之就是我们不能一下子看出来等于几了。下面为二进制和格雷码的算法转换思路。(学习一波)

#include <stdio.h>
#include <reg52.h>

unsigned long DecToGray(unsigned long x) //十进制数转换为格雷码
{
    return x^(x>>1);
}

unsigned long GrayToDec(unsigned long x) //格雷码转换为十进制数
{
    unsigned long y=x;
    while(x>>=1)
    {
        y ^= x;
    }
    return y;
}

void main()
{
    unsigned char i;
    unsigned long x, y;
    TI = 1;
    for(i=0; i<100; i++)   
    {
        x = DecToGray(i);
        printf("格雷码:%ld    ", x);
        y = GrayToDec(x);
        printf("十进制:%ld  \n", y);

    }
    while(1);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

总结一下转换思路:

十进制数转换为格雷码,是十进制对应的二进制数右移一位后,再与自身进行异或运算。


格雷码转换为十进制数为: 格雷码不断右移,然后和自身进行异或运算直到自身右移到0。

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/78945604

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。