;
; unsigned char sample; // switch work variable
; unsigned char slatch = 0; // switch state latch
; unsigned char sflags = 0; // switch flag bits (b3..b0)
;
; void buttons() // sample push button switches
; { sample = 0; //
; DAT = 1; //
; CLK = 1; CLK = 0; // shift in a '1', QA==1
; DAT = 0; //
; if(SWX) sample.0 = 1; // sample switch A
; CLK = 1; CLK = 0; // shift in a '0', QB==1
; if(SWX) sample.1 = 1; // sample switch B
; CLK = 1; CLK = 0; // shift in a '0', QC==1
; if(SWX) sample.2 = 1; // sample switch C
; CLK = 1; CLK = 0; // shift in a '0', QD==1
; if(SWX) sample.3 = 1; // sample switch D
; CLK = 1; CLK = 0; // shift in a '0', QE==1
; CLK = 1; CLK = 0; // shift in a '0', QF==1
; CLK = 1; CLK = 0; // shift in a '0', QG==1
; sample ^= slatch; // changes (press or release)
; slatch ^= sample; // update switch state latch
; if(sample &= slatch) // if any "new press" bits
; { sflags ^= sample; // update switch flag bits for Main
; for(i = 0; i < 32; i++) // do 32 msec 500 Hz new press beep
; { DAT = ~DAT; // toggle speaker using 1 msec
; delay_ms(1); // interval for 500 Hz tone
; } //
; } //
; CLK = 1; CLK = 0; // clear 74HC164 outputs
; }
;
buttons ; 37 words
clrf sample ;
bsf DAT ; DAT = 1
call clock ; shift in a '1', QA==1
btfsc SWX ; switch A pressed? no, skip, else
bsf sample,0 ;
call clock ; shift in a '0', QB==1
btfsc SWX ; switch B pressed? no, skip, else
bsf sample,1 ;
call clock ; shift in a '0', QC==1
btfsc SWX ; switch C pressed? no, skip, else
bsf sample,2 ;
call clock ; shift in a '0', QD==1
btfsc SWX ; switch D pressed? no, skip, else
bsf sample,3 ;
call clock ; shift in a '0'
call clock ; shift in a '0'
call clock ; shift in a '0', QG==1
movf sample,W ;
xorwf slatch,W ; changes (press or release)
xorwf slatch,F ; update switch state latch
andwf slatch,W ; any "new press" bits?
bz clock ; no, branch, else
xorwf sflags,F ; update switch flag bits for Main
bsf beep,4 ; beep = 32
beeper movlw 1<<datpin ;
xorwf datport,F ;
DelayCy(1*msecs-5) ;
decfsz beep,F ; done? yes, skip, else
goto beeper ; loop
clock bsf CLK ; toggle CLK line
bcf CLK ;
bcf DAT ; DAT = 0
return ;
;