	ORG        0000H
K1      REG        P2.0	      			 ;正轉
K2      REG        P2.1				 ;逆轉
K3      REG        P2.2				 ;高速
K4      REG        P2.3				 ;中速
K5      REG        P2.4				 ;低速
	MOV	   R4,#0			 ;初始設定R4為0速度快速
	MOV	   R0,#200			 ;迴圈數執行200次0.005ms等於pwm1ms及清除0
	JMP	   RIGHT			 ;跳到RIGHT正轉執行

RIGHT:						 ;正轉
        JB	   K1,LEFT			 ;未按下K1鍵則繼續掃描
	JNB	   K1,$				 ;有按下K1鍵則等待放開
	MOV	   R1,#0			 ;設定R1暫存為0開始由R5內容取代R1內容，累加迴圈做PWM輸出，達200次後停止
	MOV	   R5,#0			 ;遞增紀錄迴圈需幾個PWM輸出0.005ms次數	
	JMP	   LOOP				 ;跳到LOOP執行PWM輸出HIGH及延遲		
			
LOOP:						 ;起始設定、PWM輸出延遲 1 High 
	
	SETB       P1.0                          ;設置P1.0為1 High
        CALL       DELAY                         ;呼叫PWM輸出延遲0.5ms	
	CALL       DELAY			 ;呼叫PWM輸出延遲0.5ms 共 1ms
	JMP	   WAITDELAY			 ;跳到WAITDELAY執行PWM輸出HIGH及延遲

WAITDELAY:					 ;PWM輸出延遲
		
	CALL	   DELAY1	    		 ;呼叫PWM輸出延遲0.005ms
	DJNZ	   R1,WAITDELAY			 ;R1暫存次數不為0，則跳到WAITDELAY重複執行
	INC	   R5				 ;R5內容加1
	MOV	   R1,R5			 ;將R5的內容值放入R1作為取代，使下一次執行不會被DJNZ R1,WAITDELAY取代	
	CLR        P1.0                          ;清除為0 Low
	JMP	   CLRDELAY			 ;跳到CLRDELAY執行LOW延遲次數

CLRDELAY:					 ;清除延遲 0 Low 
	
	CALL	   DELAY1			 ;呼叫清除延遲0.005ms
	DJNZ	   R4,CLRDELAY			 ;清除DELAY次數為R4，當次數執行完畢跳到下一行執行，未執行完畢跳到CLRDELSY繼續延遲
	DJNZ	   R0,LOOP			 ;R0內容從200遞減到0才結束，否則跳到LOOP，整個High Low 須執行200次 共2ms才結束 
	MOV	   R0,#200			 ;重設起始點迴圈數執行200次pwm及清除0
	MOV	   R1,#0
	JMP	   RIGHT			 ;200次旋轉180度後，跳到RIGHT重新掃描全部按鍵

LEFT: 						 ;反轉

	JB	   K2,L2          		 ;未按下K2鍵則繼續掃描
	JNB	   K2,$				 ;有按下K2鍵則等待放開
	MOV	   R1,#200			 ;設定R1暫存為200開始遞減，遞減迴圈做PWM輸出，等R1減到0時後停止
	MOV	   R5,#200			 ;紀錄迴圈需幾個PWM輸出0.005ms次數
	JMP	   LOOP1			 ;跳到LOOP1執行PWM輸出HIGH及延遲	

LOOP1:						 ;起始設定、PWM輸出延遲 1 High 
	
	SETB       P1.0                          ;設置P1.0為1 High
        CALL       DELAY                         ;呼叫PWM輸出延遲0.5ms	
	CALL       DELAY			 ;呼叫PWM輸出延遲0.5ms 
	JMP	   WAITDELAY1			 ;跳到LOOP1執行PWM輸出HIGH及延遲

WAITDELAY1:					 ;PWM輸出延遲
		
	CALL	   DELAY1	    		 ;呼叫PWM輸出延遲0.005ms
	DJNZ	   R1,WAITDELAY1		 ;R1暫存次數不為0，則跳到WAITDELAY1重複執行
	DEC	   R5				 ;R5內容減1
	MOV	   R1,R5			 ;將R5的內容值放入R1作為取代，使下一次執行不會被DJNZ R1,WAITDELAY取代	
	CLR        P1.0                          ;清除為0 Low
	JMP	   CLRDELAY1			 ;跳到CLRDELAY1執行LOW延遲次數

CLRDELAY1:					 ;清除延遲 0 Low 
	
	CALL	   DELAY1			 ;呼叫清除延遲0.005ms
	DJNZ	   R4,CLRDELAY1			 ;清除DELAY次數為R4，當次數執行完畢跳到下一行執行，未執行完畢跳到CLRDELSY1繼續延遲
	DJNZ	   R0,LOOP1			 ;R0內容從200遞減到0才結束，否則跳到LOOP1，整個High Low 須執行200次 共2ms才結束 
	MOV	   R0,#200			 ;重設起始點迴圈數執行200次pwm及清除0
	JMP	   RIGHT			 ;200次旋轉180度後，跳到RIGHT重新掃描全部按鍵				 
	
L2:						 ;高速
	JB	   K3,L3          		 ;未按下K3鍵則繼續掃描
	JNB	   K3,$				 ;有按下K3鍵則等待放開
	MOV	   R4,#0			 ;R4設定LOW延遲次數，當開始LOW時，單次需延遲0.005ms，CALL DELAY1 ; DJNZ R4,CLRDELAY1	 			 
	JMP	   RIGHT			 ;跳回RIGHT

L3:						 ;中速
	JB	   K4,L4          		 ;未按下K4鍵則繼續掃描
	JNB	   K4,$				 ;有按下K4鍵則等待放開	
	MOV	   R4,#20			 ;R4設定LOW延遲次數，當開始LOW時，單次需延遲0.005ms*20，CALL DELAY1 ; DJNZ R4,CLRDELAY1	
	JMP	   RIGHT			 ;跳回RIGHT

L4:						 ;低速
	JB	   K5,RIGHT          		 ;未按下K5鍵則繼續掃描
	JNB	   K5,$				 ;有按下K5鍵則等待放開
	MOV	   R4,#40			 ;R4設定LOW延遲次數，當開始LOW時，單次需延遲0.005ms*40，CALL DELAY1 ; DJNZ R4,CLRDELAY1	
	JMP	   RIGHT			 ;跳回RIGHT


DELAY:                                           ;Delay 0.5ms
        MOV        TMOD,#00010000B               
D1:
        MOV        TH1,#0FEH
        MOV        TL1,#0CH
      
        SETB       TR1
        JNB        TF1,$
        CLR        TF1
        RET
		
DELAY1:					         ;Delay 0.005ms
	MOV        R3,#0                         ;1 週期
	DJNZ	   R3,$	                         ;2 週期
	RET	 	                         ;2 週期
 						 ;1+2+2
	END