|
код для пика. Число разрядов увеличить/уменьшить не сложно, догадаться вообщем можно.
;====================================================
;переводим 4х байтное число из дв. кода в десятичный.
;====================================================
B2_BCD BCF STATUS,C
MOVLW .32
MOVWF COUNTER
CLRF RL
CLRF R0
CLRF R1
CLRF R2
CLRF R3
LOOP32 RLF TEMP_DATA_4,F ; LOW
RLF TEMP_DATA_3,F ; L_MEDIUM
RLF TEMP_DATA_2,F ; H_MEDIUM
RLF TEMP_DATA_1,F ; HEAVY
RLF R3,F
RLF R2,F
RLF R1,F
RLF R0,F
RLF RL,F
DECFSZ COUNTER,F
GOTO adjDEC
RETURN
adjDEC MOVLW R3
MOVWF FSR
CALL adjBCD
MOVLW R2
MOVWF FSR
CALL adjBCD
MOVLW R1
MOVWF FSR
CALL adjBCD
MOVLW R0
MOVWF FSR
CALL adjBCD
MOVLW RL
MOVWF FSR
CALL adjBCD
GOTO LOOP32
adjBCD MOVLW .3
ADDWF INDF,W
MOVWF TEMP
BTFSC TEMP,3 ; test if result > 7
MOVWF INDF
MOVLW 030h
ADDWF INDF,W
MOVWF TEMP
BTFSC TEMP,7 ; test if result > 7
MOVWF INDF ; save as MSD
RETURN
;====================================================
еще вариант
;****************************************************************** b2bcd3 movlw 0x33
E-mail:
info@telesys.ru
; Convert 32-bit binary number at
; at
; adjust; Modified Microchip AN526 for 32-bits.
; 2.25 mS
;******************************************************************
b2bcd movlw .32 ; 32-bits
movwf ii ; make cycle counter
clrf bcd ; clear result area (high bit)
clrf bcd+1
clrf bcd+2
clrf bcd+3
clrf bcd+4 ; low
b2bcd2 movlw bcd ; make pointer
movwf fsr
movlw .5
movwf cnt
; Mike's routine:
addwf indf,f ; add to both nybbles
btfsc indf,3 ; test if low result > 7
andlw 0xf0 ; low result >7 so take the 3 out
btfsc indf,7 ; test if high result > 7
andlw 0x0f ; high result > 7 so ok
subwf indf,f ; any results <= 7, subtract back
incf fsr,f ; point to next
decfsz cnt,f
goto b2bcd3
rlf bin+3,f ; get another bit
rlf bin+2,f
rlf bin+1,f
rlf bin+0,f ; high
rlf bcd+4,f ; put it into bcd
rlf bcd+3,f
rlf bcd+2,f
rlf bcd+1,f
rlf bcd+0,f ; high
decfsz ii,f ; all done?
goto b2bcd2 ; no, loop
return ; yes
Ответы