📄 insert.asm
字号:
;线性插值算法应用实例。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV A,#27H ;假设A/D转换结果是27H。
LCALL INSERT ;用线性插值算法求对应物理量的精确值。
NOP ;结果在R2R3中( 2569H )。
NOP
MOV A,#83H ;假设A/D转换结果是83H。
LCALL INSERT ;用线性插值算法求对应物理量的精确值。
NOP ;结果在R2R3中( 32D2H )。
NOP
MOV A,#0DEH ;假设A/D转换结果是0DEH。
LCALL INSERT ;用线性插值算法求对应物理量的精确值。
NOP ;结果在R2R3中( 4166H )。
NOP
STOP: LJMP STOP
INSERT: MOV DPTR,#LIST;指向表格首址。
MOV B,A ;保持A/D转换结果。
ANL A,#0FH ;取第四位,得到区间内偏移量(x-x0)。
MOV R7,A ;保持偏移量。
MOV A,B ;取A/D转换结果。
SWAP A ;取高四位。
ANL A,#0FH ;得到区间起始节点的序号。
CLR C
RLC A ;每个节点为两个字节。
ADD A,DPL ;计算起始节点的地址。
MOV DPL,A
JNC INSE
INC DPH
INSE: CLR A ;读区间取起始节点对应的y0,存放在R2R3中。
MOVC A,@A+DPTR
MOV R2,A
MOV A,#1
MOVC A,@A+DPTR
MOV R3,A
MOV A,#2 ;读取区间末端节点对应的y1,存放在R4R5中。
MOVC A,@A+DPTR
MOV R4,A
MOV A,#3
MOVC A,@A+DPTR
CLR C ;计算区间增量(y1 -y0),存放在R4R5中。
SUBB A,R3
MOV R5,A
MOV A,R4
SUBB A,R2
MOV R4,A
MOV A,R5 ;计算(y1 -y0)×(x -x0),存放在R4R5R6中。
MOV B,R7
MUL AB
MOV R5,B
MOV R6,A
MOV A,R4
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
SWAP A ;用高低四位交换组合完成除于10H的算法。
MOV R4,A ;R4R5R6÷(x1 -x0),存放在R4R5中。
MOV A,R5
SWAP A
MOV R5,A
ANL A,#0FH
ORL A,R4
MOV R4,A
MOV A,R5
ANL A,#0F0H
MOV R5,A
MOV A,R6
SWAP A
ANL A,#0FH
ORL A,R5
ADD A,R3 ;加上y0,得到最后计算结果,存放在R2R3中。
MOV R3,A
MOV A,R4
ADDC A,R2
MOV R2,A
RET
LIST: DB 20H,00H ;表格,包含17个双字节数据。
DB 22H,36H
DB 24H,6FH
DB 26H,0ACH
DB 28H,0F0H
DB 2BH,3CH
DB 2DH,91H
DB 2FH,0F1H
DB 32H,5CH
DB 34H,0D3H
DB 37H,55H
DB 39H,0E2H
DB 3CH,78H
DB 3FH,16H
DB 41H,0BBH
DB 44H,64H
DB 47H,10H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -