单片机开发中BCD码调整技巧

本人经过一年多的学习,掌握了很多单片机编程技巧,例如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 清除标志位,以便下次使用

RET

上面的两个例子经过本人实践运用,十分有用,大家可以参考一下!

永不止步步 发表于12-06 09:09 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:345941个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号