code 0x000
init
banksel ANSEL ; bank 2 |B2
clrf ANSEL ; turn off analog pin functions |B2
clrf ANSELH ; |B2
banksel TRISA ; bank 1 |B1
movlw b'00001000' ; |B1
movwf TRISA ; RA3 input, others outputs |B1
movlw b'11110000' ; |B1
movwf PORTC ; RC7-RC4 inputs, RC3-RC0 outputs |B1
banksel PORTC ; bank 0 |B0
clrf PORTC ; clear PORTC output latches |B0
clrf latch ; clear switch state latch |B0
clrf click ; clear click counter |B0
;
; ____---____-----_____ new switch sample (press = 1)
; latch _____---____-----____ switch state latch
; ____-__-___-____-____ w = changes, press or release
; ____-______-_________ filter out "new release" bits
; swnew ____-______-_________ leaving "new press" bits
;
getkey
movlw 32 ; reset debounce timer |B0
movwf dbctr ; dbctr = 32 |B0
dbounce
DelayCy(1*msecs) ; 1 msec sample intervals |B0
comf PORTA,W ; sample active lo switches |B0
andlw b'00001000' ; on RA3 pin |B0
xorwf latch,W ; changes (press or release)? |B0
skpnz ; yes, skip, else |B0
goto getkey ; branch (no change detected) |B0
decfsz dbctr,F ; debounced? yes, skip, else |B0
goto dbounce ; branch (sample again) |B0
xorwf latch,F ; update switch state latch |B0
andwf latch,W ; filter out "new release" bits |B0
skpnz ; a new press? yes, skip, else |B0
goto getkey ; branch (a "new release") |B0
movwf swnew ; save "new press" bits |B0
upsw
btfsc swnew,3 ; a "new press"? no, skip, else |B0
incf click,F ; increment 'click' |B0
disp
movf click,W ; wreg = 'click' value |B0
movwf PORTC ; display on RC3-RC0 LEDs |B0
goto getkey ; |B0
;