打印

这个原理是什么?

[复制链接]
2380|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西门闩|  楼主 | 2011-7-4 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uchar BCD_Decimal(uchar bcd)
{
   uchar  Decimal;
   Decimal=bcd>>4;
   return(Decimal=Decimal*10+(bcd&=0x0F));
}
bcd是从DS1302里面读出的数据,“Decimal=Decimal*10+(bcd&=0x0F));”这一句就是人们所说的将十六进制转成BCD码吗?但DS1302里面本来读出的就是BCD码啊?为什么还要转一次呢?
另一个:
temp=(miao+1)/10*16+(miao+1)%10;
当我按一下按键,秒位加1,然后通过程序输入到DS1302里面,但是这一句为什么要乘以16呢?是什么原理?
沙发
yewuyi| | 2011-7-4 17:13 | 只看该作者
这看上去更像是把ASCII码转换为10进制。

BCD变量中高4位是10进制的‘十’位,低4位是10进制的‘个’位。

Decimal=bcd>>4;执行这个后, Decimal即为BCD的高4位,Decimal=Decimal*10+(bcd&=0x0F);则把十位和各位相加。

一般RTC芯片中的秒、分、小时等寄存器都采用这种编码方式,仔细看DS1302的DATASHEET去吧。

使用特权

评论回复
板凳
西门闩|  楼主 | 2011-7-5 09:07 | 只看该作者
看过了,就是不明白“DS1302里面本来读出的就是BCD码啊?为什么还要转一次呢?”,另一个“temp=(miao+1)/10*16+(miao+1)%10;
当我按一下按键,秒位加1,然后通过程序输入到DS1302里面,但是这一句为什么要乘以16呢?是什么原理?”,请高手帮忙看看,谢了!

使用特权

评论回复
地板
yewuyi| | 2011-7-5 09:46 | 只看该作者
看过了,就是不明白“DS1302里面本来读出的就是BCD码啊?为什么还要转一次呢?”,另一个“temp=(miao+1)/10*16+(miao+1)%10;
当我按一下按键,秒位加1,然后通过程序输入到DS1302里面,但是这一句为什么要乘以16呢 ...
西门闩 发表于 2011-7-5 09:07


可能原作者是为了偏于计算吧,作用就是把BCD转成10进制数值,具体为什么要这样转,那是原作者的事情,你不需要,可以不借鉴

使用特权

评论回复
5
jingtao2011| | 2011-7-5 09:47 | 只看该作者
:)

使用特权

评论回复
6
251566208| | 2011-7-5 09:47 | 只看该作者
7段LED显示

使用特权

评论回复
7
251566208| | 2011-7-5 09:48 | 只看该作者
显示是用IO控制的
*16就是高四位

使用特权

评论回复
8
yewuyi| | 2011-7-5 11:54 | 只看该作者
7段LED显示
251566208 发表于 2011-7-5 09:47


你不妨讲讲这段代码和7段LED有什么关系?

如果分析不出来,可就是瞎说了哦。

使用特权

评论回复
9
Light_David| | 2011-7-11 21:42 | 只看该作者
不明白temp=(miao+1)/10*16+(miao+1)%10
看来第一个你也么看懂,
前面一个是将压缩BCD码转为16进制(确切说是转为二进制);
后一个是将16进制转为压缩BCD码.
这是一对程序;

前面那个,叶斑已经解释的很清楚,
后面那个改为temp=(((miao+1)/10)<<4)+((miao+1)%10);会不会好理解一些呢;

  刚好和上面那段程序反过来,是将miao+1后取‘十’位;并移到前4位位置,也就是*16;后面取10的余数,直接和什么的结果相加合成压缩BCD;

具体作者为什么要转换,应该也很简单,BCD这个东西在使用汇编时确实很好用(特别是上面提到的数码管显示),但是在C里面却没啥优势了,作者可能是为了将最终的算法统一,所以才转一下子;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

287

帖子

1

粉丝