; list p=pic16f877 ; list p=pic16f876 ; ***************************************************************************** #ifdef __16F877 #include p16f877.inc #endif #ifdef __16F876 #include p16f876.inc #endif ; MACROS Bank0 macro bcf STATUS, RP0 bcf STATUS, RP1 endm Bank1 macro bsf STATUS, RP0 bcf STATUS, RP1 endm Bank2 macro bcf STATUS, RP0 bsf STATUS, RP1 endm Bank3 macro bsf STATUS, RP0 bsf STATUS, RP1 endm temp equ 0x20 ; RAM file variable delay equ 0x21 ; delay work area org 0x1f00 ; reset vector movlw HIGH start movwf PCLATH goto start org 0x04 ; interrupt vector goto $ org 0x10 start: Bank1 ; select TRIS bank movlw 0xfe movwf TRISA ; PORTA, bit 0 is now an output movlw 0x06 movwf ADCON1 ; define PORTA mode (analog/digital) Bank0 ; select default bank clrf temp ; initialize toggle variable loop: movlw 0x01 xorwf temp, f movfw temp movwf PORTA ; toggle pin call _1s_delay ; delay goto loop ; ; 3.6864-MHz clock ; ; 271-ns clock period, 1.08-us machine cycle ; ; approximate 1-second delay ; _1s_delay: movlw .100 movwf delay dloop: call _10ms_delay decfsz delay, F goto dloop return ; 9221-instruction cycles => approximately 10-ms ; (9216 is ideal) ; _10ms_delay: ; (2) to get here movlw .96 ; (1) _dloop: call _100us_delay ; (92) addlw -1 ; (1) btfss STATUS, Z ; (1/2) goto _dloop ; (2) nop ; (1) return ; (2) to get back ; 92-instruction cycles => 99.8 us ; _100us_delay: ; (2) to get here call _20us_delay ; (18) call _20us_delay ; (18) call _20us_delay ; (18) call _20us_delay ; (18) call _20us_delay+1 ; (16) return ; (2) to get back ; 18-instruction cycles => 19.5-us ; _20us_delay: ; (2) to get here goto $+1 ; (2) goto $+1 ; (2) goto $+1 ; (2) goto $+1 ; (2) goto $+1 ; (2) goto $+1 ; (2) goto $+1 ; (2) return ; (2) to get back ; 9-instruction cycles => 9.76-us ; _10us_delay: ; (2) to get here goto $+1 ; (2) goto $+1 ; (2) nop ; (1) return ; (2) to get back end