锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-05-09 23:07:10

我是!本人经过一年多的学习,掌握了很多单片机编程技巧,例如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, 判断借位标志,如果为1说明发生借位,进行下一步处理
MOV 30H,A 借位为0,直接送回30H
RET
NEXT:
SUBB A,#06H 发生借位,减去6,调整为BCD码,这时累加器A的值为0x09
MOV 30H,A 把值送回30H,OK!搞定
CLR AC 清除标志位,以便下次使用
RET

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


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章