关于单片机的小问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 13:15:22
书本上不是有个DA指令嘛,好象是二转十程序要用到这个指令,但是有个程序我看不明白,主要是不明白DA,我不知道用了DA之后会变成怎么样的,因为存储器里只能放2进制的数,但最后怎么得到10进制制的数我不明白,可以举个DA指令应用的小例子吗。说明清楚也行。

BCD码转换指令;
比如说:
81D+91D=172D
而:
81H+91H=112H
这里为了将81H+91H结果与81D+91D一致,经过DA有:
DA(112H)=112H+60H=172H
虽然一个是16进制一个是10进制但172在形式上是相等的。

MOV R5,#81H
MOV A, #91H
ADD A, R5
DA A
首先81H+91H=112H,此时AC=0,Cy=1,A=12H,所以DA A后A=12H+60H=72H,AC=0,Cy=1,结果为172H,当然运算应该理解为81D+91D=172D。

比如:
mov a,#13h
da a
a的值一点变化都没有。
如果:
mov a#19h
addc a,#1 ;a的值0x1a,如果以bcd的角度来看是个错误的数值
da a ;调整后,a的值0x20,就是20的bcd

其实很简单的
十六进制:16H+16H=2CH
用DA A 指令后
十进制:16H+16H=32H

DA指令是对BCD编码的二进制数加减之后进行调整的,因为BCD编码只用到了前面十个数0x0~0x9,对于0xa~0xe是错误的,而在二进制加法后难免会产生超出0x09的编码,如十进制的5+6=11对应为0x5+0x6=0xb;前面两个都是正确的BCD编码,而和0xb就超出了编码范围,11的正确编码应该是0x11,DA命令的作用就是将运算结果(0xb)转换成正确的二进制编码(0x11)。

例如:
MOV A,#92h
add a,#10
da a

最后,A=02,CY=1,就相当与十进制的102