现在,我们将看到如何使用8051将十六进制数转换为其等效的ASCII。此程序可以将0-9和AF转换为其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。
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 0EH |
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 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。
输出结果
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 0EH |
21小时 | |
。 。 。 | |
30小时 | 45小时 |
31小时 | |
。 。 。 |