Consider using a switch state latch and relatively simple logic to sample your switches and detect the "new press" state while ignoring the other switch states. Here are the switch states;
Sample the switches at a decent debounce interval (16 to 25 msecs) either in your main program loop or in a timer based interrupt service routine. You only need a few lines of code to implement the switch state logic for multiple switches (perhaps one of the PBP gurus can interpret the C code? Sorry!);Code:swnew swold switch state 1 0 a "new press" 1 1 still pressed 0 1 a "new release" 0 0 still released
If you implement the method in an ISR you'll need to inclusive-or "swnew" with a "flags" register for your main program.Code:// swnew ____---____-----_____ new switch sample // swold _____---____-----____ switch state latch // delta ____-__-___-____-____ changes, press or release // newhi ____-______-_________ filter out release bits // while(1) // { // delay_ms(24) // 24-msec debounce interval swnew = ~porta; // sample active-lo switches swnew &= 0x0F; // on RA3..RA0 pins swnew ^= swold; // changes, press or release swold ^= swnew; // update switch state latch swnew &= swold; // filter out "new release" bits if(swnew) // if any "new press" bits { beep(); // task a "new press" beep } if(swnew.0) // if RB0 "new press" { // } // if(swnew.1) // if RB1 "new press" { // } // }
Kind regards, Mike




Bookmarks