
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;PROGRAM FOR DANCING LED
;With control of running or dancing speed
;Three speeds UP & DOWN; 
;Using three tactile switches at P0.0 & P0.1 for up & down buttons
;Idea2
;i. we should write three delay sub routines
;ii.use three switches, Mode, UP, DN consuming three port pins.
;iii. Mode switch will be SPDT
;iv. Delay sub rotine will be call only after inspecting the correspnding
;	registers of the switches
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 

ORG 0000H 


	L1 EQU P3.4			;L1 to L11 are LEDs for dancing effect of light 
	L2 EQU P3.1 
	L3 EQU P3.0 
	L4 EQU P1.7 
	L5 EQU P1.6 
	L6 EQU P1.5 
	L7 EQU P1.4 
	L8 EQU P1.3 
	L9 EQU P1.2 
	L10 EQU P1.1 
	L11 EQU P1.0 
	MODE EQU P3.3	; Mode switch will act as program switch
	UP EQU P3.5		;For speed up
	DN EQU P3.7		;For speed down

	;----------------------------------------------------------------------------
	MODCHK: 
			JNB MODE, UPCHK	;Check, if MODE switch is Position (ON/OFF)
			JNB UP, DNCHK	;Check, if UP switch is pressed
			JNB DN, MODCHK	;Check, if DOWN switch is pressed
			JB MODE, FNAUTO	;IF MODE SWICTH IS TOGGLED START FUNCTION		
	
	UPCHK:	JB UP, DNCHK
			ACALL   DBDEL 	    ;DEBOUNCE KEY DELAY
	RELEASE:JNB UP,RELEASE 	   ;WAIT FOR KEY TO RELEASE
        	ACALL   DBDEL 	    ;DEBOUNCE KEY DELAY
	INCR: 	INC R4				; Set the delay rotine number			
			CJNE R4,#02H,MODCHK ;CHECK THE PRGRAM SWITCHES
			AJMP MODCHK			;Check, if MODE switch is Position (ON/OFF)
	
	DNCHK:	JB DN, MODCHK		;Check, if DOWN switch is pressed
			ACALL   DBDEL       ;DEBOUNCE KEY DELAY
	RELEASE1:JNB DN,RELEASE1    ;WAIT FOR KEY TO RELEASE
        	ACALL   DBDEL           ;DEBOUNCE KEY DELAY
	DECR: 	DEC R4
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&										
FNAUTO: MOV R3,#05	;Selected count for five times play of same light effect 

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
D1: CALL PATTERN1 	 ;There are nine different dancing patterns/ effect, called one by one
DJNZ R3,D1 
MOV R3,#05 

D2: CALL PATTERN2 
DJNZ R3,D2 
MOV R3,#05 

D3: CALL PATTERN3 
DJNZ R3,D3 
MOV R3,#05 

D4: CALL PATTERN4 
DJNZ R3,D4 
MOV R3,#05 

D5: CALL PATTERN5 
DJNZ R3,D5 
MOV R3,#05 

D6: CALL PATTERN6 
DJNZ R3,D6 
MOV R3,#05 

D7: CALL PATTERN7 
DJNZ R3,D7 
MOV R3,#05 

D8: CALL PATTERN8 
DJNZ R3,D8 
MOV R3,#05 

D9: CALL PATTERN9 
DJNZ R3,D9 
MOV R3,#05 
JMP FNAUTO 
	
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
				   ;Sub Routines for Nine patterns
;*******************************************
PATTERN1: CLR L1 		;Sub Routine for pattern1
SETB L2 
CLR L3 
SETB L4 
CLR L5 
SETB L6 
CLR L7 
SETB L8 
CLR L9 
SETB L10 
CLR L11 
CALL DELAY 
CLR L2 
SETB L1 
CLR L4 
SETB L3 
CLR L6 
SETB L5 
CLR L8 
SETB L7 
CLR L10 
SETB L9 
SETB L11 
CALL DELAY 
RET 

PATTERN2: CALL CLEAR 		;Sub Routine for pattern2 
CLR L1 
CALL DELAY 
CALL CLEAR 
CLR L2 
CALL DELAY 
CALL CLEAR 
CLR L3 
CALL DELAY 
CALL CLEAR 
CLR L4 
CALL DELAY 
CALL CLEAR 
CLR L5 
CALL DELAY 
CALL CLEAR 
CLR L6 
CALL DELAY 
CALL CLEAR 
CLR L7 
CALL DELAY 
CALL CLEAR 
CLR L8 
CALL DELAY 
CALL CLEAR 
CLR L9 
CALL DELAY 
CALL CLEAR 
CLR L10 
CALL DELAY 
CALL CLEAR 
CLR L11 
CALL DELAY 
RET 

PATTERN3: CALL CLEAR 		;Sub Routine for pattern3 
CLR L11 
CALL DELAY 
CALL CLEAR 
CLR L10 
CALL DELAY 
CALL CLEAR 
CLR L9 
CALL DELAY 
CALL CLEAR 
CLR L8 
CALL DELAY 
CALL CLEAR 
CLR L7 
CALL DELAY 
CALL CLEAR 
CLR L6 
CALL DELAY 
CALL CLEAR 
CLR L5 
CALL DELAY 
CALL CLEAR 
CLR L4 
CALL DELAY 
CALL CLEAR 
CLR L3 
CALL DELAY 
CALL CLEAR 
CLR L2 
CALL DELAY 
CALL CLEAR 
CLR L1 
CALL DELAY 
RET 

PATTERN4: CALL CLEAR 		;Sub Routine for pattern4 
CLR L1 
CALL DELAY 
CALL CLEAR 
CLR L2 
CALL DELAY 
CALL CLEAR 
CLR L3 
CALL DELAY 
CALL CLEAR 
CLR L4 
CALL DELAY 
CALL CLEAR 
CLR L5 
CALL DELAY 
CALL CLEAR 
CLR L6 
CALL DELAY 
CALL CLEAR 
CLR L7 
CALL DELAY 
CALL CLEAR 
CLR L8 
CALL DELAY 
CALL CLEAR 
CLR L9 
CALL DELAY 
CALL CLEAR 
CLR L10 
CALL DELAY 
CALL CLEAR 
CLR L11 
CALL DELAY 
CALL CLEAR 
CLR L11 
CALL DELAY 
CALL CLEAR 
CLR L10 
CALL DELAY 
CALL CLEAR 
CLR L9 
CALL DELAY 
CALL CLEAR 
CLR L8 
CALL DELAY 
CALL CLEAR 
CLR L7 
CALL DELAY 
CALL CLEAR 
CLR L6 
CALL DELAY 
CALL CLEAR 
CLR L5 
CALL DELAY 
CALL CLEAR 
CLR L4 
CALL DELAY 
CALL CLEAR 
CLR L3 
CALL DELAY 
CALL CLEAR 
CLR L2 
CALL DELAY 
CALL CLEAR 
CLR L1 
CALL DELAY 
RET 

PATTERN5: CALL CLEAR 		;Sub Routine for pattern5 
CLR L1 
CLR L11 
CALL DELAY 
CALL CLEAR 
CLR L2 
CLR L10 
CALL DELAY 
CALL CLEAR 
CLR L3 
CLR L9 
CALL DELAY 
CALL CLEAR 
CLR L4 
CLR L8 
CALL DELAY 
CALL CLEAR 
CLR L5 
CLR L7 
CALL DELAY 
CALL CLEAR 
CLR L6 
CALL DELAY 
CALL CLEAR 
CLR L7 
CLR L5 
CALL DELAY 
CALL CLEAR 
CLR L8 
CLR L4 
CALL DELAY 
CALL CLEAR 
CLR L9 
CLR L3 
CALL DELAY 
CALL CLEAR 
CLR L10 
CLR L2 
CALL DELAY 
CALL CLEAR 
CLR L11 
CLR L1 
CALL DELAY 
CALL CLEAR 
RET 

PATTERN6: CALL ALLON 		;Sub Routine for pattern6 
CALL DELAY 
CALL CLEAR 
CALL DELAY 
RET 

PATTERN7: CALL ALLON 		;Sub Routine for pattern7
SETB L1 
CALL DELAY 
CALL ALLON 
SETB L2 
CALL DELAY 
CALL ALLON 
SETB L3 
CALL DELAY 
CALL ALLON 
SETB L4 
CALL DELAY 
CALL ALLON 
SETB L5 
CALL DELAY 
CALL ALLON 
SETB L6 
CALL DELAY 
CALL ALLON 
SETB L7 
CALL DELAY 
CALL ALLON 
SETB L8 
CALL DELAY 
CALL ALLON 
SETB L9 
CALL DELAY 
CALL ALLON 
SETB L10 
CALL DELAY 
CALL ALLON 
SETB L11 
CALL DELAY 
RET 

PATTERN8: CALL ALLON 		;Sub Routine for pattern8 
SETB L11 
CALL DELAY 
CALL ALLON 
SETB L10 
CALL DELAY 
CALL ALLON 
SETB L9 
CALL DELAY 
CALL ALLON 
SETB L8 
CALL DELAY 
CALL ALLON 
SETB L7 
CALL DELAY 
CALL ALLON 
SETB L6 
CALL DELAY 
CALL ALLON 
SETB L5 
CALL DELAY 
CALL ALLON 
SETB L4 
CALL DELAY 
CALL ALLON 
SETB L3 
CALL DELAY 
CALL ALLON 
SETB L2 
CALL DELAY 
CALL ALLON 
SETB L1 
CALL DELAY 
RET 

PATTERN9: CALL ALLON 		;Sub Routine for pattern9
SETB L11 
SETB L1 
CALL DELAY 
CALL ALLON 
SETB L10 
SETB L2 
CALL DELAY 
CALL ALLON 
SETB L9 
SETB L3 
CALL DELAY 
CALL ALLON 
SETB L8 
SETB L4 
CALL DELAY 
CALL ALLON 
SETB L7 
SETB L5 
CALL DELAY 
CALL ALLON 
SETB L6 
CALL DELAY 
CALL ALLON 
SETB L5 
SETB L7 
CALL DELAY 
CALL ALLON 
SETB L4 
SETB L8 
CALL DELAY 
CALL ALLON 
SETB L3 
SETB L9 
CALL DELAY 
CALL ALLON 
SETB L2 
SETB L10 
CALL DELAY 
CALL ALLON 
SETB L1 
SETB L11 
CALL DELAY 
RET 
;********************************************************
					      ;Sub routine for OFF all the LEDs
;********************************************************
CLEAR: SETB L1 			;Sub routine for OFF all the LEDs
SETB L2 
SETB L3 
SETB L4 
SETB L5 
SETB L6 
SETB L7 
SETB L8 
SETB L9 
SETB L10 
SETB L11 
RET 
;*******************************************************
 						;Sub routine for ON all the LEDs
;********************************************************
ALLON: CLR L1 			;Sub routine for ON all the LEDs
CLR L2 
CLR L3 
CLR L4 
CLR L5 
CLR L6 
CLR L7 
CLR L8 
CLR L9 
CLR L10 
CLR L11 
RET 
;****************************************************
; My idea was that delay sub routine poll the switches in each cycle
; If UP button is pressed then R4 should be increased & compare with the normal 
; speed value as #03.
; Accordingly it shoud select the appropriate delay constants forever till the reset or 
; on any other button press.
;****************************************************** 
DELAY:
		CJNE R4,#00H, CHK1
		JUMP DELAY0
CHK1:	CJNE R4,#01H, CHK2
		AJMP DELAY1
CHK2:	CJNE R4,#02H,CRCHK	;IF NOT EQUAL CHECK CARRY
		JUMP DELAY2

DELAY0:
		MOV R0,#0FFH
		MOV R1,#0FFH 
	INLOP: MOV R2,#0FFH 
		DJNZ R2,$ 
		DJNZ R0,INLOP 
		RET 

DELAY1:
		MOV R0,#0FFH
		MOV R1,#0FFH 
	INLOP1:DJNZ R1,$ 
		DJNZ R0,INLOP1 
		RET 
CRCHK:	MOV A,#02H
		SUBB A,R4
		JC LIMIT
LIMIT:	MOV R4,#02H
		JUMP DELAY2

DELAY2:
		MOV R0,#0FFH
		DJNZ R0,$ 
		RET
DBDEL:
        MOV     DPTR,#65536-4000 ;INITIALISE DPTR
DB10:
        INC     DPTR            ;INCREMENT DPTR
        MOV     A,DPL           ;GET DPL IN ACC
        ORL     A,DPH           ;OR IT WITH DPH IF RESULT IS
        JNZ     DB10            ;NOT ZERO THEN INCREMENT AGAIN
        RET                     ;ELSE RETURN
  

END 
