在8051中将BCD转换为二进制

在此问题中,我们将看到如何将8位BCD编号转换为其等效的二进制(十六进制)。BCD编号存储在位置20H。转换后,结果将存储在30H。

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

地址






20小时
94
21小时












程序

   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获得输出。

输出结果

地址






20小时
94
21小时







30小时
5E
31小时








方法2

我们也可以使用其他逻辑来做同样的事情。在这里,不需要其他循环即可完成任务。我们只是将BCD号码的第十数字与0AH相乘。然后将第二个数字与结果相加以获得数字。 

如果数字为94,则它将0AH乘以9。

(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