Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Подпрограмка за...
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3191
Страница 1 от 1

Автор:  mash [ Сря Ное 01, 2006 1:47 pm ]
Заглавие:  Подпрограмка за...

Трябва ми идея за подпрограма за конвертиране на шеснайсетични стойности в десетични.
Става въпрос за брояч организиран с таймер 0 стойността на който искам да изведа на LCD дисплей.
До колкото имам познания и се сещам, трябва да записвам в темп директории младшада и старшата част на числото и по някакъв начин да го преобразувам в десетично. След което да добавя към него 30 и да го изпратя към дисплея.

Някой има ли други идеи ?
Приемам само на .asm :D :D :D

Автор:  asp [ Сря Ное 01, 2006 2:55 pm ]
Заглавие: 

:axe:
Хубаво приемаш а какво даваш? :D
Как си го мислите бе хора да си правите курсовите проекти по форумите без да сте прочели и 1 ред теория отнякъде.

Автор:  BrainStorm [ Сря Ное 01, 2006 3:20 pm ]
Заглавие: 

char* itoa(unsigned char i)
{
char a[4];
a[3]=(i/100)+48;
a[2]=(i/10)+48;
a[1]=( i-(a[0]+a[1])-48 );
a[0]='\0';

return a;
}

... тва ти нагледно как се прави .. ти си го транслираи на асм.

Автор:  elektronchika [ Сря Ное 01, 2006 5:20 pm ]
Заглавие: 

30, ама в шестнайстичен код :) което става 48 - както го е написал BrainStorm

Автор:  Nikola Kirov [ Сря Ное 01, 2006 5:49 pm ]
Заглавие: 

BrainStorm

char a[4]; го създаваш в стека а връщаш указател към него.
Ако кода трябва да работи без бъгове :)

Код:
void itoa(unsigned char i,char * a)
{
a[2]=(i/100)+48;
a[1]=(i/10)+48;
a[0]=( i-(a[0]+a[1])-48 );
}


като при викането на фуккцията и даваш адреса на буфера в които да ти запише изхода

Автор:  Dimiter [ Сря Ное 01, 2006 10:54 pm ]
Заглавие: 

колеги допускате една и съща грешка :)
но ще си затрая защото тая тема сме я коментирали и сорсове са постнати

Автор:  mash [ Чет Ное 02, 2006 12:20 am ]
Заглавие: 

Dimiter написа:
колеги допускате една и съща грешка :)
но ще си затрая защото тая тема сме я коментирали и сорсове са постнати

Дай линк към коментираната тема.
Между другото аз се справих със задачата и преобразувам от шеснайсетичен вид в десетичен.
Образно казано стойността от брояча в шеснайсетичен вид я събирам с шеснайсетичното число Н'30'
при което старшата част на новополученото число (т.е. 3) съвпада сколоната на аски таблицата на дисплея за цифрите, а младшата част съвпада с числото , което ми трябва.
Мисля , че това за сега е най-рационалния начин.
Имате ли други идеи ?
Бих бил доволен ако са в асм вид ;)
P.S. Не става въпрос за курсова или каквато и да било друга работа.
Искам да се науча да работя с тези микроконтролери.
Занимавам се със сигнално-охранителна техника, която изцяло е изградена с тези ПИК микроконтролери.
Неможете да си представите само какво щастие беше за мен, когато си изясних принципа на лсд дисплеите.

Автор:  vlado [ Чет Ное 02, 2006 1:14 am ]
Заглавие: 

Код:
void itoa( unsigned char i, char * a )
{
   a[2] = i/100 + 0x30;                                    // hundreds converted to ASCII
   a[1] = ( i - ( i/100 ) * 100 ) /10 + 0x30;        // tens converted to ASCII
   a[0] = i%10 + 0x30;                                    // single digits converted to ASCII
}

Автор:  logi [ Пон Ное 13, 2006 12:22 pm ]
Заглавие: 

Код:
;==============================================================================
;Преобразуване на двоично към BCD число
;                      L M
;Входни променливи:      BCDi<0-3> - Входно число
;                      L M
;Изходни променливи:    BCDo<0-3> - Изходно 8 цифрено число
;
;Помощни променливи:   Count
;==============================================================================
Bin1_BCD            ;8 битово число
   movlw   8
   goto   BBCD_Beg
Bin2_BCD            ;16 битово число
   movlw   16
   goto   BBCD_Beg
Bin4_BCD            ;32 битово число
   movlw   .32
BBCD_Beg
   movwf   Count
   clrf   BCDo0
   clrf   BCDo1
   clrf   BCDo2
   clrf   BCDo3
BBCD_Loop
   rlf      BCDi0,f
   rlf      BCDi1,f
   rlf      BCDi2,f
   rlf      BCDi3,f
   rlf      BCDo0,f
   rlf      BCDo1,f
   rlf      BCDo2,f
   rlf      BCDo3,f
if 1 ;Are we want ovefrlow check
   ;Is overflow
   btfss   STATUS,C
   goto   BBCD_DecCnt
   movlw   0xcc      ;Error code on my LEDs
   movwf   BCDo0
   movwf   BCDo1
   movwf   BCDo2
   movwf   BCDo3
   return
endif
BBCD_DecCnt
   ;Is Count over?
   decf   Count,f
   btfsc   STATUS,Z
   return            ;Yes
   ;Adjust digits      ;No
   movlw   BCDo0
   movwf   FSR
BBCD_AdjNex
   movlw   0x33
   addwf   INDF,f
   btfsc   INDF,3          ; test if result > 7
   andlw   0xf0
   btfsc   INDF,7          ; test if result > 7
   andlw   0x0f
   subwf   INDF,f   
   ;Increment & test
   movf   FSR,w
   incf   FSR,f
   xorlw   BCDo3         ;Is last ajusted is BCDo0
   btfss   STATUS,Z
   goto   BBCD_AdjNex      ;No
   goto   BBCD_Loop      ;Yes
;Bin3_BCD END

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/