;
;  PIC12C509
   
;    One-Touch Open/Close Window  Rev. 0.1
   
;		Programmed by DD
   
;		Greatly Supported by S.IWANO
   
;
;
;	Data Format
   
;	+---------------+
   
;	| | |O|O|X|X|I|I|   GPIO  I:Input   O:Output   X:Don't Use
   
;       +---------------+ 
  
;       Input Data
   
;                           GPO => Open Switch 
  
;                           GP1 => Close Switch
   
;
; 	Output Data
   
;		            GP4 => Open Signal
   
;		            GP5 => Close Signal
   
;
;       Function
   
;		(1)Press open button and release it within 0.1-0.4 sec
   
;    to open passenger's window automatically.
   
;		(2)Press close button and release it within 0.1-0.4 sec
   
;    to close passenger's window automatically.
   
;		(3)Press open button again when automatically opening the window
   
;    to stop opening it.
   
;		(4)Press close button again when automatically closing the window
   
;    to stop closing it.
   
; 
	list    p=pic12C509A
   
	include "p12c509a.inc"
   
;
	__FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
   
;	Configuration Code = 0xFFEA
   
;	When burning PIC, the following configuration is necessary
   
;		MCLR is OFF
   
;		Code Protection(CP) is OFF
   
;		Watch Dog Timer(WDT) is OFF
   
;		Clock is Internal RC Oscillator
   
	cblock  0x08    ;Store variables above control registers
   
        timecnt		;Time Counter
   
        wcnt1		;Wait Counter1 (For 25ms Wait)
   
        wcnt2		;Wait Counter2 (For 25ms Wait)
   
	endc
	org 0x00		;Start of Code Space
   
;=========================================
;  Start Program (& Wake up from Sleep)
   
;=========================================
START   movlw	b'00001011'    ;GP5,4,2:Output  GP3,1,0:Input
   
        tris	6                
;Set GPIO Input/Output
   
        movlw   b'11000000'     
;Wakeup Disable
   
        option
 
        movlw	b'00000000'     
;GP5,4=0
 
        movwf	GPIO
   
;===========================
;  State 1
   
;===========================
State1  btfss	GPIO,0         ;If GP0=0 (Press Open Button),
   
        goto	State2           
;   go to State2
   
        btfss   GPIO,1          
;If GP1=0 (Press Close Button),
   
        goto    State5           
;  go to State5
   
        goto    State1
   
;===========================
;  State 2
   
;===========================
State2  clrf	timecnt         ;Set timecnt=0
   
St2lp   call	wait25ms        ;Wait 25ms
   
        incf	timecnt,1        
;Increment timecnt
   
        btfsc	GPIO,0          
;if GP0=1 (Release Open Button),
   
        goto	St2TimeCheck    ;   go to St2TimeCheck
   
        goto	St2lp            
;go to St2lp
   
St2TimeCheck
        movlw	d'4'            
;W=4
 
        subwf	timecnt,0       
;timecnt-4 => W
   
        btfss	STATUS,C        
;if timecnt<4,
   
        goto	State1           
;  go to State1
   
        movlw	d'15'           
;W=15
 
        subwf	timecnt,0       
;timecnt-15 => W
   
        btfsc	STATUS,C        
;if timecnt>=15,
   
        goto	State1           
;  go to State1
   
;===========================
;  State 3
   
;===========================
State3  bsf	GPIO,4            
;Set GP4=1 (Turn on Open Signal)
   
        movlw	d'240'
   
        movwf	timecnt         
;timecnt=240 (6sec)
   
St3lp   btfss	GPIO,0         ;If GP0=0 (Press Open Button),
   
        goto	St3St4           
;   go to St3St4
   
        btfss	GPIO,1          
;If GP1=0 (Press Close Button),
   
        goto	St3St5           
;   go to St3St5
   
        call	wait25ms         
;Wait 25ms
   
        decfsz	timecnt,F      
;Decrement timecnt
   
        goto	St3lp            
;if less than 5sec, continue
   
        bcf	GPIO,4            
;Set GP4=0 (Turn off Open Signal)
   
        goto	State1           
;Go to State1
   
St3St4  bcf	GPIO,4           
;Set GP4=0 (Turn off Open Signal)
   
        goto	State4           
;Go to State4
   
St3St5  bcf	GPIO,4           
;Set GP4=0 (Turn off Open Signal)
   
        goto	State5           
;Go to State5
   
;===========================
;  State 4
   
;===========================
State4  btfsc	GPIO,0         ;If GP0=1 (Release Open Button),
   
        goto	State1           
;   go to State1
   
        goto	State4           
;Continue
 
;===========================
;  State 5
   
;===========================
State5  clrf	timecnt         ;Set timecnt=0
   
St5lp   call	wait25ms        ;Wait 25ms
   
        incf	timecnt,1        
;Increment timecnt
   
        btfsc	GPIO,1          
;if GP1=1 (Release Close Button),
   
        goto	St5TimeCheck    ;   go to St5TimeCheck
   
        goto	St5lp            
;go to St5lp
   
St5TimeCheck
        movlw	d'4'            
;W=4
 
        subwf	timecnt,0       
;timecnt-4 => W
   
        btfss	STATUS,C        
;if timecnt<4,
   
        goto	State1           
;  go to State1
   
        movlw	d'15'           
;W=9
 
        subwf	timecnt,0       
;timecnt-15 => W
   
        btfsc	STATUS,C        
;if timecnt>=15,
   
        goto	State1           
;  go to State1
   
;===========================
;  State 6
   
;===========================
State6  bsf	GPIO,5            
;Set GP5=1 (Turn on Close Signal)
   
        movlw	d'240'
   
        movwf	timecnt         
;timecnt=240 (6sec)
   
St6lp   btfss	GPIO,1         ;If GP1=0 (Press Close Button),
   
        goto	St6St7           
;   go to St6St7
   
        btfss	GPIO,0          
;If GP0=0 (Press Open Button),
   
        goto	St6St2           
;   go to St2St2
   
        call	wait25ms         
;Wait 25ms
   
        decfsz	timecnt,F      
;Decrement timecnt
   
        goto	St6lp            
;if less than 5sec, continue
   
        bcf	GPIO,5            
;Set GP5=0 (Turn off Close Signal)
   
        goto	State1           
;Go to State1
   
St6St7  bcf	GPIO,5            
;Set GP5=0 (Turn off Close Signal)
   
        goto	State7           
;Go to State4
   
St6St2  bcf	GPIO,5            
;Set GP5=0 (Turn off Close Signal)
   
        goto	State2           
;Go to State2
   
;===========================
;  State 7
   
;===========================
State7  btfsc	GPIO,1         ;If GP1=1 (Release Close Button),
   
        goto	State1           
;   go to State1
   
        goto	State7           
;Continue
 
;Subroutine
;================================
;  Wait for 25ms
   
;================================
wait25ms
        movlw	d'32'           
;*32
 
        movwf	wcnt2
   
waitlp2	clrf	wcnt1
   
waitlp1	decfsz	wcnt1,F
   
        goto	waitlp1
   
        decfsz	wcnt2,F
   
        goto	waitlp2
   
        retlw	0
   
	end