-
24.03.2006, 00:20 #1
- Регистрация
- 21.01.2006
- Сообщений
- 28
- Поблагодарили
- 0
- Поблагодарил
- 0
опять арифметика, что то не складывается
просьба о помощи. не могу сообразить в том как сделать так что бы
цифры по отдельности после преобразования составляли число.
1,5,0,0 в итоге 1500 (DEC) 05DC(HEX)
пример:
var:.byte 1
var1:.byte 1
var2:.byte 1
var3:.byte 1 ;выделяем для каждого числа байт, это потом будет
выведено на ЖКИ индикатор к примеру число 1500
ldi temp,1
sts var,temp
ldi temp,5
sts var1,temp
.set pl1 = var*1000
.set pl2 = var1*100
.set pl = pl1+pl2
ldi r17,low(pl);младший
ldi r18,high(pl);старший
(это число мне нужно для дальнейших вычислений и потом как то
надо опять его преобразовать в отдельные цифры уже вычисленные т.е.
другое число 1500-1=1499 (1,4,9,9) )
только после всего этого какая то ерунда получается.
за ранее благодарен за помощь.
все эти var-ы применяются как буферы получения с клавиатуры
некоторой цифры (1-10) (10 - является как ноль).
микроконтроллер использую AVR 8535
-
24.03.2006, 15:39 #2
- Регистрация
- 15.07.2004
- Адрес
- Харьков
- Сообщений
- 89
- Поблагодарили
- 0
- Поблагодарил
- 0
Насколько я понял, тебе требуется преобразование в BCD?
Тогда это выглядит примерно так:
;---------------------------------------
; В данной процедуре мы переводим Bin (4 байта) в BCD.
; Вход - регисты Bin0, Bin1, Bin2, Bin3.
; Bin0 - младший.
; Выход - 10 байт ОЗУ: 61-6A
; 236/600 циклов, 78 слов памяти.
; 37,5 мкс (для 16 МГц).
.def Bin0 = R11
.def Bin1 = R12
.def Bin2 = R13
.def Bin3 = R14
.def ASCII0 = R17
.def ASCII1 = R18
.def ASCII2 = R19
.def ASCII3 = R20
.def Count = R21
.CSEG
BinToBCD_4:
push ASCII0
push ASCII1
push ASCII2
push ASCII3
push Count
ldi ASCII0,$00 ; 1 000 000 000
ldi ASCII1,$CA
ldi ASCII2,$9A
ldi ASCII3,$3B
rcall BinToBCD4_digit
sts (BCD4+0),Count
ldi ASCII0,$00 ; 100 000 000
ldi ASCII1,$E1
ldi ASCII2,$F5
ldi ASCII3,$05
rcall BinToBCD4_digit
sts (BCD4+1),Count
ldi ASCII0,$80 ; 10000000
ldi ASCII1,$96
ldi ASCII2,$98
ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+2),Count
ldi ASCII0,$40 ; 1000000
ldi ASCII1,$42
ldi ASCII2,$0F
ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+3),Count
ldi ASCII0,$A0 ; 100000
ldi ASCII1,$86
ldi ASCII2,$01
; ldi ASCII3,$00 ; Для экономии памяти, обнуленные регистры больше не трогаем.
rcall BinToBCD4_digit
sts (BCD4+4),Count
ldi ASCII0,$10 ; 10000
ldi ASCII1,$27
ldi ASCII2,$00
; ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+5),Count
ldi ASCII0,$E8 ; 1000
ldi ASCII1,$03
; ldi ASCII2,$00
; ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+6),Count
ldi ASCII0,$64 ; 100
ldi ASCII1,$00
; ldi ASCII2,$00
; ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+7),Count
ldi ASCII0,$0A ; 10
; ldi ASCII1,$00
; ldi ASCII2,$00
; ldi ASCII3,$00
rcall BinToBCD4_digit
sts (BCD4+8),Count
sts (BCD4+9),Bin0
pop Count
pop ASCII3
pop ASCII2
pop ASCII1
pop ASCII0
ret
BinToBCD4_digit:
ldi Count, -1
BinToBCD4_digit_loop:
inc Count
sub Bin0,ASCII0
sbc Bin1,ASCII1
sbc Bin2,ASCII2
sbc Bin3,ASCII3
brsh BinToBCD4_digit_loop
add Bin0,ASCII0
adc Bin1,ASCII1
adc Bin2,ASCII2
adc Bin3,ASCII3
ret
;----------------------------------------------------
.DSEG
BCD4: .BYTE 10 ; Строка символов, получившаяся из 4-битного числа.
Мой совет - используй для арифм. операций "простые" переменные, а преобразовывай в BCD только для вывода на ЖКИ.У кошки четыре ноги: вход, выход, земля и питание.
73! UR3LTG.
|
Социальные закладки