发表于:2008/8/1 17:12:00
#0楼
用89C51显示一个16位的二进制数,例如:显示“9999”。(9999=270FH=0010011100001111B)本程序将“9999”(即270FH)拆开放在R2和R3中,先将此十六进制数转换并组合成BCD码,再将组合的CBD码分开并放入显示缓冲区更新数据,最后显示。现在问题是:显示结果却为“9099”,百位不对,为什么百位显“0”而不是“9”???我想爆脑子都想不出来,请哪位好的大哥帮忙解释一下,万分感谢!!
;********将十六进制数转换并组合成BCD码************************
MOV R2,#27H ;放显示值的高8位 显示“9999”
MOV R3,#0FH ;放显示值的低8位
LCALL NEXT
MOV 31H,R5
MOV 32H,R6
LCALL READ
LCALL DIS
RET
NEXT:CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#10H
LOOP:CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
RET
;*************将组合的CBD码分开并放入显示缓冲区更新数据********************
READ:MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV R0,#20H
MOV A,31H
SWAP A
XCHD A,@R0
INC R0
SWAP A
XCH A,@R0
MOV A,32H
INC R0
SWAP A
XCHD A,@R0
INC R0
SWAP A
XCH A,@R0
MOV A,20H ;高位为零不显示
JNZ FF
MOV 20H,#0BH ;0BH=11=1011B
MOV A,21H
JNZ FF
MOV 21H,#0BH
MOV A,22H
JNZ FF
MOV 22H,#0BH
FF:RET
;***********************显示程式*******************
DIS:MOV R0,#20H ;设R0的指针
MOV R1,#01000000B ;用于选位显。
MOV R3,#04H ;用于显示四位,所以扫描四次。
DIS1:MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P3,A
INC R0
MOV A,R1
MOV P1,A
RR A
MOV R1,A
延时一下
DJNZ R3,DIS1
RET
TAB:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,00H,50H ;0123456789
;********将十六进制数转换并组合成BCD码************************
MOV R2,#27H ;放显示值的高8位 显示“9999”
MOV R3,#0FH ;放显示值的低8位
LCALL NEXT
MOV 31H,R5
MOV 32H,R6
LCALL READ
LCALL DIS
RET
NEXT:CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#10H
LOOP:CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
RET
;*************将组合的CBD码分开并放入显示缓冲区更新数据********************
READ:MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV R0,#20H
MOV A,31H
SWAP A
XCHD A,@R0
INC R0
SWAP A
XCH A,@R0
MOV A,32H
INC R0
SWAP A
XCHD A,@R0
INC R0
SWAP A
XCH A,@R0
MOV A,20H ;高位为零不显示
JNZ FF
MOV 20H,#0BH ;0BH=11=1011B
MOV A,21H
JNZ FF
MOV 21H,#0BH
MOV A,22H
JNZ FF
MOV 22H,#0BH
FF:RET
;***********************显示程式*******************
DIS:MOV R0,#20H ;设R0的指针
MOV R1,#01000000B ;用于选位显。
MOV R3,#04H ;用于显示四位,所以扫描四次。
DIS1:MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P3,A
INC R0
MOV A,R1
MOV P1,A
RR A
MOV R1,A
延时一下
DJNZ R3,DIS1
RET
TAB:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,00H,50H ;0123456789