всегда пользовался этим алгоритмом, шустрый...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено incognito 22 октября 2003 г. 12:13
В ответ на: перевод из двоичной в десятичную и отображение на hd44780 отправлено sa 22 октября 2003 г. 11:28

код для пика. Число разрядов увеличить/уменьшить не сложно, догадаться вообщем можно.

;====================================================
;переводим 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
;====================================================

еще вариант

;******************************************************************
; Convert 32-bit binary number at into a bcd number
; at . Uses Mike Keitz's procedure for handling bcd
; 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:

b2bcd3 movlw 0x33
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

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru