您现在所在的是:

单片机论坛

回帖:0个,阅读:845 [上一页] [1] [下一页]
912
honeytek
文章数:4
年度积分:50
历史总积分:912
注册时间:2008/7/29
发站内信
发表于: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  

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002