📄 tobcd16.asm
字号:
; File Name ToBCD16.asm"
; Support Email Per@hum.au.dk
; Target MCU AT90Sxxxx
; R e v i s i o n H I S T O R Y
; rev. date who why
; ---- ------------ --- ---------------------------------------------------
; 0.01 May 17, 2001 PB Creation after a great idea from Thorleif Bundgaard
; 0.02 May 19, 2001 PB Fix bug : call > rcall
;.DEVICE AT90S4414 ; change if an other device is used
;.include "4414def.inc" ; change if an other device is used
.def Divisor =r8
.def Divisor1 =r9
.def Base =r10
.def Base1 =r11
.def Base2 =r12
.def Base3 =r13
.def Temp =r16 ; If BaseX are regs > r15 then there's no need for Temp
; Entry : Base1, Base , XH, XL
; Result : (XH, XL)+
; 35 Words off program space
; Execution at 1 MHz. between 100 and 370 uS. depending on the input numbers
ToBCD16: ldi Temp,high(10000)
mov Base3,Temp
ldi Temp,low(10000)
mov Base2,Temp
rcall ToBCD1
ldi Temp,high(1000)
mov Base3,Temp
ldi Temp,low(1000)
mov Base2,Temp
rcall ToBCD1
clr Base3
ldi Temp,100
mov Base2,Temp
rcall ToBCD1
ldi Temp,10
mov Base2,Temp
rcall ToBCD1
ldi Temp,1
mov Base2,Temp
ToBCD1: ldi Temp,'0' ; Start with ASCII 0 ($30h)
ToBCD2: st X,Temp
sub Base,Base2 ; Subtract divisor
sbc Base1,Base3
brcc ToBCD3 ; Skip if ok
add Base,Base2 ; Else restore
adc Base1,Base3
adiw r26,1 ; Point (X) to next byte (don't know why XL doesn't work here)
ret
ToBCD3: ld Temp,X
inc Temp
rjmp ToBCD2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -