|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 11:05 pm
Превръщане на 32BITово число в ASCII символи...
| Автор |
Съобщение |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Използвам следният код на асемблер:
 |  |  |  | Код: #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 |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 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 |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|