📄 ynew.asm
字号:
;步进电机控制程序
;**************************************************************************
;主程序
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
MOV A,R0 ;取出键值
CJNE A,#00H,LOOP2 ;偏移量+1(拍数加1)
AJMP LP1
LOOP2: MOV A, R0 ;取出键值
CJNE A,#01H,LOOP3 ;是反转键吗?非转LOOP3
LP2: MOV R3,#09H
LP3: MOV A,R3 ;查表偏移量送A
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ LP2
MOV P1,A
ACALL DELAY
INC R3
MOV A, R0 ;取出键值
CJNE A,#01H,LOOP3
AJMP LP3
LOOP3: MOV A, R0 ;取出键值
CJNE A,#02H,LOOP ;是停止键吗?
MOV P1,#00H ;是则停转
AJMP MAIN
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
SETB EA
MOV DPTR,#8FFFH ;向命令口写入读键盘RAM
MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#8FFEH ;读入键值
MOVX A,@DPTR
MOV R0,A ;键值暂存入R0
CLR EA
PRI1: POP DPL ;出栈恢复
POP DPH
POP PSW
POP ACC
SETB F0 ;置中断标志
SETB EA ;开中断
RETI
;/////////////////////////////////////////////////////////////////////////////
TABLE: DB 10H,90H,80H,0C0H,40H,60H,20H,30H,00H ;正转
DB 30H,20H,60H,40H,0C0H,80H,90H,10H,00H ;反转
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -