#include __config (_CP_OFF & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _CPD_OFF &_PWRTE_OFF) cblock 0x20 Delay1 ; Adjustable exposure delay endc org 0 Init: bsf INTCON,GIE ; Enable global interrupt bsf INTCON,T0IE ; Enable timer0 interrupt bsf INTCON,GPIE ; Enable interrupt-on-change clrf GPIO ; Initialization GP0-GP5 movlw 0x07 ; TURN-OFF analog comparator movwf CMCON bsf STATUS,RP0 ; Select bank 1 call 3FFH ; Load callibration value for the internal oscillator movwf OSCCAL bsf IOC,4 ; Enable interrupt-on-change, GP4 bcf TRISIO,5 ; Make GP5 an output movlw b'00000011' ; Set timer0 prescaler to 16 movwf OPTION_REG bcf STATUS,RP0 ; Back to bank0 MainLoop: bcf INTCON,T0IF ; Clear timer0 interrupt flag bcf INTCON,GPIF ; Clear switch interrupt flag sleep ; Wait for switch being pressed btfss INTCON,T0IF ; Debouncing (4096us delay) goto $-1 bsf GPIO,5 ; Set GP5 output high. (turns ON the electromagnet, holds shutter open) movf GPIO,w ; Read coded switch (shutter dial) andlw b'00001111' ; Clear the upper nibble xorlw b'00001111' ; Invert for straight BCD switch btfss GPIO,4 ; Wait for shutter to be opened. (switch being released) goto $-1 clrf TMR0 ; Start timer0 call LookUpTable ; Get exposure time call Delay ; Exposure Close: bcf GPIO,5 ; Set GP5 output low. (turns OFF the electromagnet, closes shutter) goto MainLoop Delay: ; Exposure: (adjustable time delay) movwf Delay1 bcf INTCON,T0IF ; Clear timer0 interrupt flag btfss INTCON,T0IF ; Wait for timer0 overflow interrupt flag (4096us) goto $-1 decfsz Delay1,f ; 4096us x delay1 (value is taken from LookUpTable) goto $-4 return LookUpTable: ; LookUpTable returns delay1 value addwf PCL,f retlw b'00000000' ; Coded switch:0 4096us x 256 retlw b'10000001' ; Coded switch:1 4096us x 128 retlw b'01000001' ; Coded switch:2 4096us x 64 retlw b'00100001' ; Coded switch:3 4096us x 32 retlw b'00010001' ; Coded switch:4 4096us x 16 retlw b'00001001' ; Coded switch:5 4096us x 8 retlw b'00000101' ; Coded switch:6 4096us x 4 retlw b'00000011' ; Coded switch:7 4096us x 2 retlw b'00000001' ; Coded switch:8 4096us x 1 call BULB ; Coded switch:9 regime B BULB: btfss GPIO,1 ; Wait for button switch being released goto $-1 goto Close end