Отговори на тема  [ 17 мнения ]  Отиди на страница Предишна  1, 2
Превръщане на 32BITово число в ASCII символи... 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
edi написа:
mndsl написа:
Да има...

Ясно.Ще го мисля на асемблер за сега.

Използвам следният код на асемблер:
Код:
#define _IRP   STATUS,7
#define _RP1    STATUS,6
#define _RP0    STATUS,5
#define _NOT_TO STATUS,4
#define _NOT_PD STATUS,3
#define _Z      STATUS,2
#define _DC     STATUS,1
#define _C      STATUS,0

   CBLOCK   0x20
      temp, count
      bcd1,bcd0
      h3,h2,h1,h0
      d4,d3,d2,d1,d0
   ENDC

;********************************************************************
; BCDtoASCII()- Convert BCD code from W to appropriate ASCII code in
; destination [bcd1:bcd0] . ( Low byte is in bcd0, and high byte in bcd1 )
;********************************************************************
BCDtoASCII:
   movwf   bcd0
    swapf   bcd0,W      ; Get high nibble
    andlw   0x0F
    addlw   0x30
    movwf   bcd1      ; Store high nibble in bcd1
    movf      bcd0,W      ; Get low nibble
    andlw   0x0F
    addlw   0x30
    movwf   bcd0      ; Store low nibble in bcd0
    return

;********************************************************************
adjBCD:
     movlw   3
   addwf   INDF,W
   movwf   temp
   btfsc   temp,3          ; test if result > 7
   movwf   INDF
   movlw   30
   addwf   INDF,W
   movwf   temp
   btfsc   temp,7          ; test if result > 7
   movwf   INDF            ; save as MSD
   retlw   0x00

;********************************************************************
; 32-bit Binary To 10-digit BCD Conversion Routine
;********************************************************************
; This routine converts a 32 Bit binary Number to a 10 Digit BCD Number.
; The 32 bit binary number is input in locations [h3:h2:h1:h0]
; and with the high byte in 'h3'. The 10 digit BCD number is returned
; in [d0:d1:d2:d3:d4] with d0 containing the MSD in its right most
; nibble.
; [h3:h2:h1:h0]-->(call Bin32BCD)-->[d4:d3:d2:d1:d0]
;*******************************************************************;
Bin32BCD:
   bcf     _C
   LDR      count,0x20   ; Load counter for 32 rotations.
   clrf   d4         ; Clear BCD destination .
   clrf   d3
   clrf    d2
   clrf    d1
   clrf    d0      
loop32:
   rlf      h0,F      ; Rotate first low byte of hex number
   rlf      h1,F      ; [h3:h2:h1:h0] = [h3:h2:h1:h0] << 1 ;
   rlf      h2,F
   rlf      h3,F
   rlf      d4,F      ; Insert MSB bits from last rotation
   rlf      d3,F      ; in HiByte of BCD destination
   rlf      d2,F      
   rlf      d1,F      
   rlf      d0,F      
   decfsz  count, F   ; Check if rotate 32-bits of source
   goto    adj32DEC
   retlw   0x00
adj32DEC:
   movlw   d4
   movwf   FSR
   call   adjBCD
   incf   FSR,F   
   call    adjBCD
   incf   FSR,F
   call    adjBCD
   incf   FSR,F
   call    adjBCD
   incf   FSR,F
   call   adjBCD
   goto    loop32



Би трябвало да ти свърши работа. Първо конвертираш двоичното число до двоично-десетично, след това всеки байт на двоично-десетично се конвертира до ASCII, като можеш байт по байт да изпращаш ASCII резултата на дисплея.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Окт 14, 2006 10:26 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 12, 2006 3:52 pm
Мнения: 21
Местоположение: Varna
Мнение 
Ето какво написах :) и най-важното работи!
Част от кода е заимстван от тук и леко променeн :).Висчките 9 числа се записват за ~ 4400 машинни цикъла.
Код:
      list      p=16f870
      #include   <p16f870.inc>   
      __CONFIG   _CP_OFF & _WDT_OFF & _XT_OSC
W       equ      0
F    equ      1
T0   equ      h'20'   ;Mnladshi byte
T1   equ      h'21'   
T2   equ      h'22'
T3   equ      h'23'   ;Starshi byte
D0      equ      h'24'   ;Delitel
counter   equ      h'25'   
dig1   equ      h'26'   ;Cifra za edinicite
dig2   equ      h'27'   ;100
dig3   equ      h'28'   ;1000
dig4   equ      h'29'   ;10000
dig5   equ      h'2a'
dig6   equ      h'2b'
dig7   equ      h'2c'
dig8   equ      h'2d'
dig9   equ      h'2e'   
rem    equ      h'2f'   ;ostatyk   

      org    h'0000'
      goto   main
      
div328        clrf    rem
         movlw   d'32'
               movwf   counter
loop328     rlf     T0,W
               rlf     T1,F
               rlf     T2,F
      rlf   T3,F
               rlf     rem,F
               rlf     T0,F
               movf    D0,W
               subwf   rem,F
         btfsc     STATUS,0
         bsf       T0,0
               btfss     T0,0
               addwf   rem,F 
        decfsz  counter,F   
               goto    loop328
               return

main   movlw   h'7c';h'b5'
      movwf   T0
      movlw   h'56';h'3f'
      movwf   T1
      movlw   h'b6';h'7'
      movwf   T2
      movlw   h'06'
      movwf   T3
      movlw   h'a'
      movwf   D0
      call   div328
      movf   rem,W
      movwf   dig1
      call   div328
      movf   rem,W
      movwf   dig2
      call   div328
      movf   rem,W
      movwf   dig3
      call   div328
      movf   rem,W
      movwf   dig4
      call   div328
      movf   rem,W
      movwf   dig5
      call   div328
      movf   rem,W
      movwf   dig6
      call   div328
      movf   rem,W
      movwf   dig7
      call   div328
      movf   rem,W
      movwf   dig8
      call   div328
      movf   rem,W
      movwf   dig9
      END



Съб Окт 14, 2006 2:23 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни