用MCS51单片机语言编程实现将存入0600H~0603H单元中的四个十进制数分别为12,34,56,78压缩BCD码,转换成二进制数码(用十六进制数表示),并存入起始地址为20H~23H的内存单元中
时间: 2024-03-19 12:43:53 浏览: 63
16位二进制转化为BCD码
好的,这是一个很具体的编程问题。首先,我们需要将存储在0600H~0603H单元中的四个十进制数转换为BCD码。对于每个十进制数,我们需要将其拆分为十位和个位,然后将这两个数字压缩在一个字节中,以BCD码的形式存储。具体实现如下:
```assembly
MOV DPTR, #0600H ; 将DPTR指向存储数据的起始地址
MOV R0, #0 ; R0用于循环计数
LOOP:
MOV A, @DPTR ; 读取存储在DPTR所指向的地址中的十进制数
MOV B, #10 ; 除数为10,用于计算十位和个位
DIV AB ; 将十进制数除以10,商在A中,余数在B中
MOV R1, A ; R1保存十位
MOV A, B
MOV B, #0 ; 将B清零,用于计算个位
DIV AB ; 将余数除以10,商在A中,余数在B中
MOV R2, A ; R2保存个位
MOV A, R1 ; 将十位保存到A中
SWAP A ; 将A的高4位和低4位交换
ADD A, #30H ; 将A的值加上30H,转换为ASCII码
MOV @R0, A ; 将A的值存储到R0所指向的地址中
MOV A, R2 ; 将个位保存到A中
SWAP A ; 将A的高4位和低4位交换
ADD A, #30H ; 将A的值加上30H,转换为ASCII码
MOV @R0, A ; 将A的值存储到R0所指向的地址中
INC R0 ; R0加1,指向下一个地址
INC R0
INC DPTR ; DPTR指向下一个存储的十进制数
DJNZ R0, LOOP ; 如果R0不为0,继续循环
```
接下来,我们需要将BCD码转换为二进制数码,并将其存储在起始地址为20H~23H的内存单元中。对于每个压缩的BCD码,我们需要将其解压缩为十位和个位,然后将这两个数字合并在一起,得到二进制数码。具体实现如下:
```assembly
MOV DPTR, #0600H ; 将DPTR指向存储数据的起始地址
MOV R0, #20H ; 将R0指向存储二进制数码的起始地址
LOOP:
MOV A, @DPTR ; 读取存储的BCD码
MOV R1, A ; R1保存压缩的BCD码
ANL A, #0FH ; 将低4位取出,得到个位
MOV R2, A ; R2保存个位
MOV A, R1
SHR A, #4 ; 将高4位右移4位,得到十位
MOV R3, A ; R3保存十位
MOV A, R2 ; 将个位保存到A中
ADD A, #0 ; 将A的值加上0,转换为二进制数码
MOV @R0, A ; 将A的值存储到R0所指向的地址中
MOV A, R3 ; 将十位保存到A中
ADD A, #0 ; 将A的值加上0,转换为二进制数码
MOV @R0, A ; 将A的值存储到R0所指向的地址中
INC R0 ; R0加1,指向下一个地址
INC DPTR ; DPTR指向下一个存储的BCD码
DJNZ R0, LOOP ; 如果R0不为0,继续循环
```
这样,就将存储在0600H~0603H单元中的四个十进制数分别为12,34,56,78压缩BCD码,转换成二进制数码,并存入起始地址为20H~23H的内存单元中了。
阅读全文