#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
cblock
d1
d2
flag
endc
init:
banksel ANSEL ;switch banks
clrf ANSEL ;digital I/O
banksel TRISA ;bank switch
movlw b'00001000' ;set ra3 as input
movwf TRISA
banksel PORTA ;switch to banks
clrf PORTA ;set all low
banksel TRISC ;swich banks
movlw b'00000000'
movwf TRISC ;set port to all outputs
movwf flag ;init out flag with 0 aka off
banksel PORTC ;switch banks
clrf PORTC
start:
bcf STATUS,RP0
btfsc PORTA,3 ;check if button is pressed (PULLED LOW - PRESS = HIGH)
call toggle ;if pressed (HIGH) call toggle
call Delay ;if not press or when returning from toggle call delay
goto start ;repeat it all
toggle:
btfsc flag,0 ;check if flag is cleared if so turn it on
goto off ;if not and flag is set turn it off
on:
bsf PORTC,0 ;turn led on
bsf flag,0 ;set our flag
return ;go back
off:
bcf PORTC,0 ;turn led off
bcf flag,0 ;clear flag
return ;go back
Delay
movlw 0xE6
movwf d1
movlw 0x04
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
goto $+1
nop
return
end