📄 1652.asm
字号:
.include"8535def.inc"
rjmp RESET
tab:.dw 0,78,157,236,314,393,466,541,616
.dw 692,769,847,927,1009,1092,1177,1266
RESET:mov r20,r16 ;A/D结果低6位送r20
andi r20,$3f
rol r16 ;取A/D结果高4位送r17
rol r17
rol r16
rol r17
add r17,r17 ;r17*2
ldi Zh,high(tab*2) ;取y1送r19:r18
ldi Zl,low(tab*2)
add Zl,r17
lpm
mov r18,r0
adiw Zl,1
lpm
mov r19,r0
adiw Zl,1 ;取y2送r17:r16
lpm
mov r16,r0
adiw Zl,1
lpm
mov r17,r0
sub r16,r18 ;求y2-y1
sbc r17,r19
mov r23,r18 ;保存y1送r24:r23
mov r24,r19
mov r18,r20 ;求(y2-y1)*(x-x1)/64
clr r19
rcall mpy16s
rol r18
rol r19
rol r20
rol r18
rol r19
rol r20
add r23,r19 ;求y
adc r24,r20
here: rjmp here
mpy16s: ;16位*16位带符号乘法
clr r21 ;清结果和进位位
sub r20,r20
ldi r22,16 ;初始化循环计数器
m16s_1:
brcc m16s_2 ;进位位为 0 ,跳至m16s-2
add r20,r16 ;进位位为 1
adc r21,r17 ;结果3字节2字节加被乘数
m16s_2:
sbrc r18,0 ;如果当前位置位
sub r20,r16 ;从结果字节2中减被乘数低字节
sbrc r18,0 ;如果当前位置位
sbc r21,r17 ;从结果字节2中减被乘数低字节
asr r21 ;算术右移结果和乘数
ror r20
ror r19
ror r18
dec r22 ;循环计数器减 1
brne m16s_1 ;如没完成,再循环
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -