📄 步进电机总程序.asm
字号:
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV P2,#00H
MOV 40H,#0EH ;键行扫描码,分别从第一行到第四行
MOV 41H,#0DH
MOV 42H,#0BH
MOV 43H,#07H
MOV 44H,#1EH ;0的键值码
MOV 45H,#2EH ;1的键值码
MOV 46H,#4EH ;2的键值码
MOV 47H,#8EH
MOV 48H,#1DH
MOV 49H,#2DH
MOV 4AH,#4DH
MOV 4BH,#8DH
MOV 4CH,#1BH
MOV 4DH,#2BH ;9的键值码
MOV 4EH,#4BH ;A的键值码
MOV 4FH,#8BH ;B的键值码
MOV 50H,#17H
MOV 51H,#27H
MOV 52H,#47H
MOV 53H,#87H ;F的键值码
MOV 60H,#00H ;设置一个单元用来装从键盘输入的键码
MOV 66H,#0AH ;上升标志
MOV 67H,#0BH ;下降标志
MOV 68H,#0CH ;升半旗标志
MOV 6BH,#00H ;旗的初始位置
MOV 6CH,#0FH ;降半旗标志
ML: MOV R0,#61H
ML0:MOV A,#00H ;显示缓冲区清0
MOV @R0,A
INC R0
CJNE R0,#65H,ML0
ML2:ACALL DISP ;调用显示子程序
ACALL keyscan
CJNE A,66H,LOP1 ;是否是上升标志
MOV A,6BH
CJNE A,#180,LOOP1 ;是否是最高点,假定旗杆高为180厘米
AJMP ML2
LOOP1: ACALL SHANG_SHENG0 ;不是调用上升
AJMP ML
LOP1:CJNE A,67H,LOP2 ;是否是下降标志
MOV A,6BH
CJNE A,#0,LOOP2 ;是否是最底点
AJMP ML2
LOOP2: ACALL XIA_JIANG0 ;不是调用下降
AJMP ML
LOP2:CJNE A,68H,LOP3 ;是否是升半旗
MOV A,6BH
CJNE A,#180,LOOP3 ;是否是最高点
AJMP ML2
LOOP3: ACALL BAN_GAOT ;不是调用升半旗
AJMP ML
LOP3:CJNE A,6CH,ML2 ;是否是降半旗
MOV A,6BH
CJNE A,#0,LOOP4 ;是否是最底点
AJMP ML2
LOOP4: ACALL BAN_GAOL ;不是调用降半旗
AJMP ML
;显示子程序
DISP:
disp_number:
MOV R0,#64H ;显示数码存放在61~64(BCD形式)
MOV R4,#0F7H ;把显示位码取到R4
display_scan:
MOV A,@R0
MOV R2,A ;把显示数码取到R2
ACALL display_a_bit
ACALL delay
MOV A,R4
RR A ;下一位码
MOV R4,A
DEC R0 ;下一显示数码
CJNE R0,#60H,display_scan
ret
display_a_bit:
MOV DPTR,#table
next:
MOV A,R2
MOVC A,@A+DPTR
MOV p1,A ;取段码:TABLE+x
MOV A,R4
MOV p3,A ;输出位码
RET
delay:
MOV R7,#0FFH
DJNZ R7,$
RET ;延迟 2us*255+2us=512us
table:
db 0c0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
db 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,8CH
keyscan: ACALL KS1 ;调用是否有键闭合程序
JNZ LK1 ;有键按下转LK1处理
NI: mov r6,#06h
ys: ACALL DISP
djnz r6,ys
AJMP KEYSCAN
LK1: MOV R6,#12 ;等待12MS
YS1: ACALL DISP
DJNZ R6,YS1
ACALL KS1 ;确有键闭合吗?
JNZ LK2 ;有,确定键值
AJMP NI ;没有继续扫描
LK2: MOV R0,#40H ;设R0为键扫描码入口地址
LK3: MOV P3,#0FFH
MOV P0,#0FFH
MOV A,@R0 ;得扫描码
MOV P3,A
MOV R6,#0FFH
LK4: DJNZ R6,LK4
MOV A,P0 ;读列线
CPL A
JZ NEXT1 ;无键,转下一行
ADD A,@R0 ;有键,确定键码 =列取反+行
MOV 60H,A
MOV R1,#44H ;键码首地址送R1,查键值
MOV R3,#00H ;键值置初值
CMP: CLR C
MOV A,60H
SUBB A,@R1
JZ LK5 ;查到键码
INC R1 ;不是继续查找
INC R3
AJMP CMP
LK5: ACALL DISP ;判键是否释放
ACALL KS1
JNZ LK5
MOV A,R3 ;键值放A中
MOV 64H,63H ;显示缓冲区左移一位
MOV 63H,62H
MOV 62H,61H
MOV 61H,A
RET
NEXT1: INC R0 ;修改行扫描码
CJNE R0,#44H,LK3
AJMP KEYSCAN
KS1: MOV P0,#0FFH ;列全1,送行全0
MOV P3,#0F0H
MOV R6,#05H
DS6: DJNZ R6,DS6
MOV A,P0 ;读列值
CPL A
RET
;============================================================================================================
;键盘连接图 P2.4 P2.5 P2.6 P2.7
; | | | |
; ____(升半旗)C__|_(暂停)__D_|___(继续)_E__|(降半旗)__F__|_________ P3.3
; | | | |
; ____________8__|_________9_|___(上升)_A__|__(下降)__B__|_________ P3.2
; | | | |
; ____________4__|_________5_|__________6__|__________7__|_________ P3.1
; | | | |
; ____________0__|_________1_|__________2__|__________3__|_________ P3.0
;
;============================================================================================================
;----------------------------正转--------------------------
SHANG_SHENG0:
MOV A,6BH
CJNE A,#90,GO_SHANG ;在半旗状态下,可以按升半旗或升旗,使旗继续上升
AJMP BAN_GAOT
GO_SHANG:MOV R5,#0
ACALL JI_SUAN
SHANG_0: MOV R3,#240 ;每走一圈的脉冲数
START0: ACALL DISP1
MOV R0,#00H
MOV P2,#80H ;上升的同时播放音乐
START1:
MOV A,R0
MOV DPTR,#TABLE0
MOVC A,@A+DPTR
JZ START0 ;对 A 的判断,当 A = 0 时则转到 START
MOV P2,A
ACALL DELAY0 ;升半旗,速度降为原来的一半,使音乐播放完
INC R0
MOV A,R0
PUSH A
ACALL DISP1
LCALL KEYSCAN1
CJNE A,#0DH,GO_ON0 ;判断是否有暂停
ACALL ZAN_TING
ACALL DELAY1
GO_ON0:
POP A
MOV R0,A
DJNZ R3,START1
INC R5
ACALL JI_SUAN
MOV A,6BH
CJNE A,#180,SHANG_0 ;是否升到最高点
MOV P2,#00H
RET
;-----------------------------反转------------------------
XIA_JIANG0:
MOV A,6BH
CJNE A,#90,GO_XIA ;在半旗状态下,可以按降半旗或降旗,使旗继续下降
AJMP BAN_GAOL
GO_XIA:MOV R5,#90 ;假定每一圈为2厘米,则上升到180厘米所需的圈数为90.
ACALL JI_SUAN
XIA_0:MOV R3,#240
START4:ACALL DISP1
MOV P2,#00H ;下降的同时音乐停
MOV R0,#06H
START5:
MOV A,R0
MOV DPTR,#TABLE0
MOVC A,@A+DPTR
JZ START4
MOV P2,A
ACALL DELAY0
INC R0
MOV A,R0
PUSH A
ACALL DISP1
LCALL KEYSCAN1
CJNE A,#0DH,GO_ON2 ;判断是否有暂停
ACALL ZAN_TING
ACALL DELAY1
GO_ON2:
POP A
MOV R0,A
DJNZ R3,START5
DEC R5
ACALL JI_SUAN
MOV A,6BH
CJNE A,#0,XIA_0 ;是否降到最底点
MOV P2,#00H
RET
;------------------升半旗------------------
BAN_GAOT:
MOV R5,#0
MOV A,6BH
MOV 70H,A
CLR C
SUBB A,#90
JNC DA_YU
CLR 27H
AJMP SHANG_1
DA_YU: SETB 27H
SHANG_1: MOV R3,#240 ;每走一圈的脉冲数
START2: ACALL DISP1
MOV R0,#00H
MOV P2,#80H ;上升的同时播放音乐
START3:
;MOV A,R0
;PUSH A
;ACALL JI_SUAN1
;ACALL DISP1
;POP A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -