Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

(8051) how to convert a 16 bit hex number to dec number?

Status
Not open for further replies.

JerryYiu

Newbie level 1
Joined
Nov 16, 2009
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,286
MOV A,R2 (100)
MOV B,#10
DIV A,B

RET

I found this one somewhere but the DIV A,B can only deal with 8 bit, what is the code for 16-bit convert?

please explain the concept and give me a sample code,
thanks a lot.
 

Do some homework and modify this code to operate with 2-bytes only ..

Code:
; HEXA TO DECIMAL
;
; HEXA INPUT 8 BYTES AT                XX0.XX1.XX2.XX3.XX4.XX5.XX6.XX7
; USES AS DECIMAL NUMBER ADDER:        YY0.YY1.YY2.YY3.YY4.YY5.YY6.YY7.YY8
; DECIMAL OUTPUT 9 BYTES AT:           ZZ0.ZZ1.ZZ2.ZZ3.ZZ4.ZZ5.ZZ6.ZZ7.ZZ8
;
; In my case, the yy8 and zz8 is never used in this routine, but all
; this 26 bytes are consecutive in address, being xx0 the lowest one.
;
X2D:         CALL  CLEARYZ             ;;Clear All YY and ZZ bytes
             MOV   YY0,#1              ;;DECIMAL ADDER = 1
             ;                         ;;
             MOV   R0,#XX7             ;;LOCATE HOW MANY BYTES WITH DATA
             MOV   B,#8                ;;POSSIBLE 8 BYTES W/DATA ON XX
BITS1:       MOV   A,@R0               ;;GET BYTE FROM INPUT REGISTER
             CJNE  A,#0,BITS2          ;;JUMP IF FOUND THE FIRST NON ZERO
             DEC   R0                  ;;GO TO LOWER BYTE
             DJNZ  B,BITS1             ;;ONE BYTE DONE, GO AGAIN
                                       ;;
BITS2:       MOV   A,#8                ;;8 BITS PER BYTE, B CONTAINS BYTE #
             MUL   AB                  ;;A = QUANTITY OF BITS W/DATA
             MOV   BITS,A              ;;SAVE
             CJNE  A,#0,X2DMAIN2       ;;B = NUMBER OF DIGITS W/DATA
             RET                       ;;RETURN IF ONLY ZEROS AT XX
                                       ;;
X2DMAIN1:    CALL  X2DSHIFTD           ;;SHIFT DECIMAL RESULT
X2DMAIN2:    CALL  X2DSHIFTH           ;;SHIFT HEXA
             JNC   X2DMAIN3            ;;IF NOT CARRY, JUST SKIP IT
             CALL  X2DADD              ;;ADD NEW RESULT
X2DMAIN3:    DJNZ  BITS,X2DMAIN1       ;;ONE BIT DONE, GO AGAIN
             RET                       ;;GENERAL EXIT FROM THIS ROUTINE
                                       ;;ZZ0 - ZZ7 CONTAINS DECIMAL RESULT
                                       ;;
X2DSHIFTD:   MOV   R0,#YY0             ;;YY * 2  (DECIMAL)
             MOV   B,#8                ;;NUMBER OF BYTES
             CLR   C                   ;;NEED CARRY ZERO
X2DSHIFTD1:  MOV   A,@R0               ;;IGNORE LAST CARRY
             ADDC  A,@R0               ;;ADD BYTE TO ITSELF
             DA    A                   ;;DECIMAL ADJUST
             MOV   @R0,A               ;;PUT IT BACK
             INC   R0                  ;;GO TO UPPER BYTE
             DJNZ  B,X2DSHIFTD1        ;;DO IT 8 BYTES
             RET                       ;;RETURN
                                       ;;
X2DSHIFTH:   MOV   R0,#XX7             ;;SHIFT XX7 --> XX0 RIGHT 1 BIT
             MOV   B,#8                ;;NUMBER OF BYTES
SHIFTR0B:    CLR   C                   ;;NEED CARRY ZERO
SHIFTR0B1:   MOV   A,@R0               ;;GET BYTE
             RRC   A                   ;;ROTATE RIGHT THROUGH CARRY BIT
             MOV   @R0,A               ;;SAVE IT BACK
             DEC   R0                  ;;GO TO LOWER BYTE
             DJNZ  B,SHIFTR0B1         ;;DO IT AGAIN "B" TIMES
             RET                       ;;RETURN
                                       ;;
X2DADD:      MOV   R0,#ZZ0             ;; GET RESULT ZZ 8 BYTES REGISTER
             MOV   B,#8                ;; 8 BYTES
             MOV   R1,#YY0             ;; GET YY OPERATOR
             CLR   C                   ;; NEED CARRY OFF
X2DADD1:     MOV   A,@R0               ;; ZZ = ZZ + YY (8BYTES) W/DAA
             ADDC  A,@R1               ;; ADD BYTE TO BYTE 8 TIMES
             DA    A                   ;; DECIMAL ADJUST
             MOV   @R0,A               ;; PUT IT BACK
             INC   R0                  ;; BUMP POINTER NEXT BYTE
             INC   R1                  ;; BUMP POINTER NEXT BYTE
             DJNZ  B,X2DADD1           ;; ONE BYTE DONE, GO AGAIN
             MOV  A,ZZ8                ;; LAST CARRY TO 9TH BYTE OF ZZ
             ADDC A,#0                 ;; JUST CARRY TO ZZ8
             MOV  ZZ8,A                ;;
             RET                       ;; RETURN

Rgds,
IanP
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top