关于BCD和格雷码
【摘要】
写在前面的体会
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)