程序经过仿真调试通过,如下所示:
MOV R0, TL0
MOV R1, TH0
CLR A
MOV R2, A, ;先清零
MOV R3, A,
MOV R4, A,
MOV R5, #16 ;共转换十六位数
LOOP:
CLR C
MOV A, R0 ;从待转换数的高端移出一位到Cy
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, 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 ;共转换十六位数
;-------至此,已经把TH1 TL1中的数字,转换成BCD码,送到了R2 R3 R4。
;-------下面,分别存入R4 R3 R2 R1 R0。
MOV A, R4
MOV B, #16
DIV AB
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
RET
;完
把数值送到寄存器A中,
mov b,#10
div ab
得到的a即是商,也就是十位,b中是余数,也就是个位。
如果位数更多的话,例如三位六进制数,100关到b中,相除,得到的a中就是最高位,先存放到别的寄存器中,再
mov a,b
mov b,10
div ab
得到的a就是十位喽,b中自然是个位
就是这个原理,再想想,不难的
楼主可以到网上搜索一下,很多这样的子程序。在使用时要注意这段子程序占用了哪些存储单元,程序的入口和出口分别是什么。你可以把计数器得到的数值赋给转换子程序的入口单元,转换结束后就可以从出口的存储地址得到结果,然后做一下处理送到数码管显示。
这类程序有很多,楼主只要注意它使用了哪些存储地址即可顺利使用。
unsigned char code seg_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0--9
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00}; // A, b, C, d, E, F
是几就点亮相应的LED脚。
共阳数码管显示数字吗?0~9:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90