📄 步进电机总程序.asm
字号:
MOV A,R0
MOV DPTR,#TABLE0
MOVC A,@A+DPTR
JZ START2 ;对 A 的判断,当 A = 0 时则转到 START
MOV P2,A
ACALL DELAY0 ;升半旗,速度降为原来的一半,使音乐播放完
ACALL DELAY0
INC R0
MOV A,R0
PUSH A
ACALL DISP1
LCALL KEYSCAN1
CJNE A,#0DH,GO_ON1 ;判断是否有暂停
ACALL ZAN_TING
ACALL DELAY1
GO_ON1:
POP A
MOV R0,A
DJNZ R3,START3
INC R5
ACALL JI_SUAN1
;ACALL DISP1
MOV A,6BH
JB 27H,DA_YU1
CJNE A,#90,SHANG_1
MOV P2,#00H
RET
DA_YU1: CJNE A,#180,SHANG_1
MOV P2,#00H
RET
;------------降半旗---------------
BAN_GAOL:
MOV R5,#0 ;假定每一圈为2厘米,则上升到180厘米所需的圈数为90.
MOV A,6BH
MOV 71H,A
MOV A,#90
CLR C
SUBB A,6BH
JNC XIAO_YU
SETB 27H
AJMP XIA_1
XIAO_YU: CLR 27H
XIA_1:MOV R3,#240
START6:ACALL DISP1
MOV P2,#00H ;下降的同时音乐停
MOV R0,#06H
START7:
;MOV A,R0
;PUSH A
;ACALL JI_SUAN2
;ACALL DISP1
;POP A
MOV A,R0
MOV DPTR,#TABLE0
MOVC A,@A+DPTR
JZ START6
MOV P2,A
ACALL DELAY0
INC R0
MOV A,R0
PUSH A
ACALL DISP1
LCALL KEYSCAN1
CJNE A,#0DH,GO_ON3 ;判断是否有暂停
ACALL ZAN_TING
ACALL DELAY1
GO_ON3:
POP A
MOV R0,A
DJNZ R3,START7
INC R5
ACALL JI_SUAN2
;ACALL DISP1
MOV A,6BH
JNB 27H,XIAO_YU1
CJNE A,#90,XIA_1
MOV P2,#00H
RET
XIAO_YU1:CJNE A,#0,XIA_1
MOV P2,#00H
RET
;-----------暂停-------------
ZAN_TING:
LOP4: MOV P2,#00H
LCALL KEYSCAN2
CJNE A,#0EH,LOP4
RET ;暂停结束,返回
;-----------延时-------------
DELAY0:
MOV R7,#10 ;步进电机的转速,延时5MS
M3:
MOV R6,#250
DJNZ R6,$
DJNZ R7,M3
RET
DELAY1: ; 6MS 延时子程序
MOV R3,#120
DEL3: MOV R2,#250
DJNZ R2,$
DJNZ R3,DEL3
RET
TABLE0:
DB 81H,82H,84H,88H,81H ;正转表
DB 00H ;正转结束
DB 01H,08H,04H,02H,01H ;反转表
DB 00H ;反转结束
;显示程序
DISP1:
MOV R2,64H ;显示数码存放在61~64
MOV R4,#0F7H ;把显示位码取到R4
LCALL DISPLAY_A_BIT
LCALL DELAY
MOV A, 63H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ANL A,#7FH
MOV P1,A
MOV A,#0FBH
MOV P3,A
LCALL DELAY
MOV R0,#62H
MOV R4,#0FDH
DISPLAY_SCAN1:
MOV A,@R0
MOV R2,A ;把显示数码取到R2
LCALL DISPLAY_A_BIT
LCALL DELAY
MOV A,R4
RR A ;下一位码
MOV R4,A
DEC R0 ;下一显示数码
CJNE R0,#60H,DISPLAY_SCAN1
RET
KEYSCAN1: ACALL KS2 ;调用是否有键闭合程序
JNZ LK1N ;有键按下转LK1N处理
RET ;没键按下,返回
LK1N: MOV R6,#12 ;等待3MS
YS2N: ACALL DISP1
DJNZ R6,YS2N
ACALL KS2 ;确有键闭合吗?
JNZ LK2N ;有,确定键值
RET ;没有继续扫描
LK2N: MOV R0,#40H ;设R0为键扫描码入口地址
LK3N: MOV P3,#0FFH
MOV P0,#0FFH
MOV A,@R0 ;得扫描码
MOV P3,A
MOV R6,#0FFH
LK4N: DJNZ R6,LK4N
MOV A,P0 ;读列线
CPL A
JZ NEXT1N ;无键,转下一行
ADD A,@R0 ;有键,确定键码 =列取反+行
MOV 60H,A
MOV R1,#44H ;键码首地址送R1,查键值
MOV R3,#00H ;键值置初值
CMPN: CLR C
MOV A,60H
SUBB A,@R1
JZ LK5N ;查到键码
INC R1 ;不是继续查找
INC R3
AJMP CMPN
LK5N: LCALL DISP1 ;判键是否释放
ACALL KS2
JNZ LK5N
MOV A,R3 ;键值放A中
RET
NEXT1N: INC R0 ;修改行扫描码
CJNE R0,#44H,LK3N
AJMP KEYSCAN1
KS2: MOV P0,#0FFH ;列全1,送行全0
MOV P3,#0F0H
MOV R6,#05H
DS6N: DJNZ R6,DS6N
MOV A,P0 ;读列值
CPL A
RET
KEYSCAN2: ACALL KS3 ;调用是否有键闭合程序
JNZ LK1NN ;有键按下转LK1处理
NINN: MOV R6,#06h
YSNN: ACALL DISP1
DJNZ R6,YSNN
AJMP KEYSCAN2
LK1NN: MOV R6,#12 ;等待12MS
YS1NN: ACALL DISP1
DJNZ R6,YS1NN
ACALL KS3 ;确有键闭合吗?
JNZ LK2NN ;有,确定键值
AJMP NINN ;没有继续扫描
LK2NN: MOV R0,#40H ;设R0为键扫描码入口地址
LK3NN: MOV P3,#0FFH
MOV P0,#0FFH
MOV A,@R0 ;得扫描码
MOV P3,A
MOV R6,#0FFH
LK4NN: DJNZ R6,LK4NN
MOV A,P0 ;读列线
CPL A
JZ NEXT1NN ;无键,转下一行
ADD A,@R0 ;有键,确定键码 =列取反+行
MOV 60H,A
MOV R1,#44H ;键码首地址送R1,查键值
MOV R3,#00H ;键值置初值
CMPNN: CLR C
MOV A,60H
SUBB A,@R1
JZ LK5NN ;查到键码
INC R1 ;不是继续查找
INC R3
AJMP CMPNN
LK5NN: ACALL DISP1 ;判键是否释放
ACALL KS3
JNZ LK5NN
MOV A,R3 ;键值放A中
RET
NEXT1NN: INC R0 ;修改行扫描码
CJNE R0,#44H,LK3NN
AJMP KEYSCAN2
KS3: MOV P0,#0FFH ;列全1,送行全0
MOV P3,#0F0H
MOV R6,#05H
DS6NN: DJNZ R6,DS6NN
MOV A,P0 ;读列值
CPL A
RET
JI_SUAN:
MOV B,#2 ;假设每圈走2厘米
MOV A,R5
MUL AB
ONTO: MOV 6BH,A ;高度放在6BH中
MOV B,#100
DIV AB
MOV 64H,A ;十位赋予63H
MOV A,B
MOV B,#10
DIV AB
MOV 63H,A ;个位赋予62H
MOV A,B
MOV 62H,A ;十分位赋予61H
MOV 61H,#00H
RET
JI_SUAN1:
MOV B,#2 ;假设每圈走2厘米
MOV A,R5
MUL AB
ADD A,70H
AJMP ONTO
JI_SUAN2:
MOV B,#2 ;假设每圈走2厘米
MOV A,R5
MUL AB
MOV B,A
MOV A,71H
SUBB A,B
AJMP ONTO
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -