; Gear Ver2.00 ; Electric reverse version ; Modified for inverted sense on neutral signal WHATGEAR EQU 0c OLDPORTA EQU 0d NEWPORTA EQU 0e NCOUNT EQU 0f UCOUNT EQU 10 DCOUNT EQU 11 TEMPPORTA EQU 12 DEBOUNCE EQU d'80' include "P16f84a.inc" LIST p=PIC16F84A __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _RC_OSC bsf STATUS,5 ;page 1 bcf PORTA,3 ;set solenoid output clrf PORTB ;all Port B output bcf STATUS,5 ;back into Page 0 clrf WHATGEAR incf WHATGEAR,1 incf WHATGEAR,1 ;defaults to neutral [=2] movlw 7F movwf PORTB ;'-' on display until neutral bcf PORTA,3 ;solenoid on NEUTLOOP movlw DEBOUNCE movwf NCOUNT LOOP1 btfsc PORTA,2 ;check for neutral (note inverted sense) goto NEUTLOOP ;if not reset counter decfsz NCOUNT,1 goto LOOP1 movlw DEBOUNCE movwf NCOUNT movwf DCOUNT movwf UCOUNT movlw b'00000100' movwf OLDPORTA GEARDISP movlw 2 xorwf WHATGEAR,W ;is neutral? if so, zero = true therefore btfss STATUS,Z ;solenoid on goto SOLOFF bcf PORTA,3 ;set solenoid ON goto CARRYON SOLOFF bsf PORTA,3 CARRYON movf WHATGEAR,0 ;into W call TABLE movwf PORTB movf WHATGEAR,1 ;move back into reg btfsc STATUS,Z goto NEUTLOOP ;if zero "^" movlw 8 xorwf WHATGEAR,0 btfsc STATUS,Z goto NEUTLOOP ;if 8 "v" UPTOP movf OLDPORTA,0 movwf NEWPORTA movf PORTA,0 andlw b'00000111' movwf TEMPPORTA btfsc TEMPPORTA,2 goto INVBIT bsf TEMPPORTA,2 ; crude and simple but works goto CONT INVBIT bcf TEMPPORTA,2 nop CONT btfss TEMPPORTA,2 call NOTNEUT decfsz NCOUNT,1 goto NNYET bsf NEWPORTA,2 movlw DEBOUNCE movwf NCOUNT NNYET btfss TEMPPORTA,1 call NOTUP decfsz UCOUNT,1 goto NUYET bsf NEWPORTA,1 movlw DEBOUNCE movwf UCOUNT NUYET btfss TEMPPORTA,0 call NOTDOWN decfsz DCOUNT,1 goto NDYET bsf NEWPORTA,0 movlw DEBOUNCE movwf DCOUNT NDYET movf NEWPORTA,0 xorwf OLDPORTA,0 btfsc STATUS,Z goto UPTOP ISDIFF movf NEWPORTA,0 movwf OLDPORTA movf NEWPORTA,0 btfsc STATUS,Z ; are no "contact" bits set goto UPTOP ; if so skip next btfss NEWPORTA,2 ; check for up bit goto NOTNEUT2 movlw 2 movwf WHATGEAR goto GEARDISP NOTNEUT2 btfss NEWPORTA,1 goto NOTUP2 incf WHATGEAR,1 movlw 2 xorwf WHATGEAR,0 ; are we in neutral after INC? btfss STATUS,Z goto GEARDISP incf WHATGEAR,1 ; if so INC again goto GEARDISP NOTUP2 ; [has to be down!] decf WHATGEAR,1 movlw 2 ; are we in neutral after DEC? xorwf WHATGEAR,0 btfss STATUS,Z goto GEARDISP decf WHATGEAR,1 ; if so DEC again goto GEARDISP ;================ ; Procs + Modules ;================ TABLE addwf 02,1 retlw H'67' ; "^" retlw H'F6' ; "1" retlw H'84' ; "0" retlw H'4c' ; "2" retlw H'54' ; "3" retlw H'36' ; "4" retlw H'15' ; "5" retlw H'05' ; "6" retlw H'3e' ; "v" INFLOOP goto INFLOOP NOTNEUT bcf NEWPORTA,2 movlw DEBOUNCE movwf NCOUNT return NOTDOWN bcf NEWPORTA,0 movlw DEBOUNCE movwf DCOUNT return NOTUP bcf NEWPORTA,1 movlw DEBOUNCE movwf UCOUNT return END