Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт июн 19, 2015 05:39:31
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
ILYAUL писал(а):...
Код: Выделить всё
//------------------------------------------------------------------------
#define tab_h(x) HIGH(x), LOW(x)
#define tab_l(x) LOW(x), HIGH(x)
//------------------------------------------------------------------------
/************************************************************************/
#if (BCD==YES)
.dseg
HEX_DEC_BUFFER:
.equ HEX_DEC_BUFFER_LENGHT = 5
.byte HEX_DEC_BUFFER_LENGHT
.cseg
Hex_Dec:
ldx HEX_DEC_BUFFER
ldz Tab_10_16*2
ldi r19, 4
Hex_Dec_Cycle:
lpm r17, Z+
lpm r16, Z+
rcall Hex_Dec_Digit
st X+, r18
dec r19
brne Hex_Dec_Cycle
mov r16, r14
// ori r16, 0x30
st X+, r16
Hex_Dec_End:
ret
Hex_Dec_Digit:
ldi r18,-1
Hex_Dec_Digit_Cycle:
inc r18
sub r14,r16
sbc r15,r17
brsh Hex_Dec_Digit_Cycle
add r14,r16
adc r15,r17
// ori r18,0x30
ret
Tab_10_16:
.db tab_h (10000)
.db tab_h (1000)
.db tab_h (100)
.db tab_h (10)
#endif
//==================
Код: Выделить всё
;**************************************************
;* ;;+Подпрограмма преобразования в BCD;;* *
;**************************************************
CONVBCD:
clr temp ;+ Преобразуем в BCD
BCD1:
subi temp1,10
brcs EndBCD
inc temp
rjmp BCD1
EndBCD:
subi temp1,-10
ori temp1,'0' ; перевод в ASCII
cp temp,zero
breq XXXX
ori temp,'0' ;/ в temp1 младшее значение в temp - старшее
ret
XXXX:
ldi temp,0x20 ;| Убираем первый , незначащий ноль
retКод: Выделить всё
lsr SHIFT_REG // и значение текущей температуры т.е делим на 10
X1: ror TERMO_REG // В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
ror SHIFT_REG
dec count
brne X1
swap SHIFT_REG
Код: Выделить всё
ldi r20,'+'
and r17,r17 ; проверка на отрицательность
brpl plus
com r17 ; отрицательное
neg r16
sbci r17,0xFF
ldi r20,'-'
plus: ; (уже) положительное
ldi r22,5
sbrs r16,3 ; проверка на 0.5
clr r22
lsr r17 ; сдвигаем вправо на 4 бита
ror r16
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
mov r21,r16 ; и получаем целые градусы
Почему неa_skr писал(а): and r17,r17 ; проверка на отрицательность
Код: Выделить всё
tst r17да, нагляднее так. просто ассемблер лет 15 назад изучалПочему не tst r17
Спасибо!Спасибо за код, лови плюсы.
Код: Выделить всё
ldi r20,'+'
and r17,r17 ; проверка на отрицательность
brpl plus
com r17 ; отрицательное
neg r16
sbci r17,0xFF
ldi r20,'-'
Код: Выделить всё
sbrs R17,MSB
ldi R20,'+'
Sbrc R17,MSB
ldi R20,'-'Код: Выделить всё
lsr r17 ; сдвигаем вправо на 4 бита
ror r16
ror r17
ror r16
ror17
ror r16
ror r17
ror r16
Код: Выделить всё
lsr SHIFT_REG // и значение текущей температуры т.е делим на 10
X1: ror TERMO_REG // В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
ror SHIFT_REG
dec count
brne X1
swap SHIFT_REGКод: Выделить всё
Sbrs SHIFT_REG,LSB
ldi R20,'0'
sbrc SHIFT_REG,LSB
Ldi R20,'5'Немного, но всё же...Gudd-Head писал(а):Кто-нибудь сможет компактней?
Код: Выделить всё
LDI ZL,4
LDI R20,'+'
TST XH
BRPL PLUS
COM XH
NEG XL
SBCI XH,-1
LDI R20,'-'
PLUS:
LSR XH
ROR XL
DEC ZL
BRNE PLUS
LDI R21,5
BRCS PC+2
CLR R21
MOV R22,XL

Код: Выделить всё
;вход: R16 число от 0 ... 255
;выход: R18 число 2, R17 число 1, R16 число 0 = digits
;байтов: 20
;пример на вход ldi r16,255
;выход r18 = 00000010 это 2, r17 = 00000101 это 5, r16 = 00000101 это 5.
Hex2BCD: LDI r18,-1
bcd1: INC r18
SUBI r16,100
BRCC bcd1
LDI r17,10
bcd2: DEC r17
SUBI r16,-10
BRCS bcd2
ret