8051中的BCD到二进制转换


在这个问题中,我们将了解如何将8位BCD数转换为其二进制(十六进制)等效值。BCD数存储在20H位置。转换后,结果将存储在30H。

因此,假设数据为D5H。程序将D5H的二进制值转换为BCD值213D。

地址



.
.
.
20H
94
21H








.
.
.


程序

   MOVR0,#20H; Initialize the address of the data
   MOVA,@R0;Get the data from an address, which is stored in R0
   MOVR2,A; Store the content of A into R2
   
   CLRA;Clear the content of A to 00H
   MOVR3,#00H
LOOP:   ADDA,#01H;increment A by 01H
   DAA; Decimal Adjust of the accumulator content
   INCR3; Increase R3 to keep track of the hex value
   CJNEA,02H,LOOP ;Run the loop until A = R2

MOVR0,#30H; Point the destination location
MOVA,R3; Move R3 to A
MOV@R0,A; Store A content to the memory location pointed by R0
HALT:   SJMPHALT

这里的逻辑非常简单。我们只是从内存中获取数字。并将该值存储到R2中。通过此值,我们可以在执行循环时进行比较。

累加器(A)和寄存器R3最初设置为00H。因此,我们只是将A的值增加01H。我们可以使用**INC A**指令递增值,但在这种情况下,值是使用**ADDA, #01H**递增的。其背后的原因是INC指令不会影响CY和AC标志。但是,这些标志需要使用**DA A**指令进行十进制调整。在增加A的值后,执行DA A指令将值转换为十进制。通过使用此十进制值,我们可以将其与存储在R2中的数字进行比较。在每次迭代中,R3的值递增1,这充当计数器。因此,最后,我们从寄存器R3获取输出。

输出

地址



.
.
.
20H
94
21H




.
.
.
30H
5E
31H




.
.
.


方法2

我们也可以使用其他一些逻辑来做同样的事情。这里不需要额外的循环来完成任务。我们只需将BCD数的十位数字乘以0AH。然后将第二位数字与结果相加即可得到该数。

如果数字是94,则将其乘以9的0AH。

(9 * 0AH) = 5AH, thenadding 4 with 5AH. (5AH + 4) = 5EH.


程序

MOVR0,#20H; Initialize the address of the data
MOVA,@R0; Get the data from an address, which is stored in R0
MOVR2,A;Store the content of A into R2
SWAPA; Swap the nibbles of A register
ANLA,#0FH;Mask the Higher Nibble of A
MOVB,0AH;Take 0AH = 10D into B
MULAB ;Multiply A with B, and get result into A
MOVA,R2;Copy R2 content to A
ANLA,#0FH;Mask the higher nibble of A
ADDA,R2
MOVR0,#30H;Point the destination location
MOVA,R3;Move R3 to A
MOV@R0,A;Store A content to memory location pointed by R0
HALT:   SJMPHALT

更新于: 2020年6月27日

3K+ 浏览量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告