📄 mm.asm
字号:
LEFTPWM EQU 70H
RIGHTPWM EQU 6FH
LEFTCOUNTER EQU 6EH
RIGHTCOUNTER EQU 6DH
PWMPERIOD EQU 6CH
INTCOUNTER EQU 6BH
SECOND EQU 6AH
BIT_COUNT DATA 69H
TIMER DATA 68H
TIMER1 DATA 67H
TEN DATA 66H
DATA_IN DATA 20H
DATA_OUT DATA 21H
DAT BIT P2.7 ; HD7279A的DATA连接于P1.1
KEY BIT P3.3 ; HD7279A的KEY连接于P3.1,吕昂原来的是P3.3
CS BIT P2.6 ; HD7279A的CS连接于P1.3
CLK BIT P2.4 ; HD7279A的CLK连接于P1.2
LEFTFORWARD BIT P2.0
LEFTBACKWARD BIT P2.1
RIGHTFORWARD BIT P2.2
RIGHTBACKWARD BIT P2.3
ORG 0000H
LJMP START
ORG 000BH
LJMP INTT0
ORG 001BH
LJMP INTT1
ORG 0030H
START: MOV SP,#2FH
MOV TMOD,#21H ;
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
LCALL INITIAL
MOV DATA_OUT,#81H ; 发复位(清除)指令
CALL SEND
MOV DATA_OUT,#0H ; 发复位(清除)指令
CALL SEND
MOV DATA_OUT,#80H ; 发复位(清除)指令
CALL SEND
MOV DATA_OUT,#0H ; 发复位(清除)指令
CALL SEND
SETB CS ; 恢复CS为高电平
LOOP: MOV P0,#0FFH
MOV P1,P0
MOV A,P0
ANL A,#05H
LEFTLTURN:CJNE A,#01H,RIGHTTURN
CLR ET1
MOV LEFTPWM,#15
MOV RIGHTPWM,#16
LJMP LOOP
RIGHTTURN:CJNE A,#04H,OTHERS
CLR ET1
MOV LEFTPWM,#16
MOV RIGHTPWM,#15
LJMP LOOP
OTHERS: MOV LEFTPWM,#15
MOV RIGHTPWM,#15
; MOV A,SECOND
; MOV B,#10
; DIV AB
; MOV TEN,A
; MOV DATA_OUT,#10000001B ; 下载数据且译码指令(第2位)
; CALL SEND
; MOV DATA_OUT,TEN ; 发送十位数据到HD7279A
; CALL SEND
; MOV DATA_OUT,#10000000B ; 下载数据且译码指令(第1位)
; CALL SEND
; MOV DATA_OUT,B ; 发送个位数据到HD7279A
; CALL SEND
; SETB CS
LJMP LOOP
;;;
INITIAL:MOV TH1,#06H ;
MOV TL1,#06H ;
SETB TR1
setb LEFTFORWARD
clr LEFTBACKWARD
setb RIGHTFORWARD
clr RIGHTBACKWARD
MOV LEFTPWM,#16
MOV LEFTCOUNTER,#0
MOV RIGHTPWM,#15
MOV RIGHTCOUNTER,#0
MOV PWMPERIOD,#100
MOV INTCOUNTER,#0
MOV SECOND,#0
SETB ET1
RET
;;;
INTT0: PUSH PSW
PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B0H
INC INTCOUNTER
MOV A,INTCOUNTER
CJNE A,#20,T0FIN
MOV INTCOUNTER,#0
INC SECOND
T0FIN: POP ACC
POP PSW
RETI
;;;;
INTT1: PUSH PSW
PUSH ACC
INC LEFTCOUNTER
INC RIGHTCOUNTER
MOV A,LEFTCOUNTER
CJNE A,LEFTPWM,NOCHANGE
cpl LEFTforWARD
LJMP RIGHTTEST
NOCHANGE:CJNE A,PWMPERIOD,RIGHTTEST
cpl LEFTforWARD
MOV LEFTCOUNTER,#0
RIGHTTEST:MOV A,RIGHTCOUNTER
CJNE A,RIGHTPWM,NOCHANGE1
cpl RIGHTforWARD
LJMP T1FIN
NOCHANGE1:CJNE A,PWMPERIOD,T1FIN
cpl RIGHTforWARD
MOV RIGHTCOUNTER,#0
T1FIN: POP ACC
POP PSW
RETI
;;;;;
SEND: MOV BIT_COUNT,#8 ; 设定位计数器=8
CLR CS ; 设CS为低电平
LCALL LONG_DELAY ; 长延时
SEND_LOOP: MOV C,DATA_OUT.7 ; 输出1位
MOV DAT,C
SETB CLK ; 设CLK为高电平
MOV A,DATA_OUT ; 待发送数据左移
RL A
MOV DATA_OUT,A
LCALL SHORT_DELAY ; 短延时
CLR CLK ; 设CLK为低电平
LCALL SHORT_DELAY ; 短延时
DJNZ BIT_COUNT,SEND_LOOP ; 检查是否8位都发送完毕
CLR DAT ; 发送完毕,返回
RET
RECEIVE: MOV BIT_COUNT,#8 ; 设定位计数器=8
SETB DAT ; 设P1.2(DATA)为高电平(输入状态)
LCALL LONG_DELAY ; 长延时
RECEIVE_LOOP: SETB CLK ; 设CLK为高电平
LCALL SHORT_DELAY ; 短延时
MOV A,DATA_IN ; 数据左移
RL A
MOV DATA_IN,A
MOV C,DAT ; 读取1位数据
MOV DATA_IN.0,C
CLR CLK ; 设CLK为低电平
LCALL SHORT_DELAY
DJNZ BIT_COUNT,RECEIVE_LOOP ; 是否已接收8位数据
CLR DAT ; 重设DAT口为低电平(输出状态)
RET
;;;;
LONG_DELAY: MOV TIMER,#25 ; 延时时间约50us
DELAY_LOOP: DJNZ TIMER,DELAY_LOOP
RET
;;;;;
SHORT_DELAY: MOV TIMER,#4 ; 延时时间约8us
SHORT_LP: DJNZ TIMER,SHORT_LP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -