双字节二进制转换为BCD

更新时间:2023-03-16 01:14:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

;-----------------------------------------------------------------------

;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成:

; n = [b15 ~ b0]

;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0]

;那么,写成下列形式,也就可以理解了:

; n = [b15~b12] * 4096 + [b11~b0]

;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为:

; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有:

; n = x * 4000 + {x * (100 - 4) + [b11~b0]} ;即:

; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x

;写到这里,就可以看出一点BCD码变换的意思来了。

;

;上式中后面的位:[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。

;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。 ;那么就有:

; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x

; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + [b6~b0] - 2*y

;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。

;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。

;-----------------------------------------------------------------------

从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。

编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。 做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。

感兴趣的网友可以留言,写出自己编写的程序。

51单片机把4位16进制数转成10进制数的方法

2位16进制转10进制,用除以10求商跟余数的方法,即可。

4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。 例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。 我要的是汇编的方法,C语言还没学到。 悬赏分:30 - 解决时间:2010-2-10 22:47

;------------------------------------------------------------------

最佳答案:两个字节的二进制数转换成BCD码,必须编写程序来解决。

下面把这段转换程序,写成子程序的结构,便于网友移植。 ;

程序经过仿真调试通过,如下所示:

;------------------------------------------------------------------ ;

MOV R0, TH1 MOV R1, TL1

CALL HEX2BCD ;调用子程序把R0 R1中的数字,转换成BCD码,送到R2 R3 R4 ;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0 MOV A, R4 MOV B, #16

DIV AB ;除以16,目的是分离出高、低四位 MOV R1, A ;存放十位 MOV R0, B ;存放个位 ;

MOV A, R2

MOV R4, A ;存放万位 ;

MOV A, R3 MOV B, #16 DIV AB MOV R3, A MOV R2, B

SJMP $ ;到此,完成了题目要求

;------------------------------------------------------------------ ;两个字节的二进制数转换成BCD码的程序如下: ;功能:16位二进制数变换成为 BCD 码;

;入口:R0 R1 中是 16 位二进制数,其中R0中是高 8 位;

;出口:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。 HEX2BCD: CLR A

MOV R2, A ;先清零

MOV R3, A MOV R4, A

MOV R5, #16 ;共转换十六位数

LOOP:

CLR C

MOV A, R1 ;从待转换数的高端移出一位到Cy RLC A

MOV R1, A MOV A, R0 RLC A

MOV R0, A

MOV A, R4 ;送到BCD码的低端

ADDC A, R4 ;带进位加。自身相加,相当于左移一位 DA A ;十进制调整,变成BCD码 MOV R4, A MOV A, R3 ADDC A, R3 DA A MOV R3, A MOV A, R2 ADDC A, R2 MOV R2, A

DJNZ R5, LOOP RET

;共转换十六位数

本文来源:https://www.bwwdw.com/article/c36v.html

Top