#include <p16F677.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Delay1 ; Define two file registers for the
Delay2
Delay1B ; Define two file registers for the
Delay2B
var1
pattern
count
; delay loop
endc
org 0
Start:
bsf STATUS,RP0
movlw b'00000001'
movwf TRISB ; PORTB 7 input
clrf TRISC ; make IO PortC all output
bcf STATUS,RP0 ; back to Register Page 0
clrf var1
incf var1, f
Main:
btfsc var1,7
goto Pattern7
btfsc var1,6
goto Pattern6
btfsc var1,5
goto Pattern5
btfsc var1,4
goto Pattern4
btfsc var1,3
goto Pattern3
btfsc var1,2
goto Pattern2
btfsc var1,1
goto Pattern1
btfsc var1,0
goto Pattern0
Pattern0:
clrf PORTC
bsf PORTC,0
call Delay
clrf PORTC
call Delay
goto Main
Pattern1:
clrf PORTC
bsf PORTC,1
call Delay
clrf PORTC
call Delay
goto Main
Pattern2:
clrf PORTC
bsf PORTC,2
call Delay
clrf PORTC
call Delay
goto Main
Pattern3:
clrf PORTC
bsf PORTC,3
call Delay
clrf PORTC
call Delay
goto Main
Pattern4:
clrf PORTC
bsf PORTC,4
call Delay
clrf PORTC
call Delay
goto Main
Pattern5:
clrf PORTC
bsf PORTC,5
call Delay
clrf PORTC
call Delay
goto Main
Pattern6:
clrf PORTC
bsf PORTC,6
call Delay
clrf PORTC
call Delay
goto Main
Pattern7:
clrf PORTC
bsf PORTC,7
call Delay
clrf PORTC
call Delay
goto Main
Delay:
btfss PORTB,7
rlf var1, f
movlw d'125'
movwf Delay2
movlw d'250'
movwf Delay1
OndelayLoop:
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
return ; call it a two-tenths of a second.
DelayB:
movlw d'100'
movwf Delay2B
movlw d'2'
movwf Delay1B
OndelayLoopB:
decfsz Delay1B,f ; Waste time.
goto OndelayLoopB ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2B,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoopB ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
return ; call it a two-tenths of a second.
end