📄 07_08.dt
字号:
/*
AV_2451 双路马达
备注:
1;电源部分没有加放电电阻,会造成掉电时电压下不去,RAM无法清除,上电便开机运行
2;软件中断中所做功能过多,造成中断不准确,后续软件需要改善
3;创建日期OCT 18 08
4; 731F
JASON HUANG
*/
R0 == 0X00
TCC == 0X01
PC == 0X02
STATUS == 0X03
Z == 2
C == 0
RSR == 0X04
PORT5 == 0X05
PORT6 == 0X06
RD == 0X0D
WPC == 0X0E
ISR == 0X0F
TCIF == 0
P5CR == 0X05
P6CR == 0X06
PCR == 0X0A
PDCR == 0X0B
ODCR == 0X0C
PHCR == 0X0D
WDTCR == 0X0E
IMR == 0X0F
;R10-R1F and R20-R3F is general purpose register
TEMP == 0X10 ;use for clean genernal registers
ACC_BUF == 0X11
R3_BUF == 0X12
R4_BUF == 0X13
R6_BUF == 0X14
R5_BUF == 0X15
CONT1_L == 2 ;CONT1+ G+
CONT2_L == 1 ;CONT1- G-
CONT1_R == 3 ;CONT2+ M+
CONT2_R == 4 ;CONT2- M-
R6_REG == 0X16 ;save the port6 data in keyswitch
FLAG0 == 0X17
KEY_LONG == 0 ;long keypress flag
TURNL_FLAG== 1 ;left motor turner flag
TURNR_FLAG== 2 ;right motor turner flag
DYONL_FLAG== 3 ;left motor on/off timer flag 7/18 8/18 9/18...14/18 0=on 1=off
DYONR_FLAG== 4 ;right motor on/off timer flag 2/12 3/12 4/12...9/12
FLAG1 == 0X18
MOTORL_ON == 0 ;left motor on/off falg
MOTORR_ON == 1
MID_MID_FLAG == 2
MID_DOWN_FLAG == 3
FLAG_1MS == 0X19 ;TCC interrupter count flag
REGL_18MS == 0X1A ;the 18ms register use in left motor play
REGR_18MS == 0X1B ;the 18ms register use in right motor play
REG_1MS == 0X1C
REG_10MS == 0X1D ;10ms count flag use in 30ms count
REG_30MS == 0X1E ;30ms timer led display use in mode2 30ms*2
FLAG_30MS == 0X1F ;30ms in mode3
KEYTIME_L == 0X20 ;count the left keypress timedelay for long keypress_on
KEYTIME_R == 0X21
SPEED_L == 0X22 ;left motor speed
SPEED_R == 0X23
LED_DUTY == 0X24 ;led dispaly duty p60,p61,p62,p63
MODE == 0X25 ;motor work mode
SPEEDL_DUTY == 0X26 ;left led display duty use in mode2
SPEEDL_FLAG == 0X27 ;left the mode2 led display duty from 1 to 8 or 8 to 1
SPEEDR_DUTY == 0X28
SPEEDR_FLAG == 0X29
DELAY == 0X2A ;delay for keytest
DELAY_ON_L == 0X2B ;left motor on timer in one cycle
DELAY_OFF_L == 0X2C ;the whole cycle timer
DELAY_ON_R == 0X2D ;right motor on timer
DELAY_OFF_R == 0X2E ;the whole cycle timer
POSL_REG == 0X2F ;the left cycle timer in mode2 and mode3
NEV_REG == 0X30 ;the motor close timer in one cycle
POSR_REG == 0X31 ;the right cycle timer
POWERTEST1 == 0X32 ;powertest1
POWERTEST2 == 0X33 ;powertest2
SLEEP_FLAG == 0X34 ;200MS then sleep
SLEEP_STATE == 0X35
R6_REG1 == 0X36
R6_REG2 == 0X37
KEY_FLAG == 0X38
S1_FLAG == 0
S2_FLAG == 1
S3_FLAG == 2
S4_FLAG == 3
S5_FLAG == 4
S6_FLAG == 5
S8_FLAG == 6
KEY_STATE == 0X39
S1_STATE == 0
S2_STATE == 1
S3_STATE == 2
S4_STATE == 3
S5_STATE == 4
S6_STATE == 5
S8_STATE == 6
;********************************PROCESS START
ORG 000H
NOP
NOP
NOP
NOP
NOP
JMP POWERON ;jump to poweron
NOP
ORG 008H ;interrupter address
JMP INT_TCC ;jump to TCC interupter
ORG 040H
;****************************************
MODE1_TABH: ;mode1 led display table for low four bit
ADD PC,A ;
RETL @0B00000000
RETL @0B00010000 ;led1~1
RETL @0B00110000 ;led1~2
RETL @0B01110000 ;led1~3
RETL @0B11110000 ;led1~4
RETL @0B11110000 ;led1~4 ;
RETL @0B11110000 ;led1~4
RETL @0B11110000 ;led1~4
RETL @0B11110000 ;led1~4
MODE1_TABL: ;mode1 led display table for high four bit
ADD PC,A ;
RETL @0B00000000
RETL @0B00000000 ;led1~1
RETL @0B00000000 ;led1~2
RETL @0B00000000 ;led1~3
RETL @0B00000000 ;led1~4
RETL @0B00010000 ;led5~5 ;
RETL @0B00110000 ;led5~6
RETL @0B01110000 ;led5~7
RETL @0B11110000 ;led5~8
MODE2L_TAB: ;mode2 and mode3 led display table for left
ADD PC,A
RETL @0b00001111 ;
RETL @0b00011110 ;led1
RETL @0b00101110 ;led2
RETL @0b01001110 ;led3
RETL @0b10001110 ;led4
RETL @0b00011101 ;led5
RETL @0b00101101 ;led6
RETL @0b01001101 ;led7
RETL @0b10001101 ;led8
MODE2R_TAB: ;mode2 and mode3 led display table for right
ADD PC,A
RETL @0b00001111 ;
RETL @0b00011011 ;led1
RETL @0b00101011 ;led2
RETL @0b01001011 ;led3
RETL @0b10001011 ;led4
RETL @0b00010111 ;led5
RETL @0b00100111 ;led6
RETL @0b01000111 ;led7
RETL @0b10000111 ;led8
DELAYON_L_TAB: ;motor play table for left (G+)
ADD PC,A
RETL @0X00 ;TOTAL IS 0X12 (9MS*2)
RETL @0X07 ;SPEEDL 1
RETL @0X08 ;SPEEDL 2
RETL @0X09 ;SPEEDL 3
RETL @0X0A ;SPEEDL 4
RETL @0X0B ;SPEEDL 5
RETL @0X0C ;SPEEDL 6
RETL @0X0D ;SPEEDL 7
RETL @0X0E ;SPEEDL 8
DELAYON_R_TAB: ;motor play table for right (M+)
ADD PC,A
RETL @0X00 ;TOTAL IS 0X0C (6MS*2)
RETL @0X02 ;SPEEDR 1
RETL @0X03 ;SPEEDR 2
RETL @0X04 ;SPEEDR 3
RETL @0X05 ;SPEEDR 4
RETL @0X06 ;SPEEDR 5
RETL @0X07 ;SPEEDR 6
RETL @0X08 ;SPEEDR 7
RETL @0X09 ;SPEEDR 8
;*************************************************************
INT_TCC:
MOV ACC_BUF,A ;save the A ,RSR and STATUS register
SWAP ACC_BUF
MOV A,STATUS
MOV R3_BUF,A
MOV A,RSR
MOV R4_BUF,A
JBS ISR,TCIF ;test the TCC interrupter flag
JMP INT_EXIT
INC LED_DUTY ;for led dipaly bit (P=0,G=1,F=2,E=3)
JBC LED_DUTY,2
CLR LED_DUTY
INC FLAG_1MS ;for count TCC interrupt times for 18ms
INC REG_1MS ;for 10ms
INC SLEEP_FLAG
MOV SPEED_L,SPEED_L
JBS STATUS,Z
CLR SLEEP_FLAG
MOV SPEED_R,SPEED_R
JBS STATUS,Z
CLR SLEEP_FLAG
MOV A,@0X12 ;timer 18ms
XOR A,FLAG_1MS
JBS STATUS,Z
JMP $+4
INC REGL_18MS ;for left motor timer
INC REGR_18MS ;for right motor timer
CLR FLAG_1MS
MOV A,@0X0A ;timer 10ms for keyscan
XOR A,REG_1MS
JBS STATUS,Z
JMP DISPLAY ;display one bit every 1ms
MOV A,@0X0F ;set the i/o port use for keyscan
IOW P6CR ;port6 as input
MOV A,@0X00
MOV PORT6,A
MOV A,@0X00
IOW P5CR ;port5 as output
MOV A,@0X40 ;for keyscan all key
MOV PORT5,A
MOV A,@0XF0
IOW PHCR ;port6 pull high enable
CLR REG_1MS
INC REG_10MS ;for 40ms timer
MOV A,@0X03
XOR A,REG_10MS
JBS STATUS,Z
JMP KEY_SCAN
CLR REG_10MS
INC REG_30MS ;for mode2 display timer
INC FLAG_30MS ;for mode3 display timer
KEY_SCAN:
MOV A,@0X30 ;delay time
MOV DELAY,A
LOOP5:
DJZ DELAY
JMP LOOP5
;COM1
JBS PORT6,0 ;KEY SCAN START
JMP S2_KEY_ON
JBS PORT6,1
JMP S5_KEY_ON
JBS PORT6,2
JMP S6_KEY_ON
JBS PORT6,3
JMP S4_KEY_ON
;COM2
MOV A,@0X20 ;switch com2
MOV PORT5,A
MOV A,@0X30 ;delay time
MOV DELAY,A
LOOP4:
DJZ DELAY
JMP LOOP4
JBS PORT6,0
JMP S1_KEY_ON
JBS PORT6,1
JMP S3_KEY_ON
JBS PORT6,2
JMP S8_KEY_ON
NO_KEY:
MOV KEY_FLAG,KEY_FLAG ;no key test the key_flag and then delay 10ms
JBC STATUS,Z
JMP NO_KEY1
CLR KEY_FLAG
JMP KEY_SCAN_EXIT
NO_KEY1:
MOV KEY_STATE,KEY_STATE ;no key test the key_state and then delay 10ms
JBC STATUS,Z
JMP KEY_SCAN_EXIT
CLR KEY_STATE
BC FLAG0,KEY_LONG
BC FLAG1,MID_DOWN_FLAG
BC FLAG1,MID_MID_FLAG
MOV A,@0X01
MOV KEYTIME_L,A
MOV KEYTIME_R,A
JMP KEY_SCAN_EXIT
S1_KEY_ON:
JBC KEY_FLAG,S1_FLAG ;test key on key_flag and delay 10ms
JMP S1_KEY_ON1
BS KEY_FLAG,S1_FLAG
JMP KEY_SCAN_EXIT
S1_KEY_ON1:
JBC KEY_STATE,S1_STATE ;test key on key_state and delay 10ms
JMP LEFT_DOWN_S1
BS KEY_STATE,S1_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S2_KEY_ON:
JBC KEY_FLAG,S2_FLAG ;test key on key_flag and delay 10ms
JMP S2_KEY_ON1
BS KEY_FLAG,S2_FLAG
JMP KEY_SCAN_EXIT
S2_KEY_ON1:
JBC KEY_STATE,S2_STATE ;test key on key_state and delay 10ms
JMP LEFT_UP_S2
BS KEY_STATE,S2_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S3_KEY_ON:
JBC KEY_FLAG,S3_FLAG ;test key on key_flag and delay 10ms
JMP S3_KEY_ON1
BS KEY_FLAG,S3_FLAG
JMP KEY_SCAN_EXIT
S3_KEY_ON1:
JBC KEY_STATE,S3_STATE ;test key on key_state and delay 10ms
JMP MID_DOWN_S3
BS KEY_STATE,S3_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S4_KEY_ON:
JBC KEY_FLAG,S4_FLAG ;test key on key_flag and delay 10ms
JMP S4_KEY_ON1
BS KEY_FLAG,S4_FLAG
JMP KEY_SCAN_EXIT
S4_KEY_ON1:
JBC KEY_STATE,S4_STATE ;test key on key_state and delay 10ms
JMP MID_UP_S4
BS KEY_STATE,S4_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S5_KEY_ON:
JBC KEY_FLAG,S5_FLAG ;test key on key_flag and delay 10ms
JMP S5_KEY_ON1
BS KEY_FLAG,S5_FLAG
JMP KEY_SCAN_EXIT
S5_KEY_ON1:
JBC KEY_STATE,S5_STATE ;test key on key_state and delay 10ms
JMP MID_MID_S5
BS KEY_STATE,S5_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S6_KEY_ON:
JBC KEY_FLAG,S6_FLAG ;test key on key_flag and delay 10ms
JMP S6_KEY_ON1
BS KEY_FLAG,S6_FLAG
JMP KEY_SCAN_EXIT
S6_KEY_ON1:
JBC KEY_STATE,S6_STATE ;test key on key_state and delay 10ms
JMP RIGHT_UP_S6
BS KEY_STATE,S6_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
S8_KEY_ON:
JBC KEY_FLAG,S8_FLAG ;test key on key_flag and delay 10ms
JMP S8_KEY_ON1
BS KEY_FLAG,S8_FLAG
JMP KEY_SCAN_EXIT
S8_KEY_ON1:
JBC KEY_STATE,S8_STATE ;test key on key_state and delay 10ms
JMP RIGHT_DOWN_S8
BS KEY_STATE,S8_STATE
BS FLAG0,KEY_LONG ;set long key flag
JMP KEY_SCAN_EXIT
;*************************************key do
LEFT_DOWN_S1:
JBC FLAG0,KEY_LONG ;test longkey
JMP KEY1
BS FLAG0,KEY_LONG ;longkey 100*10ms then add 1
MOV A,@0X32
MOV KEYTIME_L,A
KEY1:
DJZ KEYTIME_L ;when longkey then delay 1s
JMP KEY_SCAN_EXIT
BC FLAG0,KEY_LONG ;clean longkey flag
INC KEYTIME_L
MOV SPEED_L,SPEED_L ;decrease speedl when speedl is not equal 0
JBC STATUS,Z
JMP KEY_SCAN_EXIT
DEC SPEED_L
JMP KEY_SCAN_EXIT
LEFT_UP_S2:
JBC FLAG0,KEY_LONG
JMP KEY2
BS FLAG0,KEY_LONG ;when long key then delay 100*10ms
MOV A,@0X32
MOV KEYTIME_L,A
KEY2:
DJZ KEYTIME_L
JMP KEY_SCAN_EXIT
INC KEYTIME_L
BC FLAG0,KEY_LONG
INC SPEED_L ;increase speedl when it is not equal 9
MOV A,@0X09
XOR A,SPEED_L
JBS STATUS,Z
JMP KEY_SCAN_EXIT
MOV A,@0X08
MOV SPEED_L,A
JMP KEY_SCAN_EXIT
MID_DOWN_S3:
MOV A,@0X02
MOV MODE,A
JBC FLAG1,MID_DOWN_FLAG
JMP KEY_SCAN_EXIT
BS FLAG1,MID_DOWN_FLAG
MOV A,@0X00 ;give the start speed_duty and the channel that is different from the mode3
MOV SPEEDR_DUTY,A
MOV SPEEDR_FLAG,A
MOV A,@0X01
MOV SPEEDL_FLAG,A
MOV A,@0X09
MOV SPEEDL_DUTY,A
CLR FLAG_30MS
CLR REGL_18MS
CLR REGR_18MS
JMP KEY_SCAN_EXIT
MID_UP_S4:
MOV A,@0X00
MOV MODE,A
BS FLAG1,MOTORL_ON
BS FLAG1,MOTORR_ON
JMP KEY_SCAN_EXIT
MID_MID_S5:
MOV A,@0X01
MOV MODE,A
JBC FLAG1,MID_MID_FLAG
JMP KEY_SCAN_EXIT
BS FLAG1,MID_MID_FLAG
MOV A,@0X00 ;give the start speed_duty and the channel
MOV SPEEDL_DUTY,A
MOV SPEEDL_FLAG,A
MOV A,@0X09
MOV SPEEDR_DUTY,A
MOV A,@0X01
MOV SPEEDR_FLAG,A
CLR REG_30MS
CLR REGL_18MS
CLR REGR_18MS
JMP KEY_SCAN_EXIT
RIGHT_UP_S6:
JBC FLAG0,KEY_LONG
JMP KEY6
BS FLAG0,KEY_LONG
MOV A,@0X32 ;delay 1s for long key
MOV KEYTIME_R,A
KEY6: ;short key
DJZ KEYTIME_R
JMP KEY_SCAN_EXIT
INC KEYTIME_R
BC FLAG0,KEY_LONG
INC SPEED_R
MOV A,@0X09
XOR A,SPEED_R
JBS STATUS,Z
JMP KEY_SCAN_EXIT
MOV A,@0X08
MOV SPEED_R,A
JMP KEY_SCAN_EXIT
RIGHT_DOWN_S8:
JBC FLAG0,KEY_LONG
JMP KEY8
BS FLAG0,KEY_LONG
MOV A,@0X32 ;long key delay time 100*10ms=1s
MOV KEYTIME_R,A
KEY8: ;short key
DJZ KEYTIME_R
JMP KEY_SCAN_EXIT
INC KEYTIME_R
BC FLAG0,KEY_LONG
MOV SPEED_R,SPEED_R
JBC STATUS,Z
JMP KEY_SCAN_EXIT
DEC SPEED_R
JMP KEY_SCAN_EXIT
KEY_SCAN_EXIT:
MOV A,@0X00 ;while the bit is 0 set the bit as output
IOW P6CR
MOV A,@0X60
IOW P5CR
MOV A,@0X0F ;pull high register enable p64_p67 disable p60-p63
IOW PHCR
MOV A,R6_BUF
MOV PORT6,A
MOV A,R5_BUF
MOV PORT5,A
DISPLAY:
MOV A,MODE
ADD PC,A
JMP DIS_MODE1
JMP DIS_MODE2
JMP DIS_MODE3
JMP MOTORPLAY
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DIS_MODE1:
MOV A,LED_DUTY
ADD PC,A ;
JMP LEDDUTY0
JMP LEDDUTY1
JMP LEDDUTY2
JMP LEDDUTY3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -