Ahoj! Nedávno jsem tu zmiňoval jednu špatnou vlastnost AVR - neumějí dělení. Už jsem se dohrabal k práci s LCD řízenými HD44780, a tak nějak občas je docela dost potřeba vypisovat nějaká ta čísla, tak se nyní ptám, jak to realizovat bez nutnosti dělení, respektive aby převod na ASCII řetězec byl co nejrychlejší.
KDysi jsem napsal pěknou rutinu pro 8051 (převod 8b čísla na ASCII, bez/s výpisu nul před číslo) , která toto uměla, bohužel jsem v ní použil asi 2x dělení. Postup byl následující. číslo vydělit 100 (zjistit cifru stovek), k tomu co vyšlo jsem přičetl vhodnou konstantu (48 = ‘0’). Tudíž jsem získal ASCII kód první cifry. Poté jsem zbytek tohoto dělení dělil 10,… atd. Ještě jsem nějak řešil odstraňování nul před číslem.
Naprosto super, podařilo se mi ty staré rutiny vyhrabat, zde přidávám ukázku, jak jsem to kdysi řešil.
;********************* RUTINA Byte2dSTR verze 1.0 *****************************
;Rutina Byte2dstr prevede 8bit cislo na ASCII retezec
;cislo pro prevod je v A, adresa SRAM, kam se ulozi retezec je v R0.
;Muze zabrat az 3 byte. (255)
;vypisuje nuly pred cislo, napr. 001, 039, 000,...
Byte2dstr1: mov B, #100
div AB
add A, #48
mov @R0, A
inc R0
mov A, B
mov B, #10
div AB
add A, #48
mov @R0, A
inc R0
mov A, B
add A, #48
mov @R0, A
ret
;********************* RUTINA Byte2dSTR verze 2.1 *****************************
;Rutina Byte2dstr prevede 8bit cislo na ASCII retezec
;cislo pro prevod je v A, adresa SRAM, kam se ulozi retezec je v R0.
;Muze zabrat az 3 byte. (255)
;nevypisuje nuly pred cislo, napr. 001, 039, 000,... ale vypisuje klasicky 1, 39, 0,...
;ovlivnuje: priznak F0 (z PSW registru), C, P, OV, A, B, R0
;verze 2.0: nefungovalo vynechavani nuly u desitek ->
;verze 2.1: misto carry (ktere nechtene ovlivnuje DIV) se pouzil priznak F0 z PSW registru
Byte2dstr2: mov B, #100
clr F0
div AB
jz bs1
add A, #48
mov @R0, A
inc R0
setb F0
bs1: mov A, B
mov B, #10
div AB
jb F0, bs2
jz bs3
bs2: add A, #48
mov @R0, A
inc R0
bs3: mov A, B
add A, #48
mov @R0, A
ret
Poradíte mi prosím, jak něco podobného vyřešit na AVR, kde není dělení? Nebo aspoň jaký jiný případně i lepší postup mám použít?
Dík moc, Honza