📄 mainpro.asm
字号:
;步进电机控制系统,控制二相步进电机正反转0—999任意角度,八级调速,
;可连续转动,停止,键盘输入,LCD显示,L298驱动。
; BY TONVERHO
; 2006/12
E EQU P3.5
RW EQU P3.6
RS EQU P3.7
KEY_PRESS EQU 00H
STOP_FLAG EQU 01H
REV_FOR EQU 02H
CHG_PRESS EQU 03H
KEY_CNT EQU 21H
FIR EQU 22H
SED EQU 23H
THR EQU 24H
TEM EQU 25H
STEPCNTH EQU 26H
STEPCNTL EQU 27H
KEYCODE EQU 28H
CURSTEP EQU 29H
TIME EQU 2AH
TESTH EQU 2BH
TESTL EQU 2CH
CNTH EQU 2DH
CNTL EQU 2EH
RATE EQU 2FH
LEAST DATA 9
STOPVAL DATA 0C0H
STEPNUM DATA 8
FIRSTEP DATA 0D1H
INITIME DATA 224
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP KEY_PAD
ORG 0030H
MAIN: MOV SP,#35H
CLR KEY_PRESS
CLR CHG_PRESS
SETB REV_FOR
SETB STOP_FLAG
MOV TIME,#INITIME
MOV KEYCODE,#00H
MOV KEY_CNT,#00H
MOV CURSTEP,#00H
MOV CNTH,#00H
MOV CNTL,#00H
MOV TIME,#128
MOV RATE,#31H
SETB EX0
SETB IT0
SETB EA
MOV P0,#STOPVAL
MOV P2,#0FFH
LCALL INI_LCD
MOV P1,#80H
LCALL ENABLE_LCD
MOV DPTR,#ANG_TAB
LCALL WRITE_LCD
MOV P1,#88H
LCALL ENABLE_LCD
MOV DPTR,#TRU_TAB
LCALL WRITE_LCD
MOV P1,#90H
LCALL ENABLE_LCD
MOV DPTR,#STA_TAB
LCALL WRITE_LCD
MOV P1,#8EH
LCALL ENABLE_LCD
MOV DPTR,#DOC_TAB
LCALL WRITE_LCD
MOV P1,#98H
LCALL ENABLE_LCD
MOV DPTR,#SPD_TAB
LCALL WRITE_LCD
MOV P1,#9CH
LCALL ENABLE_LCD
MOV A,#31H
LCALL WRITE
LOOP: JNB KEY_PRESS,$
CLR KEY_PRESS
MOV DPTR,#FUN_TAB
MOV A,KEYCODE
MOV B,#6
MUL AB
JMP @A+DPTR
FUN_TAB:
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL IS_NUMBER
LJMP LOOP
LCALL FORWARD
LJMP LOOP
LCALL REVERSE
LJMP LOOP
LCALL KEEP_RUN
LJMP LOOP
LCALL STOP_RUN
LJMP LOOP
LCALL UNDO
LJMP LOOP
LCALL SPEED
LJMP LOOP
IS_NUMBER:
INC KEY_CNT
MOV A,#3
CLR C
SUBB A,KEY_CNT
JNC LESS
MOV KEY_CNT,#00H
MOV P1,#84H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
LCALL WRITE
LCALL WRITE
RET
LESS: MOV A,#1
CJNE A,KEY_CNT,NOT_ONE
MOV FIR,KEYCODE
MOV SED,#00H
MOV THR,#00H
MOV DPTR,#NUM_TAB
MOV A,KEYCODE
MOV P1,#84H
LCALL ENABLE_LCD
MOVC A,@A+DPTR
LCALL WRITE
RET
NOT_ONE: MOV A,#2
CJNE A,KEY_CNT,NOT_TWO
MOV SED,FIR
MOV FIR,KEYCODE
MOV THR,#00H
MOV DPTR,#NUM_TAB
MOV A,KEYCODE
MOV P1,#85H
LCALL ENABLE_LCD
MOVC A,@A+DPTR
LCALL WRITE
RET
NOT_TWO: MOV THR,KEYCODE
MOV DPTR,#NUM_TAB
MOV THR,SED
MOV SED,FIR
MOV FIR,KEYCODE
MOV A,KEYCODE
MOV P1,#86H
LCALL ENABLE_LCD
MOVC A,@A+DPTR
LCALL WRITE
RET
KEY_PAD:
CLR EA
PUSH ACC
MOV A,P2
ANL A,#0FH
MOV KEYCODE,A
SETB KEY_PRESS
CJNE A,#13,NEXT1
SETB STOP_FLAG
AJMP KEY_OUT
NEXT1: CJNE A,#15,KEY_OUT
LCALL SPEED
KEY_OUT: POP ACC
SETB EA
RETI
UNDO:
MOV A,#1
CJNE A,KEY_CNT,UN_SED
DEC KEY_CNT
MOV FIR,#00H
MOV SED,#00H
MOV THR,#00H
MOV P1,#84H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
RET
UN_SED: MOV A,#2
CJNE A,KEY_CNT,UN_THR
DEC KEY_CNT
MOV FIR,SED
MOV SED,#00H
MOV THR,#00H
MOV P1,#85H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
RET
UN_THR: MOV A,#3
CJNE A,KEY_CNT,OTHER
MOV FIR,SED
MOV SED,THR
MOV THR,#00H
DEC KEY_CNT
MOV P1,#86H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
OTHER: RET
ENTER:
MOV A,SED
MOV B,#10
MUL AB
ADD A,FIR
MOV TEM,A
MOV A,THR
MOV B,#100
MUL AB
CLR C
ADDC A,TEM
MOV TEM,A
MOV A,B
ADDC A,#00H
MOV R2,A
MOV R3,TEM
MOV R6,#00H
MOV R7,#10
LCALL MULD
MOV R3,#00H
MOV R7,#LEAST
LCALL DV31
MOV STEPCNTH,R4
MOV STEPCNTL,R5
MOV KEY_CNT,#00H
RET
INI_LCD: MOV P1,#01H
LCALL ENABLE_LCD
MOV P1,#38H
LCALL ENABLE_LCD
MOV P1,#0CH
LCALL ENABLE_LCD
MOV P1,#06H
LCALL ENABLE_LCD
RET
WRITE_LCD: MOV R4,#00H
AGAIN: MOV A,R4
MOVC A,@A+DPTR
LCALL WRITE
INC R4
MOV A,R4
MOVC A,@A+DPTR
CJNE A,#0FFH,AGAIN
RET
WRITE: MOV P1,A
SETB RS
CLR RW
CLR E
LCALL DELAY_LCD
SETB E
RET
ENABLE_LCD: CLR RS
CLR RW
CLR E
LCALL DELAY_LCD
SETB E
RET
READ: SETB RS
SETB RW
SETB E
LCALL DELAY_LCD
MOV A,P1
RET
DELAY_LCD: MOV R7,#10
D1: MOV R6,#50
D2: DJNZ R6,D2
DJNZ R7,D1
RET
DELAY:
MOV R7,TIME
DEL1: MOV R6,#4
DEL2: MOV R5,#246
DJNZ R5,$
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
SPEED: PUSH ACC
PUSH DPH
PUSH DPL
CLR KEY_PRESS
MOV A,TIME
CLR C
RR A
MOV TIME,A
INC RATE
MOV A,RATE
CJNE A,#39H,NOT_NINE
MOV RATE,#31H
NOT_NINE:
MOV P1,#9CH
LCALL ENABLE_LCD
MOV A,RATE
LCALL WRITE
POP DPL
POP DPH
POP ACC
RET
FORWARD:
LCALL ENTER
MOV A,STEPCNTL
CJNE A,#00H,FOR1
MOV A,STEPCNTH
CJNE A,#00H,FOR1
LJMP FR_OUT
FOR1:
CLR STOP_FLAG
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#FOR_TAB
LCALL WRITE_LCD
MOV P1,#97H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
MOV R0,#00H
FR_GOON: MOV P1,#8BH
LCALL ENABLE_LCD
MOV DPTR,#STEP_FOR
FR_NEXT: MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
INC R0
MOV A,R0
CJNE A,#STEPNUM,FR_NOT
MOV R0,#00H
FR_NOT: LCALL DELAY
JB STOP_FLAG,FR_OUT
DEC STEPCNTL
LCALL WINC
MOV A,STEPCNTL
CJNE A,#00H,FR_GOON
MOV A,STEPCNTH
CJNE A,#00H,FOR2
LJMP FR_OUT
FOR2: DEC STEPCNTH
LJMP FR_GOON
FR_OUT: MOV STEPCNTH,#00H
MOV STEPCNTL,#00H
MOV FIR,#00H
MOV SED,#00H
MOV THR,#00H
MOV CNTH,#00H
MOV CNTL,#00H
LCALL CLEARLCD
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#STOP_TAB
LCALL WRITE_LCD
RET
REVERSE:
LCALL ENTER
MOV A,STEPCNTL
CJNE A,#00H,RE1
MOV A,STEPCNTH
CJNE A,#00H,RE1
LJMP REV_OUT
RE1:
CLR STOP_FLAG
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#REV_TAB
LCALL WRITE_LCD
MOV P1,#97H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
MOV R0,#00H
REV_GOON:
MOV P1,#8BH
LCALL ENABLE_LCD
MOV DPTR,#STEP_REV
REV_NEXT: MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
INC R0
MOV A,R0
CJNE A,#STEPNUM,REV_NOT
MOV R0,#00H
REV_NOT: LCALL DELAY
JB STOP_FLAG,REV_OUT
DEC STEPCNTL
LCALL WINC
MOV A,STEPCNTL
CJNE A,#00H,REV_GOON
MOV A,STEPCNTH
CJNE A,#00H,RE2
LJMP REV_OUT
RE2: DEC STEPCNTH
LJMP REV_GOON
REV_OUT: MOV STEPCNTH,#00H
MOV STEPCNTL,#00H
MOV FIR,#00H
MOV SED,#00H
MOV THR,#00H
MOV CNTH,#00H
MOV CNTL,#00H
LCALL CLEARLCD
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#STOP_TAB
LCALL WRITE_LCD
RET
KEEP_RUN:
CLR STOP_FLAG
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#RUN_TAB
LCALL WRITE_LCD
MOV P1,#97H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
CPL REV_FOR
JB REV_FOR,CHG_FOR
MOV DPTR,#STEP_REV
AJMP KEP_GOON
CHG_FOR: MOV DPTR,#STEP_FOR
AJMP KEP_GOON
KEP_GOON: MOV R1,#STEPNUM
MOV R0,#00H
KEP_NEXT: MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
INC R0
LCALL DELAY
JB STOP_FLAG,KEP_OUT
DJNZ R1,KEP_NEXT
LJMP KEP_GOON
KEP_OUT: RET
STOP_RUN:
SETB STOP_FLAG
MOV P0,#STOPVAL
LCALL DELAY
MOV P0,#FIRSTEP
MOV P1,#94H
LCALL ENABLE_LCD
MOV DPTR,#STOP_TAB
LCALL WRITE_LCD
MOV P1,#97H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
MOV STEPCNTH,#00H
MOV STEPCNTL,#00H
MOV FIR,#00H
MOV SED,#00H
MOV THR,#00H
MOV CNTH,#00H
MOV CNTL,#00H
LCALL CLEARLCD
RET
MULD:
MOV A,R3
MOV B,R7
MUL AB
MOV R4,B
MOV R5,A
MOV A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2
MOV B,R6
MUL AB
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV
RET
DV30: MOV R2,#10H
DM23: 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 F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET
HB2: CLR A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H
HB3: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
DJNZ R2,HB3
RET
CLEARLCD:
MOV P1,#84H
LCALL ENABLE_LCD
MOV A,#20H
LCALL WRITE
LCALL WRITE
LCALL WRITE
RET
DISBCD:
PUSH DPH
PUSH DPL
MOV P1,#8BH
LCALL ENABLE_LCD
MOV R6,#00H
MOV R7,#9
LCALL MULD
MOV A,R4
MOV R6,A
MOV A,R5
MOV R7,A
LCALL HB2
MOV TESTH,R4
MOV TESTL,R5
MOV DPTR,#NUM_TAB
MOV A,R4
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
LCALL WRITE
MOV A,R4
ANL A,#0FH
MOVC A,@A+DPTR
LCALL WRITE
MOV A,R5
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
LCALL WRITE
MOV P1,#8FH
LCALL ENABLE_LCD
MOV A,R5
ANL A,#0FH
MOVC A,@A+DPTR
LCALL WRITE
POP DPL
POP DPH
RET
WINC: CLR C
MOV A,CNTL
ADDC A,#1
MOV CNTL,A
MOV A,#00H
ADDC A,CNTH
MOV CNTH,A
MOV R2,CNTH
MOV R3,CNTL
LCALL DISBCD
RET
FOR_TAB: DB 46H,4FH,57H,0FFH
REV_TAB: DB 52H,45H,56H,0FFH
RUN_TAB: DB 52H,55H,4EH,0FFH
STOP_TAB: DB 53H,54H,50H,0FFH
NUM_TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
ANG_TAB: DB 41H,4EH,47H,3AH,0FFH
SPD_TAB: DB 53H,50H,44H,3AH,0FFH
STA_TAB: DB 53H,54H,41H,3AH,0FFH
TRU_TAB: DB 54H,52H,3AH,0FFH
DOC_TAB: DB 2EH,0FFH
STEP_FOR: DB 0F5H,0E4H,0F6H,0D2H,0FAH,0E8H,0F9H,0D1H
STEP_REV: DB 0F9H,0E8H,0FAH,0D2H,0F6H,0E4H,0F5H,0D1H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -