📄 xnew
字号:
;步进电机控制程序
;**************************************************************************
;主程序
ORG 0000H
LJMP MAIN
ORG 0013H ;INT1的中断入口
LJMP PINT1
ORG 0100H
MAIN: CLR F0 ;清中断发生标志
MOV SP,#60H
MOV DPTR,#8FFFH ;8279初始化清除命令
MOV A,#0D1H
MOVX @DPTR,A
WAIT: MOVX A,@DPTR ;等8279清除结束
JB ACC.7,WAIT
MOV A,#00 ;8279送方式命令
MOVX @DPTR,A
MOV A,#34H ;fosc=12Mhz时钟编程命令
MOVX @DPTR,A
SETB IT1 ;外部中断,下降沿触发
SETB EA ;开总中断
SETB EX1 ;允许外部中断1中断
LOOP: JNB F0,LOOP ;判中断是否发生?
LOOP1: MOV A,R0 ;取出键值
CJNE A,#00H,LOOP2 ;是正转键吗?非转LOOP2
LP0: MOV R3,#00H
LP1: MOV DPTR,#TABLE ;控制字首地址
MOV A,R3 ;查表偏移量送A
MOVC A,@A+DPTR ;查表取控制字
JZ LP0 ;转完八拍
MOV P1,A ;控制字送P1口
ACALL DELAY ;延时
INC R3 ;偏移量+1(拍数加1)
AJMP LP1
RET
LOOP2: MOV A, R0 ;取出键值
CJNE A,#01H,LOOP3 ;是反转键吗?非转LOOP3
LP2: MOV R3,#00H
MOV A,R3 ;查表偏移量送A
ADD A,#09H ;修正偏移量,查反向控制字
MOV R3,A ;偏移量保存在R3中
AJMP LP1
LOOP3: MOV A, R0 ;取出键值
CJNE A,#02H,LOOP ;是停止键吗?否转PINT1
MOV P1,#00H ;是则停转
CLR F0
AJMP LOOP
DELAY: MOV R7,#20H ;延时子程序
D1: MOV R6,#248
DJNZ R6,$
DJNZ R7,D1
RET
;**************************键输入中断服务程序*********************************
PINT1: CLR EA ;关中断
PUSH ACC
;PUSH PSW ;入栈保护
;PUSH DPH
;PUSH DPL
MOV DPTR,#8FFFH ;向命令口写入读键盘RAM
MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#8FFEH ;读入键值
MOVX A,@DPTR
MOV R0,A ;键值暂存入R0
PRI1: ;POP DPL ;出栈恢复
;POP DPH
;POP PSW
POP ACC
SETB F0 ;置中断标志
SETB EA ;开中断
RETI
;/////////////////////////////////////////////////////////////////////////////
TABLE: DB 10H,30H,20H,60H,40H,0C0H,80H,90H,00H ;正转
DB 10H,90H,80H,0C0H,40H,60H,20H,30H,00H ;反转
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -