📄 text1.asm
字号:
VOUT EQU P3.0
;
;***************************************************
;* 中断入口
;***************************************************
;
ORG 0000H
LJMP START
ORG 0003H
LJMP PINT0
;**************************************************
; 主程序
;**************************************************
START: MOV SP, #4FH
MOV R0, #40H ;40~47H为显示数据存放单元(40为最高位)
MOV R7,#0FH
CLEARDISP: MOV @R0, #00H
INC R0
DJNZ R7, CLEARDISP
MOV 20H, #00H
MOV P0, #0FFH
MOV P1, #0FFH
MOV P2, #0FFH
MOV P3, #0FFH
SETB PX0
SETB EX0
SETB EA
START1: LCALL DISPLAY
JNB 00H, START1 ;收到反射信号时标志位为1
CLR EA
LCALL WORK ;计算距离子程序
;
;
;外中断0,收到回波时进入
;
PINT0: CLR EA
CLR EX0
MOV 4AH, #069H ;将计数值移入处理单元
MOV 4BH, #096H
SETB 00H ;接收成功标志
RETI
;**********************************
DISPLAY: MOV R1,#40H
MOV R5,#07FH
PLAY: MOV A,R5
MOV P0,#0FFH
MOV P1,A
MOV A,@R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
CALL DL1MS
INC R1
MOV A,R5
JNB ACC.0,ENDOUT
RR A
MOV R5,A
JMP PLAY
ENDOUT: MOV P1,#0FFH
MOV P0,#0FFH
RET ;显示完成,返回
;
TABLE:DB 03H,9FH,25H,0DH,99H,49H,41H,01FH,01H,09H,03H
;********************************
;延时程序
;********************************
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;**************************************************
;* 距离计算程序(=计算值×17/1000cm) 近似 *
;**************************************************
WORK:PUSH ACC
PUSH PSW
PUSH B
MOV PSW, #18H ;RS1=1,RS0=1
MOV R3, 4BH
MOV R2, 4AH
MOV R1, #00D
MOV R0, #17D ;与17相乘
LCALL MUL2BY2 ;R7R6R5R4<=R3R2*R1R0
MOV R3, #03H
MOV R2, #0E8H
LCALL DIV4BY2 ;R7R6R5R4/R3R2=R7R6R5R4(商)......R1R0(余数)
LCALL DIV4BY2 ;R7R6R5R4/R3R2=R7R6R5R4(商)......R1R0(余数)
MOV 44H, R4
MOV A, 44H
JNZ JJ0 ;A不等于0时,跳转
MOV 44H, #0AH ;最高位为0,不点亮
JJ0: MOV A, R0
MOV R4, A
MOV A, R1
MOV R5, A
MOV R3, #00D
MOV R2, #100D
LCALL DIV4BY2
MOV 45H, R4
MOV A, 45H
JNZ JJ1
MOV A, 44H ;此高位为0,先看最高位是否为不亮
SUBB A, #0AH
JNZ JJ1
MOV 45H, #0AH ;最高位不亮,次高位也不亮
JJ1: MOV A, R0
MOV R4, A
MOV A, R1
MOV R5, A
MOV R3, #00D
MOV R2, #10D
LCALL DIV4BY2
MOV 46H, R4
MOV A, 46H
JNZ JJ2
MOV A, 45H ;次高位为0,先看次高位是否为不亮
SUBB A, #0AH
JNZ JJ2
MOV 46H, #0AH ;次高位不亮,次高位也不亮
JJ2: MOV 47H, R0
POP B
POP PSW
POP ACC
RET
;************************************
;* 两字节无符号数乘法程序 *
;************************************
;R7R6R5R4<=R3R2*R1R0
;16次叠加R3R2运算,主要是移位
MUL2BY2: CLR A
MOV R7, A
MOV R6, A
MOV R5, A
MOV R4, A
MOV 4CH, #10H
MULLOOP1:CLR C
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
JNC MULLOOP2
MOV A, R4
ADD A, R2
MOV R4, A
MOV A, R5
ADDC A, R3
MOV R5, A
MOV A, R6
ADDC A, #00H
MOV R6, A
MOV A, R7
ADDC A, #00H
MOV R7, A
MULLOOP2:DJNZ 4CH, MULLOOP1
RET
;**************************************
;* 四字节/两字节无符号数除法程序 *
;**************************************
;R7R6R5R4/R3R2=R7R6R5R4(商)......R1R0(余数)
DIV4BY2: MOV 4CH, #20H
MOV R0, #00H
MOV R1, #00H
DIVLOOP1:MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
CLR C
MOV A, R0
SUBB A, R2
MOV B, A
MOV A, R1
SUBB A, R3
JC DIVLOOP2
MOV R0, B
MOV R1, A
DIVLOOP2:CPL C
DJNZ 4CH, DIVLOOP1
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -