微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机开发中BCD码调整技巧

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

时间:12-01 来源:互联网 点击:
我是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 清除标志位,以便下次使用
RET

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top