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
广告