📄 07_08.dt
字号:
LEDDUTY0:
MOV A,SPEED_L
CALL MODE1_TABH
OR A,@0b00001110 ;60
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY1:
MOV A,SPEED_L
CALL MODE1_TABL
OR A,@0b00001101 ;61
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY2:
MOV A,SPEED_R
CALL MODE1_TABH
OR A,@0b00001011 ;62
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY3:
MOV A,SPEED_R
CALL MODE1_TABL
OR A,@0b00000111 ;63
MOV R6_BUF,A
JMP LEDDISOUT
;*******************************************
DIS_MODE3:
MOV A,@0X02 ;display every bit 60ms
XOR A,FLAG_30MS
JBS STATUS,Z
JMP DIS_M2
CLR FLAG_30MS
JMP TEST2L
;********************************************************
DIS_MODE2:
MOV A,@0X02 ;display every bit 60ms
XOR A,REG_30MS
JBS STATUS,Z
JMP DIS_M2
CLR REG_30MS
;***************************************************** change speed_duty
TEST2L:
MOV SPEED_L,SPEED_L ;test speed_l is not equal 0
JBC STATUS,Z
JMP TEST2R
MOV SPEEDL_DUTY,SPEEDL_DUTY ;speedl_duty is using as to switch led
JBS STATUS,Z
JMP TEST2LH
MOV A,@0X00
MOV SPEEDL_FLAG,A ;speedl_flag is switch down and up 0=up
TEST2LH:
MOV A,@0X09
XOR A,SPEEDL_DUTY
JBS STATUS,Z
JMP TEST2LF
MOV A,@0X01
MOV SPEEDL_FLAG,A
TEST2LF: ;switch down and up from the speedl_flag=0 up speedl=1 down
MOV SPEEDL_FLAG,SPEEDL_FLAG
JBC STATUS,Z
INC SPEEDL_DUTY
MOV SPEEDL_FLAG,SPEEDL_FLAG
JBS STATUS,Z
DEC SPEEDL_DUTY
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TEST2R:
MOV SPEED_R,SPEED_R
JBC STATUS,Z
JMP DIS_M2
MOV SPEEDR_DUTY,SPEEDR_DUTY
JBS STATUS,Z
JMP TEST2RH
MOV A,@0X00
MOV SPEEDR_FLAG,A
TEST2RH:
MOV A,@0X09
XOR A,SPEEDR_DUTY
JBS STATUS,Z
JMP TEST2RF
MOV A,@0X01
MOV SPEEDR_FLAG,A
TEST2RF: ;switch up and down
MOV SPEEDR_FLAG,SPEEDR_FLAG
JBC STATUS,Z
INC SPEEDR_DUTY
MOV SPEEDR_FLAG,SPEEDR_FLAG
JBS STATUS,Z
DEC SPEEDR_DUTY
;*******************************
DIS_M2:
MOV A,@0X00
MOV SPEED_L,SPEED_L ;test the speedl=0?
JBC STATUS,Z
CLR SPEEDL_DUTY
MOV SPEED_R,SPEED_R
JBC STATUS,Z
CLR SPEEDR_DUTY
MOV A,LED_DUTY
ADD PC,A
JMP LEDDUTY00
JMP LEDDUTY01
JMP LEDDUTY02
JMP LEDDUTY03
LEDDUTY00:
MOV A,SPEEDL_DUTY
CALL MODE2L_TAB
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY01:
MOV A,SPEEDL_DUTY
CALL MODE2L_TAB
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY02:
MOV A,SPEEDR_DUTY
CALL MODE2R_TAB
MOV R6_BUF,A
JMP LEDDISOUT
LEDDUTY03:
MOV A,SPEEDR_DUTY
CALL MODE2R_TAB
MOV R6_BUF,A
;****************************************************
LEDDISOUT:
MOV A,R6_BUF
MOV PORT6,A
;***************************************************MOTORPLAY
;***************************************************
MOTORPLAY:
MOV A,MODE
ADD PC,A ;switch motor mode
JMP MODE1
JMP MODE2
JMP MODE3
;**************************************MODE1
MODE1:
BC R5_BUF,CONT1_L
BC R5_BUF,CONT2_L
JBS FLAG0,TURNL_FLAG ;switch left motor play from the turnl_flag
CALL MODE1_L
JBC FLAG0,TURNL_FLAG
CALL MODE1_L_NEV
JBC FLAG1,MOTORL_ON ;test the motorl_on that delay in mode2 and mode3
JMP $+3
BC R5_BUF,CONT1_L ;if motorl_on=0 close the G+
BC R5_BUF,CONT2_L
MOV SPEED_L,SPEED_L ;test speedl equal 0
JBS STATUS,Z
JMP $+3
BC R5_BUF,CONT1_L ;if speedl=0 then close the G+
BC R5_BUF,CONT2_L
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MODE1R:
BC R5_BUF,CONT1_R
BC R5_BUF,CONT2_R
JBS FLAG0,TURNR_FLAG ;switch right motor play
CALL MODE1_R
JBC FLAG0,TURNR_FLAG
CALL MODE1_R_NEV
JBC FLAG1,MOTORR_ON ;test the motorr_on use in mode2(4*18ms close) and mode3(3*18ms close)
JMP $+3
BC R5_BUF,CONT1_R
BC R5_BUF,CONT2_R
MOV SPEED_R,SPEED_R ;test the speedr=0? if speedr=0 close right motor
JBS STATUS,Z
JMP $+3
BC R5_BUF,CONT1_R
BC R5_BUF,CONT2_R
MOV A,R5_BUF
OR A,@0X60 ;give data to port5 from r5_buf
AND A,@0XE1
OR A,R5_BUF
MOV PORT5,A
JMP INT_EXIT
;**************************************************
MODE2:
MOV A,@0X3C ; the left total timer 60*18ms=120*9ms
MOV POSL_REG,A
MOV A,@0X44 ;the right total timer 68*18ms=204*6ms
MOV POSR_REG,A
MOV A,@0X04 ;delay 4*18ms for low
MOV NEV_REG,A
JMP TURNL
;***************************************************
MODE3:
MOV A,@0X1E ;the left total timer 30*18ms=60*9ms
MOV POSL_REG,A
MOV A,@0X22 ;the right total timer 34*18ms=102*6ms
MOV POSR_REG,A
MOV A,@0X03 ;delay 4*18ms for low
MOV NEV_REG,A
JMP TURNL
;**************************************************
TURNL:
JBC FLAG0,TURNL_FLAG ;test the turnl_flag
JMP TURNL_ON
TURNL_OFF:
MOV A,POSL_REG ;the left total timer
XOR A,REGL_18MS
JBS STATUS,Z ;if the total timer is out then jump to turnl_on
JMP $+4
BS FLAG0,TURNL_FLAG
CLR REGL_18MS
JMP TURNR
MOV A,NEV_REG
SUB A,REGL_18MS ;if the nev_reg timer is not out then colse the motorl
JBC STATUS,C
BS FLAG1,MOTORL_ON
JBS STATUS,C
BC FLAG1,MOTORL_ON
JMP TURNR
TURNL_ON:
MOV A,POSL_REG
XOR A,REGL_18MS
JBS STATUS,Z
JMP $+4
BC FLAG0,TURNL_FLAG
CLR REGL_18MS
JMP TURNR
MOV A,NEV_REG
SUB A,REGL_18MS
JBC STATUS,C
BS FLAG1,MOTORL_ON
JBS STATUS,C
BC FLAG1,MOTORL_ON
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TURNR:
JBC FLAG0,TURNR_FLAG
JMP TURNR_ON
TURNR_OFF:
MOV A,POSR_REG
XOR A,REGR_18MS
JBS STATUS,Z
JMP $+4
BS FLAG0,TURNR_FLAG
CLR REGR_18MS
JMP TURN_EXIT
MOV A,NEV_REG
SUB A,REGR_18MS
JBC STATUS,C
BS FLAG1,MOTORR_ON
JBS STATUS,C
BC FLAG1,MOTORR_ON
JMP TURN_EXIT
TURNR_ON:
MOV A,POSR_REG
XOR A,REGR_18MS
JBS STATUS,Z
JMP $+4
BC FLAG0,TURNR_FLAG
CLR REGR_18MS
JMP TURN_EXIT
MOV A,NEV_REG
SUB A,REGR_18MS
JBC STATUS,C
BS FLAG1,MOTORR_ON
JBS STATUS,C
BC FLAG1,MOTORR_ON
TURN_EXIT:
JMP MODE1
;*************************************************
MODE1_L:
JBC FLAG0,DYONL_FLAG ;test the dyonl_flag if dyonl_flag=1,speedl=off 0
JMP SPEED_OFF_L
SPEED_ON_L:
BS R5_BUF,CONT1_L ;cont1+=1 for delay_on_l
MOV DELAY_ON_L,DELAY_ON_L ;test the motor play timer is not out
JBC STATUS,Z
JMP $+3
DEC DELAY_ON_L
JMP SPEED_OFF_L
MOV A,SPEED_L ;the delay_on_l time is from the speedl
CALL DELAYON_L_TAB
MOV DELAY_ON_L,A
BC R5_BUF,CONT1_L
BS FLAG0,DYONL_FLAG
SPEED_OFF_L:
MOV DELAY_OFF_L,DELAY_OFF_L ;test the total cycle is not out
JBC STATUS,Z
JMP $+3
DEC DELAY_OFF_L
RET
MOV A,@0X12
MOV DELAY_OFF_L,A
BC FLAG0,DYONL_FLAG
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MODE1_L_NEV:
JBC FLAG0,DYONL_FLAG
JMP SPEED_OFF_L_NEV
SPEED_ON_L_NEV:
BS R5_BUF,CONT2_L
MOV DELAY_ON_L,DELAY_ON_L
JBC STATUS,Z
JMP $+3
DEC DELAY_ON_L
JMP SPEED_OFF_L_NEV
MOV A,SPEED_L
CALL DELAYON_L_TAB
MOV DELAY_ON_L,A
BS FLAG0,DYONL_FLAG
BC R5_BUF,CONT2_L
SPEED_OFF_L_NEV:
MOV DELAY_OFF_L,DELAY_OFF_L
JBC STATUS,Z
JMP $+3
DEC DELAY_OFF_L
RET
MOV A,@0X12
MOV DELAY_OFF_L,A
BC FLAG0,DYONL_FLAG
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MODE1_R:
JBC FLAG0,DYONR_FLAG
JMP SPEED_OFF_R
SPEED_ON_R:
BS R5_BUF,CONT1_R
MOV DELAY_ON_R,DELAY_ON_R
JBC STATUS,Z
JMP DELAY_R
DEC DELAY_ON_R
JMP SPEED_OFF_R
DELAY_R:
MOV A,SPEED_R
CALL DELAYON_R_TAB
MOV DELAY_ON_R,A
BC R5_BUF,CONT1_R
BS FLAG0,DYONR_FLAG
SPEED_OFF_R:
MOV DELAY_OFF_R,DELAY_OFF_R
JBC STATUS,Z
JMP $+3
DEC DELAY_OFF_R
RET
MOV A,@0X0C
MOV DELAY_OFF_R,A
BC FLAG0,DYONR_FLAG
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MODE1_R_NEV:
JBC FLAG0,DYONR_FLAG
JMP SPEED_OFF_R_NEV
SPEED_ON_R_NEV:
BS R5_BUF,CONT2_R
MOV DELAY_ON_R,DELAY_ON_R
JBC STATUS,Z
JMP $+3
DEC DELAY_ON_R
JMP SPEED_OFF_R_NEV
MOV A,SPEED_R
CALL DELAYON_R_TAB
MOV DELAY_ON_R,A
BS FLAG0,DYONR_FLAG
BC R5_BUF,CONT2_R
SPEED_OFF_R_NEV:
MOV DELAY_OFF_R,DELAY_OFF_R
JBC STATUS,Z
JMP $+3
DEC DELAY_OFF_R
RET
MOV A,@0X0C
MOV DELAY_OFF_R,A
BC FLAG0,DYONR_FLAG
RET
;*************************************exit interrupter
INT_EXIT:
BC ISR,TCIF ;clean the TCC intterrupt flag
MOV A,R4_BUF
MOV RSR,A
MOV A,R3_BUF
MOV STATUS,A
SWAPA ACC_BUF
RETI
POWERON:
DISI ;colse the intterrupt
MOV A,@0X00 ;clean the special register
MOV PORT5,A
MOV PORT6,A
MOV WPC,A
MOV ISR,A
MOV A,@0X00 ;PORT6 set as output
IOW P6CR
MOV A,@0X60
IOW P5CR
MOV A,@0XFF
IOW PDCR
MOV A,@0X0F
IOW PHCR
MOV A,@0X55 ;power on test1
XOR A,POWERTEST1
JBS STATUS,Z
JMP CLR_RAM
MOV A,@0XAA ;power on test2
XOR A,POWERTEST2
JBS STATUS,Z
JMP CLR_RAM
MOV A,@0X18 ;test power on T=1,P=1
AND A,STATUS
XOR A,@0X18
JBC STATUS,Z
JMP MAIN
CLR_RAM: ;clean the RAM
MOV A,@0X2F
MOV TEMP,A
MOV A,@0X11
MOV RSR,A
LOOP1:
CLRA
MOV R0,A
INC RSR
DJZ TEMP
JMP LOOP1
CLR TEMP
;*********************************************************
MAIN:
MOV A,@0X55
MOV POWERTEST1,A
MOV A,@0XAA
MOV POWERTEST2,A
MOV A,@0X06 ;set TCC time equal 250
MOV TCC,A
MOV A,@0X49 ;set TCC prescaler as 1:4 (256*4/4)*4=1ms
CONTW
MOV A,@0X8C ;close the WDT
IOW WDTCR
MOV A,@0X01 ;enable TCC time intterrupt flag
IOW IMR
BS FLAG1,MOTORL_ON
BS FLAG1,MOTORR_ON
ENI ;enable the intterrupt
LOOP2:
WDTC
MOV A,@0X64
XOR A,SLEEP_FLAG
JBS STATUS,Z
JMP LOOP2
CLR SLEEP_FLAG
DISI
MOV A,@0X00
IOW P5CR
MOV A,@0X00
MOV PORT5,A
MOV A,@0X0F
IOW P6CR
MOV A,@0X00
MOV PORT6,A
MOV A,@0XF0
IOW PHCR
MOV A,@0X00
IOW WDTCR
MOV A,@0X00
IOW 0X0F
MOV PORT6,PORT6
MOV A,@0X02
MOV WPC,A
SLEP
WAKE_UP:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DISI ;colse the intterrupt
WDTC
MOV A,@0X8C ;close the WDT
IOW WDTCR
MOV A,@0X00
MOV WPC,A
MOV A,@0X00 ;PORT6 set as output
IOW P6CR
MOV A,@0X60
IOW P5CR
MOV A,@0X0F
IOW PHCR
MOV A,@0X01 ;enable TCC time intterrupt flag
IOW IMR
ENI ;enable the intterrupt
JMP LOOP2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -