📄 简易缩放尺.asm
字号:
AJMP POCESSY_5
POCESS_Y: MOV R1,#19H
POCESSY_5:MOV A,R0
MOV @R1,A
POCESSX_3:INC R0
MOV R1,#16H
POCESSX_20:INC R1
MOV A,@R1
CJNE A,#00H,POCESSX_20
MOV A,R0
MOV @R1,A
;;*************************************步进电机控制优先级输出
MOV R0,#16H
PUT_OUT: INC R0
MOV A,@R0
CJNE A,#31H,PUT_OUT_1
LCALL MORTAL_A
PUT_OUT_1:MOV A,@R0
CJNE A,#32H,PUT_OUT_2
LCALL MORTAL_B
PUT_OUT_2:MOV A,@R0
CJNE A,#33H,PUT_OUT_2
LCALL MORTAL_C
MOV A,R0
CJNE A,#19H,PUT_OUT
LJMP EU_END ;返回主程序
;*************************************************************计算绳拉长短和判断伸缩
CONTROL: MOV START_HX,FACT_HX
MOV START_LX,FACT_LX
MOV START_HY,FACT_HY
MOV START_LY,FACT_LY
LCALL BELT_B
MOV OUT_B_H,R2
MOV OUT_B_L,R3
LCALL BELT_C
MOV OUT_C_H,R2
MOV OUT_C_L,R3
LCALL BELT_A
MOV OUT_A_H,R2
MOV OUT_A_L,R3
MOV START_HX,END_HX
MOV START_LX,END_LX
MOV START_HY,END_HY
MOV START_LY,END_LY
LCALL BELT_B
MOV OUT_1_B_H,R2
MOV OUT_1_B_L,R3
LCALL BELT_C
MOV OUT_1_C_H,R2
MOV OUT_1_C_L,R3
LCALL BELT_A
MOV OUT_1_A_H,R2
MOV OUT_1_A_L,R3
CLR SIGN_P_A
CLR SIGN_P_B
CLR SIGN_P_C
MOV R2,OUT_A_H
MOV R3,OUT_A_L
MOV R4,OUT_1_A_H
MOV R5,OUT_1_A_L
LCALL COMPY2
JNB SIGN_BIG,LOOP_1
SETB SIGN_P_A
MOV R2,OUT_A_H
MOV R3,OUT_A_L
MOV R6,OUT_1_A_H
MOV R7,OUT_1_A_L
LCALL SUBB2
AJMP LOOP_2
LOOP_1:MOV R2,OUT_1_A_H
MOV R3,OUT_1_A_L
MOV R6,OUT_A_H
MOV R7,OUT_A_L
LCALL SUBB2
LOOP_2:MOV LINE_A_H,R2
MOV LINE_A_L,R3
MOV R2,OUT_B_H
MOV R3,OUT_B_L
MOV R4,OUT_1_B_H
MOV R5,OUT_1_B_L
LCALL COMPY2
JNB SIGN_BIG,LOOPX_1
SETB SIGN_P_B
MOV R2,OUT_B_H
MOV R3,OUT_B_L
MOV R6,OUT_1_B_H
MOV R7,OUT_1_B_L
LCALL SUBB2
AJMP LOOPX_2
LOOPX_1:MOV R2,OUT_1_B_H
MOV R3,OUT_1_B_L
MOV R6,OUT_B_H
MOV R7,OUT_B_L
LCALL SUBB2
LOOPX_2:MOV LINE_B_H,R2
MOV LINE_B_L,R3
MOV R2,OUT_C_H
MOV R3,OUT_C_L
MOV R4,OUT_1_C_H
MOV R5,OUT_1_C_L
LCALL COMPY2
JNB SIGN_BIG,LOOPY_1
SETB SIGN_P_C
MOV R2,OUT_C_H
MOV R3,OUT_C_L
MOV R6,OUT_1_C_H
MOV R7,OUT_1_C_L
LCALL SUBB2
AJMP LOOPY_2
LOOPY_1:MOV R2,OUT_1_C_H
MOV R3,OUT_1_C_L
MOV R6,OUT_C_H
MOV R7,OUT_C_L
LCALL SUBB2
LOOPY_2:MOV LINE_C_H,R2
MOV LINE_C_L,R3
RET
;;;;;**********************
;;***********************************************************
BELT_B: MOV R2,START_HX ;平方
MOV R3,START_LX
MOV R6,START_HX
MOV R7,START_LX
LCALL MULD
MOV CASE_HH,R2
MOV CASE_HL,R3
MOV CASE_H,R4
MOV CASE_L,R5
MOV R2,START_HY ;平方
MOV R3,START_LY
MOV R6,START_HY
MOV R7,START_LY
LCALL MULD
MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
MOV R4,CASE_HH
MOV R5,CASE_HL
MOV R6,CASE_H
MOV R7,CASE_L
LCALL ADD4
MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
MOV A,R1
MOV R3,A
MOV A,R0
MOV R2,A
LCALL SH4
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BELT_C:MOV R2,#02H
MOV R3,#58H
MOV R6,START_HX ;平方
MOV R7,START_LX ;平方
LCALL SUBB2
MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
LCALL MULD
MOV CASE_HH,R2
MOV CASE_HL,R3
MOV CASE_H,R4
MOV CASE_L,R5
MOV R2,START_HY ;平方
MOV R3,START_LY
MOV R6,START_HY
MOV R7,START_LY
LCALL MULD
MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
MOV R4,CASE_HH
MOV R5,CASE_HL
MOV R6,CASE_H
MOV R7,CASE_L
LCALL ADD4
MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
MOV A,R1
MOV R3,A
MOV A,R0
MOV R2,A
LCALL SH4
RET
;;*****************************
BELT_A: MOV R2,#01H
MOV R3,#2CH
MOV R4,START_HX
MOV R5,START_LX
LCALL COMPY2
JB SIGN_BIG,NEXT_1
MOV R2,START_HX
MOV R3,START_LX
MOV R6,#01H
MOV R7,#2CH
LCALL SUBB2
AJMP NEXT_2
NEXT_1:MOV R2,#01H
MOV R3,#2CH
MOV R6,START_HX
MOV R7,START_LX
LCALL SUBB2
NEXT_2:MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
LCALL MULD
MOV CASE_HH,R2
MOV CASE_HL,R3
MOV CASE_H,R4
MOV CASE_L,R5
MOV R2,#02H
MOV R3,#08H
MOV R6,START_HY
MOV R7,START_LY
LCALL SUBB2
MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
LCALL MULD
MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
MOV R4,CASE_HH
MOV R5,CASE_HL
MOV R6,CASE_H
MOV R7,CASE_L
LCALL ADD4
MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
MOV A,R1
MOV R3,A
MOV A,R0
MOV R2,A
LCALL SH4
RET
;;;;*********************************************双字节比较大小
;标号: COMPY2 功能:无符号双字节比较大小(快速)
;入口条件:R2、R3, 数2 R4、R5中。 注意高字节是R2
;出口信息:标志位在SIGN_BIG,数一比数二大标志位置1
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
COMPY2: SETB SIGN_BIG
CLR C
MOV A,R2
SUBB A,R4
JNC COMPY_3
CLR SIGN_BIG
RET
COMPY_3:CLR C
JNZ COMPY_4
MOV A,R3
SUBB A,R5
JNC COMPY_4
CLR SIGN_BIG
COMPY_4:RET
;*****************************************************
;*****************************************************
;标号: SH4 功能:四字节二进制无符号数开平方(快速)
;入口条件:被开方数在R2、R3、R4、R5中。 注意高字节是R2
;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
;*****************************************************
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET ;被开方数为零,不必运算
SH40: MOV R7,#0 ;左规次数初始化
MOV A,R2
SH41: ANL A,#0C0H ;被开方数高字节小于40H否?
JNZ SQRH ;不小于40H,左规格化完成
MOV R6,#2 ;每左规一次,被开方数左移两位
SH42: CLR C ;被开方数左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 ;被开方数左移完两位
INC R7 ;左规次数加一
SJMP SH41 ;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一区间的斜率
MOV R4,#80H ;第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H ;第二区间的斜率
MOV R4,#0A0H;第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH ;第三区间的斜率
MOV R4,#0D0H;第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;继续校正
SQR5: MOV A,R4 ;将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最终偏移量的最高位
MOV A,R3
MOV R5,A ;将最终偏移量的低八位存入R5中
MOV R4,#8 ;通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
MOV A,R7 ;取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
;*********************************************************
;*********************************************************
;**************************************************************
;*****************四字节二进制无符号数加法*********************
;**************************************************************
;程序名:ADD4
;入口条件:被加数在R0.R1.R2.R3中,减数在R4.R5.R6、R7中。
;出口信息:结果在R0.R1.R2.R3。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节
ADD4:CLR C
CLR F0
MOV A,R3
ADD A,R7
MOV R3,A
JNC ADD_X
SETB F0
ADD_X:CLR C
MOV A,R2
ADD A,R6
JNB F0,ADD_Y
INC A
CLR F0
ADD_Y: MOV R2,A
MOV A,R1
ADDC A,R5
MOV R1,A
MOV R0,#00H
MOV R4,#00H
RET
;**************************************************************
;*****************双字节二进制无符号数减法*********************
;**************************************************************
;程序名:SUBB2
;入口条件:被减数数在R2、R3中,减数在R6、R7中。
;出口信息:结果在R2.R3。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节
SUBB2:CLR C
MOV A,R3
SUBB A,R7
MOV R3,A
MOV A,R2
SUBB A,R6
MOV R2,A
RET
;**************************************************************
;**************************************************************
;*****************双字节二进制无符号数乘法*********************
;**************************************************************
;程序名:MULD
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A ;将低位送入R5
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A ;将进位位移入A的最低位
RLC A ;将进位位移入A的最低位
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;**************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -