;19JUL08 ;DEVICE = PIC16F628A ;Remote Control a Pentax Digicam (Pentax F) LIST P=16F628a, F=INHX8M #include __CONFIG 0x3f29 ; MCLR, XTOSC, No PWRT, No WDT ; Equates RESET_V EQU 0x00 ; Address of RESET Vector OSC_FREQ EQU D'429000' ; Oscillator Frequency is 429 kHz ; Registers Delay1 EQU 0x21 ; Used For Delays Delay2 EQU 0x22 ; Ports #define IROUT PORTB,7 ; Output to IR LED Driver ('H' is on) #define PWR PORTB,4 ; Input from "POWER" button ;************************************************************** ; Begin Program ;************************************************************** ORG RESET_V ; RESET vector location RESET GOTO START ORG 4 ; INT vector INT GOTO INT_HANDLER ;************************************************************** ; Initialization Routine ;************************************************************** START ; POWER_ON Reset (Beginning of program) CLRF STATUS ; Do initialization, Select bank 0 CLRF INTCON ; Clear int-flags, Disable interrupts CLRF PCLATH ; Keep in lower 2KByte BSF STATUS, RP0 ; Select bank 1 MOVLW 0xFF MOVWF TRISA ; Port A Inputs MOVLW 0x7F MOVWF TRISB ; Port B Inputs except RB7 (IROUT) MOVLW 0x80 MOVWF OPTION_REG ; No Pullups, Prescaler 1:2 to Timer0 BCF STATUS, RP0 ; Select bank 0 GOTO MAIN ;************************************************************** ; Subroutines ;************************************************************** PULSE ; 1 ms Pulse BSF IROUT ; 35 times set/reset port IROUT BCF IROUT ; There must be a more intelligent way to implement this NOP ; (like using TMR0) but I couldn't figure it out... BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT NOP BSF IROUT BCF IROUT RETURN BLANK ; 1 ms nothing MOVLW 0x21 MOVWF Delay1 LOOP DECFSZ Delay1,1 GOTO LOOP RETURN ;************************************************************** ; Interrupt Routine ;************************************************************** INT_HANDLER BCF INTCON,GIE ; Disable Interrupts BTFSC INTCON,RBIF ; RB4-7 Portchange Flag Set? GOTO SETUP_KEY ; Yes RETFIE ; Just in case SETUP_KEY BCF INTCON,RBIF ; Clear INT Source (Portchange) BCF INTCON,RBIE ; Disable RB4-7 Portchange NOP RETFIE ;************************************************************** ; Main ;************************************************************** MAIN BSF INTCON,GIE ; Enable Interrupts BSF INTCON,RBIE ; Enable RB4-7 Portchange SLEEP NOP ; Prevents execution of this instruction after INT BCF INTCON,GIE ; Disable Interrupts BTFSC PWR ; Power Button Pressed? GOTO MAIN ; No MOVLW 0x0B ; 13 ms 38 kHz pulse MOVWF Delay2 PART1 CALL PULSE DECFSZ Delay2,1 GOTO PART1 MOVLW 0x03 ; 3 ms silence MOVWF Delay2 PART2 CALL BLANK DECFSZ Delay2,1 GOTO PART2 MOVLW 0x07 ; 7 times 1 ms pulses 1 ms silence MOVWF Delay2 PART3 CALL PULSE CALL BLANK DECFSZ Delay2,1 GOTO PART3 MOVLW 0x22 ; 22 ms silence MOVWF Delay2 PART4 CALL BLANK DECFSZ Delay2,1 GOTO PART4 GOTO MAIN END