一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3201|回复: 10

[其他综合] BCD码调整技巧

[复制链接]
发表于 2014-2-14 21:49 | 显示全部楼层 |阅读模式
本帖最后由 sunny20 于 2014-2-14 21:56 编辑

我是SUNNY!本人经过一年多的学习,掌握了很多单片机编程技巧,例如C语言嵌入汇编等。俗话说得好,熟能生巧!的确如此,本人很喜欢钻研,达到很好的效果。在进行程序编程时,在某些场合,我们要进行BCD码调整。例如0x09+0x01,其结果是0x0a,因为这个是16进制运算,而这个不是我们想要的结果,我们是要0x10这个结果。那怎么办呢?其实这些运算在某些地方运用还是比较常见的,比如在时钟芯片DS1302中就要用到。如果采用转换10进制的方法来解决,不但程序长,效率低,占用资源也严重。如果采用汇编语言就简单了,汇编语言中已经考虑到这个地方,可以采用DA A这个指令来完成,如下面这个例子:
假设内存中30H的值为0x09,求加上1后的BCD码,下面是程序和解释:
MOV A,30H 把30H的值先送人累加器A,这时累加器的值为0x09
ADD A,#01H 累加器的值加上1,这时累加器的值为0x0a
DA A  累加器BCD码调整,这时累加器A的值为0x10
MOV 30H,A 把累加器A的值送回30H,实现BCD调整
RET
上面是加法的BCD码调整,比较简单,因为汇编语言已经提供了这个功能,但是减法呢?很遗憾,汇编语言并没有提供减法的BCD码调整,那是不是就没辙了呢?答案是否定的!我们知道,一个数如果低位不够减时,要向高位借1,在51单片机中,其借位标志就是AC,我们可以利用AC是否为1来进行判断,如果出现借位,就要进行BCD码调整。但是减法并没有调整指令,怎么办?我们知道,16进制与10进制其实只是相差6,只要在发生借位时将值减去6就OK了!哈哈...我是不是很聪明?哈哈...自夸一下!好了,光说没有用,做出来才是真的!下面看例子:
假设内存中30H的值为0x10,求减去1的BCD码。下面是程序和解释:
MOV A,30H 将30H的值送人累加器A
SUBB A,#01H 累加器A的值减去1 ,这时累加器的值为0x0f
JB AC,NEXT 判断借位标志,如果为1说明发生借位,进行下一步处理
MOV 30H,A 借位为0,直接送回30H
RET
NEXT:
SUBB A,#06H 发生借位,减去6,调整为BCD码,这时累加器A的值为0x09
MOV 30H,A  把值送回30H,OK!搞定
CLR AC 清除AC标志,以便下次使用
RET
上面的两个例子经过本人实践运用,十分有用,大家可以参考一下!


发表于 2014-2-14 22:21 | 显示全部楼层
C怎么解决?
回复

使用道具 举报

 楼主| 发表于 2014-2-14 22:23 | 显示全部楼层
在C语言中嵌入我这个汇编程序就搞定了!
回复

使用道具 举报

发表于 2014-2-15 10:50 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

发表于 2014-2-15 10:56 | 显示全部楼层
本帖最后由 8055 于 2014-2-15 10:58 编辑

楼主的确爱琢磨灵活地运用了标志位AC,不知道在特殊情形下是否有冲突。
回复

使用道具 举报

发表于 2014-2-15 11:29 | 显示全部楼层
说实话...汇编不懂...也不想搞汇编...
回复

使用道具 举报

发表于 2014-2-15 12:59 | 显示全部楼层
我懒,从来不清除C标志的,只有在要用到这些标志位时,在运算之前才清除(理论上是不需要清除的,只是有一次在运算之前没清除感觉程序执行错误,之后的程序只要需要用到那些标志位的都在运算之前清除一次)
回复

使用道具 举报

发表于 2014-3-4 00:13 | 显示全部楼层
减法也可以啊  BCD码加上0x99 再DA调整,实际上就是减1了

MOV A,30H 把30H的值先送人累加器A,
ADD A,#99H 累加器的值加上0x99,
DA A  累加器BCD码调整,
MOV 30H,A 把累加器A的值送回30H,实现BCD调整
RET(
回复

使用道具 举报

 楼主| 发表于 2014-3-4 12:15 | 显示全部楼层
楼上的朋友也是一种方法
回复

使用道具 举报

发表于 2014-3-4 12:19 | 显示全部楼层
加法,直接判断有没有大于9,如果大于9,加个6,

减法,判断有没有大于9,大于9,减去6
回复 1 0

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 21:02 , Processed in 0.033157 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表