⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 07_08.dt

📁 一个16LED显示的双路马达驱动电路图
💻 DT
📖 第 1 页 / 共 2 页
字号:
/*
	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 + -