8051中的十六进制到ASCII转换
现在我们将学习如何使用8051将十六进制数转换为其ASCII等效值。此程序可以将0-9和A-F转换为其ASCII值。
我们知道00H的ASCII码是30H(48D),09H的ASCII码是39H(57D)。所以所有其他数字都在30H到39H的范围内。0AH的ASCII值是41H(65D),0FH的ASCII值是46H(70D),所以所有其他字母(B、C、D、E)都在41H到46H的范围内。
这里我们在内存位置20H提供十六进制数字,ASCII等效值存储在位置30H。
地址 | 值 |
---|---|
. . . | |
20H | 0EH |
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 CLRC; Clear the Carry Flag SUBBA,#0AH;Subtract 0AH from A JCNUM ; When a carry is present, A is numeric ADDA,#41H;Add41H for Alphabet SJMPSTORE; Jump to store the value NUM: MOVA,R2; Copy R2 to A ADDA,#30H; Add 30H with A to get ASCII STORE: MOVR0,#30H; Point the destination location MOV@R0,A; Store A content to the memory location pointed by R0 HALT: SJMPHALT
十六进制到ASCII转换背后的逻辑非常简单。我们只是检查数字是否在0-9范围内。当数字在这个范围内时,十六进制数字是数字,我们只需简单地加上30H即可得到ASCII值。当数字不在0-9范围内时,数字在A-F范围内,因此在这种情况下,我们将数字转换为41H及以后。
在程序中,首先,我们清除进位标志。然后从给定的数字中减去0AH。如果值是数字,则减法后的结果将为负数,因此进位标志将被设置。现在通过检查进位状态,我们可以简单地将30H与该值相加以获得ASCII值。
另一方面,当减法的结果为正数或0时,我们将41H与减法的结果相加。
输出
地址 | 值 |
---|---|
. . . | |
20H | 0EH |
21H | |
. . . | |
30H | 45H |
31H | |
. . . |
广告