单片机开发中BCD码调整技巧
假设内存中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
上面的两个例子经过本人实践运用,十分有用,大家可以参考一下!
单片机BCD码调整技 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)