debouncing switches with a timer interrupt?


Closed Thread
Results 1 to 28 of 28

Hybrid View

  1. #1
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    I'd like to supplement Charles' fine example with an interrupt driven version of the "parallel switch state logic" example I posted earlier.

    This example uses a 1-msec timer driven interrupt "heart beat" which is perfect for toggling a piezo speaker at 500-Hz and it uses a simple counter to produce a 32-msec debounce/sample interval.

    Using a momentary switch to emulate a "toggle" switch (press to toggle from on-to-off or from off-to-on) can be accomplished directly by the driver by exclusive-or'ing the debounced "new press" bits with the "flags" switch flag bits variable. Main should test the switch flag bit and then clear it for "momentary" switches or simply test the switch flag bit for an emulated "toggle" switch.

    Code:
    void interrupt()                // 1-msec Timer 2 interrupts
    { 
      pir1.TMR2IF = 0;              // clear TMR2 interrupt flag
    //
    //  beep task (32-msec 500-Hz tone using 1-msec interrupts)
    //
      if(beep)                      // if beep task running
      { spkrpin ^= 1;               // toggle speaker pin and
        beep--;                     // decrement beep msec counter
      }
    //
    //  switch state management (multi-switch "parallel" logic)
    //
      if(--dbcount == 0)            // if 32-msec debounce interval
      { dbcount = 32;               // reset debounce timer and
        swnew = ~porta;             // sample active low 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
        flags ^= swnew;             // toggle flag bits for 'main'
        if(swnew)                   // if any "new press" bits
          beep = 32;                // task a "new press" beep
      }
    }
    Code:
    //  in "main"
    
      while(flags.0)                // while sw0 (RA0) "on" (toggle), do this block
      {                             // until new sw0 press toggles flags.0 to "off"
        if(flags.1)                 // if sw1 (RA1) "new press" (momentary)
        { flags.1 = 0;              // turn off flag and
          ...                       // do something
        }
      }
    Last edited by Mike, K8LH; - 1st August 2010 at 02:04.

  2. #2
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Can you post the code you're having problems with? I suspect there's a very simple solution.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  3. #3
    Join Date
    Dec 2009
    Location
    Kalamazoo
    Posts
    42


    Did you find this post helpful? Yes | No

    Default

    thanks for all the replies guys. ive been away for the weekend, with no computer access. here's the code, fresh from the menubuilder application.

    its a gadget that im making, to keep track/records of my workout sessions. it will also have a realtime clock/stopwatch, all displayed on a 20x2 lcd with 4 menu buttons (next, previous, up down.)

    even with the "pause 200" debouncing, (default) everytime i try to cycle through menu items, with the push of a button, it skips three to six items. (same goes when you try to change a variable) at first, i thought that proteus simulation on my pentium 4 was slow (always bitching about "simulation not running in real time because of excessive cpu load" ) so i transferred the simulation to my intel i7 laptop, and proteus is not complaining any more. still having the same skipping items problem.

    ill try mr Arrati's snipet again, but meanwhile, here's the code.

    Code:
            clear
    define OSC 16                                ;40 MHZ HS CRYSTAL
    OSCCON = %01110000
    ADCON0= %00000000                         ;PORT A ALL DIGITAL       
    ANSEL0= %00000000                         ;PORT A ALL DIGITAL
    TRISA = %00000000                         ;
    TRISB = %11111100                         ;
    TRISC = %10111000                         ;
                                                   ;
    LATA = %00000000                          ;
    LATB = %00000000                          ;
    LATC = %00000000                          ;
    
    
    
    'VARIABLE DECLARATION
    bMenuPos    var Byte     'Main menu position
    bSubMenuPos var Byte     'Sub menu position
    BTN_NEXT    var PORTB.4  'Next button
    BTN_PREV    var PORTB.5  'Previous button
    BTN_PLUS    var PORTB.6  'Plus button
    BTN_MINUS   var PORTB.7  'Minus button
    SQUATS_WT  VAR  Byte
    SQUATS_RP  VAR  Byte
    PULLDOWN_WT  VAR  Byte
    PULLDOWN_RP  VAR  Byte
    LATRAISE_WT  VAR  Byte
    LATRAISE_RP  VAR  Byte
    OVHEADPRESS_WT  VAR  Byte
    OVHEADPRESS_RP  VAR  Byte
    PREACHERCURL_WT  VAR  Byte
    PREACHERCURL_RP  VAR  Byte
    PUSHDOWN_WT  VAR  Byte
    PUSHDOWN_RP  VAR  Byte
    PECDECK_WT  VAR  Byte
    PECDECK_RP  VAR  Byte
    CABLESHRUG_WT  VAR  Byte
    CABLESHRUG_RP  VAR  Byte
    CALFRAISES_WT  VAR  Byte
    CALFRAISES_RP  VAR  Byte
    DBWRISTCURL_WT  VAR  Byte
    DBWRISTCURL_RP  VAR  Byte
    DECLINESITUP_WT  VAR  Byte
    DECLINESITUP_RP  VAR  Byte
    'END OF VARIABLE DECLARATION
    
    
    
    DEFINE LCD_DREG PORTA
    DEFINE LCD_DBIT 0
    DEFINE LCD_BITS 4
    DEFINE LCD_RSREG PORTC
    DEFINE LCD_RSBIT 0
    DEFINE LCD_EREG PORTC
    DEFINE LCD_EBIT 1
    
        
    PAUSE 500
    
    LCDOUT $FE, $01
    
    LCDOUT $FE, $80, " FITNESS GYM ASSIST"
    LCDOUT $FE, $C0, " COPYRIGHT DAVID M"
    
    PAUSE 1000
    
    MAIN
       
    GOSUB DisplayMainMenu
    GOTO MAIN
    
    
    'SUB ROUTINES
    
    '******************************************************
    'ROUTINE DisplayMainMenu
    'This routine handles the display of the main menu choices
    'All you need is to call from your main program this routine,
    'and have the button ports setup,
    '******************************************************
    DisplayMainMenu:
       bMenuPos=1   'This is the default menu option
    DisplayMainMenuLoop:
       IF bMenuPos=1 THEN
          LCDOUT $FE,1,"SQUATS WT"
       ENDIF
       IF bMenuPos=2 THEN
          LCDOUT $FE,1,"SQUATS RP"
       ENDIF
       IF bMenuPos=3 THEN
          LCDOUT $FE,1,"PULLDOWN WT"
       ENDIF
       IF bMenuPos=4 THEN
          LCDOUT $FE,1,"PULLDOWN RP"
       ENDIF
       IF bMenuPos=5 THEN
          LCDOUT $FE,1,"LAT RAISE WT"
       ENDIF
       IF bMenuPos=6 THEN
          LCDOUT $FE,1,"LAT RAISE RP"
       ENDIF
       IF bMenuPos=7 THEN
          LCDOUT $FE,1,"OVHEAD PRESS WT"
       ENDIF
       IF bMenuPos=8 THEN
          LCDOUT $FE,1,"OVHEAD PRESS RP"
       ENDIF
       IF bMenuPos=9 THEN
          LCDOUT $FE,1,"PREACHER CURL WT"
       ENDIF
       IF bMenuPos=10 THEN
          LCDOUT $FE,1,"PREACHER CURL RP"
       ENDIF
       IF bMenuPos=11 THEN
          LCDOUT $FE,1,"PUSHDOWN WT"
       ENDIF
       IF bMenuPos=12 THEN
          LCDOUT $FE,1,"PUSHDOWN RP"
       ENDIF
       IF bMenuPos=13 THEN
          LCDOUT $FE,1,"PEC DECK WT"
       ENDIF
       IF bMenuPos=14 THEN
          LCDOUT $FE,1,"PEC DECK RP"
       ENDIF
       IF bMenuPos=15 THEN
          LCDOUT $FE,1,"CABLE SHRUG WT"
       ENDIF
       IF bMenuPos=16 THEN
          LCDOUT $FE,1,"CABLE SHRUG RP"
       ENDIF
       IF bMenuPos=17 THEN
          LCDOUT $FE,1,"CALF RAISES WT"
       ENDIF
       IF bMenuPos=18 THEN
          LCDOUT $FE,1,"CALF RAISES RP"
       ENDIF
       IF bMenuPos=19 THEN
          LCDOUT $FE,1,"DBWRIST CURL WT"
       ENDIF
       IF bMenuPos=20 THEN
          LCDOUT $FE,1,"DBWRIST CURL RP"
       ENDIF
       IF bMenuPos=21 THEN
          LCDOUT $FE,1,"DECLINE SITUP WT"
       ENDIF
       IF bMenuPos=22 THEN
          LCDOUT $FE,1,"DECLINE SITUP RP"
       ENDIF
    RB_MainMenuLoop:
    ' BTN_PLUS is the Next Choice button
       IF BTN_PLUS=0 THEN
          PAUSE 200
          bMenuPos=bMenuPos+1
          IF bMenuPos>22 THEN
             bMenuPos=1
          ENDIF
          Goto DisplayMainMenuLoop:
       ENDIF
    ' BTN_PREV is the Exit button
       IF BTN_PREV=0 THEN
          PAUSE 200
          RETURN
       ENDIF
    ' BTN_NEXT is the Goto SubMenu Choice button
       IF BTN_NEXT=0 THEN
          PAUSE 200
          GoSub DisplaySubMenu
          Goto DisplayMainMenuLoop
       ENDIF
    Goto RB_MainMenuLoop:
    '******************************************************
    'ROUTINE DisplaySubMenu
    'This routine handles the display of the sub menu choices
    '******************************************************
    DisplaySubMenu:
       bSubMenuPos=1   'This is the default menu option
    DisplaySubMenuLoop:
       IF bMenuPos=1 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"SQUATS WT ADJ"
       ENDIF
       IF bMenuPos=2 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"SQUATS RP ADJ"
       ENDIF
       IF bMenuPos=3 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PULLDOWN WT ADJ"
       ENDIF
       IF bMenuPos=4 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PULLDOWN RP ADJ"
       ENDIF
       IF bMenuPos=5 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"LAT RAISE WT ADJ"
       ENDIF
       IF bMenuPos=6 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"LAT RAISE RP ADJ"
       ENDIF
       IF bMenuPos=7 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"OVHEAD PRESS WT"
       ENDIF
       IF bMenuPos=8 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"OVHEAD PRESS RP ADJ"
       ENDIF
       IF bMenuPos=9 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PREACHER CURL WT ADJ"
       ENDIF
       IF bMenuPos=10 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PREACHER CURL RP ADJ"
       ENDIF
       IF bMenuPos=11 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PUSHDOWN WT ADJ"
       ENDIF
       IF bMenuPos=12 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PUSHDOWN RP ADJ"
       ENDIF
       IF bMenuPos=13 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PEC DECK WT ADJ"
       ENDIF
       IF bMenuPos=14 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"PEC DECK RP ADJ"
       ENDIF
       IF bMenuPos=15 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"CABLE SHRUG WT ADJ"
       ENDIF
       IF bMenuPos=16 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"CABLE SHRUG RP ADJ"
       ENDIF
       IF bMenuPos=17 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"CALF RAISES WT ADJ"
       ENDIF
       IF bMenuPos=18 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"CALF RAISES RP ADJ"
       ENDIF
       IF bMenuPos=19 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"DBWRIST CURL WT ADJ"
       ENDIF
       IF bMenuPos=20 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"DBWRIST CURL RP ADJ"
       ENDIF
       IF bMenuPos=21 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"DECLINE SITUP WT ADJ"
       ENDIF
       IF bMenuPos=22 AND bSubMenuPos=1 THEN
          LCDOUT $FE,1,"DECLINE SITUP RP ADJ"
       ENDIF
    RB_SUBMenuLoop:
    ' BTN_PLUS is the Next Choice button
       IF BTN_PLUS=0 THEN
          PAUSE 200
          bSubMenuPos=bSubMenuPos+1
          IF bMenuPos=1 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=2 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=3 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=4 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=5 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=6 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=7 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=8 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=9 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=10 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=11 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=12 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=13 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=14 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=15 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=16 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=17 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=18 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=19 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=20 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=21 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          IF bMenuPos=22 AND bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          GoTo DisplaySubMenuLoop
       ENDIF
    ' BTN_PREV is the Exit button
       IF BTN_PREV=0 THEN
          PAUSE 200
          RETURN
       ENDIF
    ' BTN_NEXT is the Goto SubMenu Choice button
       IF BTN_NEXT=0 THEN
          PAUSE 200
          IF bMenuPos=1 AND bSubMenuPos=1 THEN
             GoSub SUB_1_1
          ENDIF
          IF bMenuPos=2 AND bSubMenuPos=1 THEN
             GoSub SUB_2_1
          ENDIF
          IF bMenuPos=3 AND bSubMenuPos=1 THEN
             GoSub SUB_3_1
          ENDIF
          IF bMenuPos=4 AND bSubMenuPos=1 THEN
             GoSub SUB_4_1
          ENDIF
          IF bMenuPos=5 AND bSubMenuPos=1 THEN
             GoSub SUB_5_1
          ENDIF
          IF bMenuPos=6 AND bSubMenuPos=1 THEN
             GoSub SUB_6_1
          ENDIF
          IF bMenuPos=7 AND bSubMenuPos=1 THEN
             GoSub SUB_7_1
          ENDIF
          IF bMenuPos=8 AND bSubMenuPos=1 THEN
             GoSub SUB_8_1
          ENDIF
          IF bMenuPos=9 AND bSubMenuPos=1 THEN
             GoSub SUB_9_1
          ENDIF
          IF bMenuPos=10 AND bSubMenuPos=1 THEN
             GoSub SUB_10_1
          ENDIF
          IF bMenuPos=11 AND bSubMenuPos=1 THEN
             GoSub SUB_11_1
          ENDIF
          IF bMenuPos=12 AND bSubMenuPos=1 THEN
             GoSub SUB_12_1
          ENDIF
          IF bMenuPos=13 AND bSubMenuPos=1 THEN
             GoSub SUB_13_1
          ENDIF
          IF bMenuPos=14 AND bSubMenuPos=1 THEN
             GoSub SUB_14_1
          ENDIF
          IF bMenuPos=15 AND bSubMenuPos=1 THEN
             GoSub SUB_15_1
          ENDIF
          IF bMenuPos=16 AND bSubMenuPos=1 THEN
             GoSub SUB_16_1
          ENDIF
          IF bMenuPos=17 AND bSubMenuPos=1 THEN
             GoSub SUB_17_1
          ENDIF
          IF bMenuPos=18 AND bSubMenuPos=1 THEN
             GoSub SUB_18_1
          ENDIF
          IF bMenuPos=19 AND bSubMenuPos=1 THEN
             GoSub SUB_19_1
          ENDIF
          IF bMenuPos=20 AND bSubMenuPos=1 THEN
             GoSub SUB_20_1
          ENDIF
          IF bMenuPos=21 AND bSubMenuPos=1 THEN
             GoSub SUB_21_1
          ENDIF
          IF bMenuPos=22 AND bSubMenuPos=1 THEN
             GoSub SUB_22_1
          ENDIF
          GoTo DisplaySubMenuLoop
       ENDIF
    GoTo RB_SUBMenuLoop
    '*************** SUB SUB_1_1*********
    SUB_1_1:
    'First read the variables from eprom
       READ 1,SQUATS_WT
    SUB_1_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC SQUATS_WT
    SUB_1_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF SQUATS_WT>=255 THEN
             SQUATS_WT=0
          ELSE
             SQUATS_WT=SQUATS_WT+1
          ENDIF
          GoTo SUB_1_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF SQUATS_WT<=0 THEN
             SQUATS_WT=255
          ELSE
             SQUATS_WT=SQUATS_WT-1
          ENDIF
          GoTo SUB_1_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 1,SQUATS_WT
          RETURN
       ENDIF
    GoTo SUB_1_1MLoop
    RETURN
    '*************** SUB SUB_2_1*********
    SUB_2_1:
    'First read the variables from eprom
       READ 2,SQUATS_RP
    SUB_2_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC SQUATS_RP
    SUB_2_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF SQUATS_RP>=255 THEN
             SQUATS_RP=0
          ELSE
             SQUATS_RP=SQUATS_RP+1
          ENDIF
          GoTo SUB_2_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF SQUATS_RP<=0 THEN
             SQUATS_RP=255
          ELSE
             SQUATS_RP=SQUATS_RP-1
          ENDIF
          GoTo SUB_2_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 2,SQUATS_RP
          RETURN
       ENDIF
    GoTo SUB_2_1MLoop
    RETURN
    '*************** SUB SUB_3_1*********
    SUB_3_1:
    'First read the variables from eprom
       READ 3,PULLDOWN_WT
    SUB_3_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PULLDOWN_WT
    SUB_3_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PULLDOWN_WT>=255 THEN
             PULLDOWN_WT=0
          ELSE
             PULLDOWN_WT=PULLDOWN_WT+1
          ENDIF
          GoTo SUB_3_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PULLDOWN_WT<=0 THEN
             PULLDOWN_WT=255
          ELSE
             PULLDOWN_WT=PULLDOWN_WT-1
          ENDIF
          GoTo SUB_3_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 3,PULLDOWN_WT
          RETURN
       ENDIF
    GoTo SUB_3_1MLoop
    RETURN
    '*************** SUB SUB_4_1*********
    SUB_4_1:
    'First read the variables from eprom
       READ 4,PULLDOWN_RP
    SUB_4_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PULLDOWN_RP
    SUB_4_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PULLDOWN_RP>=255 THEN
             PULLDOWN_RP=0
          ELSE
             PULLDOWN_RP=PULLDOWN_RP+1
          ENDIF
          GoTo SUB_4_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PULLDOWN_RP<=0 THEN
             PULLDOWN_RP=255
          ELSE
             PULLDOWN_RP=PULLDOWN_RP-1
          ENDIF
          GoTo SUB_4_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 4,PULLDOWN_RP
          RETURN
       ENDIF
    GoTo SUB_4_1MLoop
    RETURN
    '*************** SUB SUB_5_1*********
    SUB_5_1:
    'First read the variables from eprom
       READ 5,LATRAISE_WT
    SUB_5_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC LATRAISE_WT
    SUB_5_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF LATRAISE_WT>=255 THEN
             LATRAISE_WT=0
          ELSE
             LATRAISE_WT=LATRAISE_WT+1
          ENDIF
          GoTo SUB_5_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF LATRAISE_WT<=0 THEN
             LATRAISE_WT=255
          ELSE
             LATRAISE_WT=LATRAISE_WT-1
          ENDIF
          GoTo SUB_5_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 5,LATRAISE_WT
          RETURN
       ENDIF
    GoTo SUB_5_1MLoop
    RETURN
    '*************** SUB SUB_6_1*********
    SUB_6_1:
    'First read the variables from eprom
       READ 6,LATRAISE_RP
    SUB_6_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC LATRAISE_RP
    SUB_6_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF LATRAISE_RP>=255 THEN
             LATRAISE_RP=0
          ELSE
             LATRAISE_RP=LATRAISE_RP+1
          ENDIF
          GoTo SUB_6_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF LATRAISE_RP<=0 THEN
             LATRAISE_RP=255
          ELSE
             LATRAISE_RP=LATRAISE_RP-1
          ENDIF
          GoTo SUB_6_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 6,LATRAISE_RP
          RETURN
       ENDIF
    GoTo SUB_6_1MLoop
    RETURN
    '*************** SUB SUB_7_1*********
    SUB_7_1:
    'First read the variables from eprom
       READ 7,OVHEADPRESS_WT
    SUB_7_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC OVHEADPRESS_WT
    SUB_7_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF OVHEADPRESS_WT>=255 THEN
             OVHEADPRESS_WT=0
          ELSE
             OVHEADPRESS_WT=OVHEADPRESS_WT+1
          ENDIF
          GoTo SUB_7_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF OVHEADPRESS_WT<=0 THEN
             OVHEADPRESS_WT=255
          ELSE
             OVHEADPRESS_WT=OVHEADPRESS_WT-1
          ENDIF
          GoTo SUB_7_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 7,OVHEADPRESS_WT
          RETURN
       ENDIF
    GoTo SUB_7_1MLoop
    RETURN
    '*************** SUB SUB_8_1*********
    SUB_8_1:
    'First read the variables from eprom
       READ 8,OVHEADPRESS_RP
    SUB_8_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC OVHEADPRESS_RP
    SUB_8_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF OVHEADPRESS_RP>=255 THEN
             OVHEADPRESS_RP=0
          ELSE
             OVHEADPRESS_RP=OVHEADPRESS_RP+1
          ENDIF
          GoTo SUB_8_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF OVHEADPRESS_RP<=0 THEN
             OVHEADPRESS_RP=255
          ELSE
             OVHEADPRESS_RP=OVHEADPRESS_RP-1
          ENDIF
          GoTo SUB_8_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 8,OVHEADPRESS_RP
          RETURN
       ENDIF
    GoTo SUB_8_1MLoop
    RETURN
    '*************** SUB SUB_9_1*********
    SUB_9_1:
    'First read the variables from eprom
       READ 9,PREACHERCURL_WT
    SUB_9_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PREACHERCURL_WT
    SUB_9_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PREACHERCURL_WT>=255 THEN
             PREACHERCURL_WT=0
          ELSE
             PREACHERCURL_WT=PREACHERCURL_WT+1
          ENDIF
          GoTo SUB_9_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PREACHERCURL_WT<=0 THEN
             PREACHERCURL_WT=255
          ELSE
             PREACHERCURL_WT=PREACHERCURL_WT-1
          ENDIF
          GoTo SUB_9_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 9,PREACHERCURL_WT
          RETURN
       ENDIF
    GoTo SUB_9_1MLoop
    RETURN
    '*************** SUB SUB_10_1*********
    SUB_10_1:
    'First read the variables from eprom
       READ 10,PREACHERCURL_RP
    SUB_10_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PREACHERCURL_RP
    SUB_10_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PREACHERCURL_RP>=255 THEN
             PREACHERCURL_RP=0
          ELSE
             PREACHERCURL_RP=PREACHERCURL_RP+1
          ENDIF
          GoTo SUB_10_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PREACHERCURL_RP<=0 THEN
             PREACHERCURL_RP=255
          ELSE
             PREACHERCURL_RP=PREACHERCURL_RP-1
          ENDIF
          GoTo SUB_10_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 10,PREACHERCURL_RP
          RETURN
       ENDIF
    GoTo SUB_10_1MLoop
    RETURN
    '*************** SUB SUB_11_1*********
    SUB_11_1:
    'First read the variables from eprom
       READ 11,PUSHDOWN_WT
    SUB_11_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PUSHDOWN_WT
    SUB_11_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PUSHDOWN_WT>=255 THEN
             PUSHDOWN_WT=0
          ELSE
             PUSHDOWN_WT=PUSHDOWN_WT+1
          ENDIF
          GoTo SUB_11_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PUSHDOWN_WT<=0 THEN
             PUSHDOWN_WT=255
          ELSE
             PUSHDOWN_WT=PUSHDOWN_WT-1
          ENDIF
          GoTo SUB_11_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 11,PUSHDOWN_WT
          RETURN
       ENDIF
    GoTo SUB_11_1MLoop
    RETURN
    '*************** SUB SUB_12_1*********
    SUB_12_1:
    'First read the variables from eprom
       READ 12,PUSHDOWN_RP
    SUB_12_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PUSHDOWN_RP
    SUB_12_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PUSHDOWN_RP>=255 THEN
             PUSHDOWN_RP=0
          ELSE
             PUSHDOWN_RP=PUSHDOWN_RP+1
          ENDIF
          GoTo SUB_12_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PUSHDOWN_RP<=0 THEN
             PUSHDOWN_RP=255
          ELSE
             PUSHDOWN_RP=PUSHDOWN_RP-1
          ENDIF
          GoTo SUB_12_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 12,PUSHDOWN_RP
          RETURN
       ENDIF
    GoTo SUB_12_1MLoop
    RETURN
    '*************** SUB SUB_13_1*********
    SUB_13_1:
    'First read the variables from eprom
       READ 13,PECDECK_WT
    SUB_13_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PECDECK_WT
    SUB_13_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PECDECK_WT>=255 THEN
             PECDECK_WT=0
          ELSE
             PECDECK_WT=PECDECK_WT+1
          ENDIF
          GoTo SUB_13_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PECDECK_WT<=0 THEN
             PECDECK_WT=255
          ELSE
             PECDECK_WT=PECDECK_WT-1
          ENDIF
          GoTo SUB_13_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 13,PECDECK_WT
          RETURN
       ENDIF
    GoTo SUB_13_1MLoop
    RETURN
    '*************** SUB SUB_14_1*********
    SUB_14_1:
    'First read the variables from eprom
       READ 14,PECDECK_RP
    SUB_14_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC PECDECK_RP
    SUB_14_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF PECDECK_RP>=255 THEN
             PECDECK_RP=0
          ELSE
             PECDECK_RP=PECDECK_RP+1
          ENDIF
          GoTo SUB_14_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF PECDECK_RP<=0 THEN
             PECDECK_RP=255
          ELSE
             PECDECK_RP=PECDECK_RP-1
          ENDIF
          GoTo SUB_14_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 14,PECDECK_RP
          RETURN
       ENDIF
    GoTo SUB_14_1MLoop
    RETURN
    '*************** SUB SUB_15_1*********
    SUB_15_1:
    'First read the variables from eprom
       READ 15,CABLESHRUG_WT
    SUB_15_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC CABLESHRUG_WT
    SUB_15_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF CABLESHRUG_WT>=255 THEN
             CABLESHRUG_WT=0
          ELSE
             CABLESHRUG_WT=CABLESHRUG_WT+1
          ENDIF
          GoTo SUB_15_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF CABLESHRUG_WT<=0 THEN
             CABLESHRUG_WT=255
          ELSE
             CABLESHRUG_WT=CABLESHRUG_WT-1
          ENDIF
          GoTo SUB_15_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 15,CABLESHRUG_WT
          RETURN
       ENDIF
    GoTo SUB_15_1MLoop
    RETURN
    '*************** SUB SUB_16_1*********
    SUB_16_1:
    'First read the variables from eprom
       READ 16,CABLESHRUG_RP
    SUB_16_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC CABLESHRUG_RP
    SUB_16_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF CABLESHRUG_RP>=255 THEN
             CABLESHRUG_RP=0
          ELSE
             CABLESHRUG_RP=CABLESHRUG_RP+1
          ENDIF
          GoTo SUB_16_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF CABLESHRUG_RP<=0 THEN
             CABLESHRUG_RP=255
          ELSE
             CABLESHRUG_RP=CABLESHRUG_RP-1
          ENDIF
          GoTo SUB_16_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 16,CABLESHRUG_RP
          RETURN
       ENDIF
    GoTo SUB_16_1MLoop
    RETURN
    '*************** SUB SUB_17_1*********
    SUB_17_1:
    'First read the variables from eprom
       READ 17,CALFRAISES_WT
    SUB_17_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC CALFRAISES_WT
    SUB_17_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF CALFRAISES_WT>=255 THEN
             CALFRAISES_WT=0
          ELSE
             CALFRAISES_WT=CALFRAISES_WT+1
          ENDIF
          GoTo SUB_17_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF CALFRAISES_WT<=0 THEN
             CALFRAISES_WT=255
          ELSE
             CALFRAISES_WT=CALFRAISES_WT-1
          ENDIF
          GoTo SUB_17_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 17,CALFRAISES_WT
          RETURN
       ENDIF
    GoTo SUB_17_1MLoop
    RETURN
    '*************** SUB SUB_18_1*********
    SUB_18_1:
    'First read the variables from eprom
       READ 18,CALFRAISES_RP
    SUB_18_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC CALFRAISES_RP
    SUB_18_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF CALFRAISES_RP>=255 THEN
             CALFRAISES_RP=0
          ELSE
             CALFRAISES_RP=CALFRAISES_RP+1
          ENDIF
          GoTo SUB_18_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF CALFRAISES_RP<=0 THEN
             CALFRAISES_RP=255
          ELSE
             CALFRAISES_RP=CALFRAISES_RP-1
          ENDIF
          GoTo SUB_18_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 18,CALFRAISES_RP
          RETURN
       ENDIF
    GoTo SUB_18_1MLoop
    RETURN
    '*************** SUB SUB_19_1*********
    SUB_19_1:
    'First read the variables from eprom
       READ 19,DBWRISTCURL_WT
    SUB_19_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC DBWRISTCURL_WT
    SUB_19_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF DBWRISTCURL_WT>=255 THEN
             DBWRISTCURL_WT=0
          ELSE
             DBWRISTCURL_WT=DBWRISTCURL_WT+1
          ENDIF
          GoTo SUB_19_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF DBWRISTCURL_WT<=0 THEN
             DBWRISTCURL_WT=255
          ELSE
             DBWRISTCURL_WT=DBWRISTCURL_WT-1
          ENDIF
          GoTo SUB_19_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 19,DBWRISTCURL_WT
          RETURN
       ENDIF
    GoTo SUB_19_1MLoop
    RETURN
    '*************** SUB SUB_20_1*********
    SUB_20_1:
    'First read the variables from eprom
       READ 20,DBWRISTCURL_RP
    SUB_20_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC DBWRISTCURL_RP
    SUB_20_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF DBWRISTCURL_RP>=255 THEN
             DBWRISTCURL_RP=0
          ELSE
             DBWRISTCURL_RP=DBWRISTCURL_RP+1
          ENDIF
          GoTo SUB_20_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF DBWRISTCURL_RP<=0 THEN
             DBWRISTCURL_RP=255
          ELSE
             DBWRISTCURL_RP=DBWRISTCURL_RP-1
          ENDIF
          GoTo SUB_20_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 20,DBWRISTCURL_RP
          RETURN
       ENDIF
    GoTo SUB_20_1MLoop
    RETURN
    '*************** SUB SUB_21_1*********
    SUB_21_1:
    'First read the variables from eprom
       READ 21,DECLINESITUP_WT
    SUB_21_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC DECLINESITUP_WT
    SUB_21_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF DECLINESITUP_WT>=255 THEN
             DECLINESITUP_WT=0
          ELSE
             DECLINESITUP_WT=DECLINESITUP_WT+1
          ENDIF
          GoTo SUB_21_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF DECLINESITUP_WT<=0 THEN
             DECLINESITUP_WT=255
          ELSE
             DECLINESITUP_WT=DECLINESITUP_WT-1
          ENDIF
          GoTo SUB_21_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 21,DECLINESITUP_WT
          RETURN
       ENDIF
    GoTo SUB_21_1MLoop
    RETURN
    '*************** SUB SUB_22_1*********
    SUB_22_1:
    'First read the variables from eprom
       READ 22,DECLINESITUP_RP
    SUB_22_1MDLoop:
       LCDOUT $FE,192,"                ",$FE,192,DEC DECLINESITUP_RP
    SUB_22_1MLoop:
       IF BTN_PLUS=0 THEN
          PAUSE 100
          IF DECLINESITUP_RP>=255 THEN
             DECLINESITUP_RP=0
          ELSE
             DECLINESITUP_RP=DECLINESITUP_RP+1
          ENDIF
          GoTo SUB_22_1MDLoop
       ENDIF
       IF BTN_MINUS=0 THEN
          PAUSE 100
          IF DECLINESITUP_RP<=0 THEN
             DECLINESITUP_RP=255
          ELSE
             DECLINESITUP_RP=DECLINESITUP_RP-1
          ENDIF
          GoTo SUB_22_1MDLoop
       ENDIF
       IF BTN_PREV=0 THEN
          PAUSE 100
          WRITE 22,DECLINESITUP_RP
          RETURN
       ENDIF
    GoTo SUB_22_1MLoop
    RETURN
    NAG CON WIFE!
    WIFE VAR MOOD

  4. #4
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Instead of a pause after any button press try using WHILE WEND to wait for it to be released.

    Code:
    IF BTN_PLUS=0 THEN
        WHILE BTN_PLUS = 0
        WEND
    Also - you have a ton of RETURN statements after GOTOs' so it never lands on these. I haven't followed your code all the way through, but if it needs to land on the returns, that could be another problem.

    See if the attached works without skipping menu options.
    Attached Files Attached Files
    Last edited by Bruce; - 1st August 2010 at 21:55. Reason: attachment
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  5. #5
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    That's the easy fix but I cringe every time someone suggests waiting for a switch release.

    Since you'll probably be using interrupts eventually to support an RTC or Timer function, I would suggest delegating switch debounce/management to the ISR. Then you're working with fully debounced real-time "new press" flag bits. Your program would need the ISR and a couple subtle changes;

    Code:
    SWNEW       var Byte     '
    SWOLD       var Byte     ' switch state latch
    FLAGS       var Byte     ' switch flag bits
    BTN_NEXT    var FLAGS.4  'Next button
    BTN_PREV    var FLAGS.5  'Previous button
    BTN_PLUS    var FLAGS.6  'Plus button
    BTN_MINUS   var FLAGS.7  'Minus button
    Changes to your main program include testing for a '1' instead of a '0' and clearing the flag bit when you use it.

    Code:
    RB_SUBMenuLoop:
    ' BTN_PLUS is the Next Choice button
       IF BTN_PLUS=1 THEN
          BTN_PLUS=0
          ...
       ENDIF
    ' BTN_PREV is the Exit button
       IF BTN_PREV=1 THEN
          BTN_PREV=0
          RETURN
       ENDIF
    ' BTN_NEXT is the Goto SubMenu Choice button
       IF BTN_NEXT=1 THEN
          BTN_NEXT=0
          ...
       ENDIF
    GoTo RB_SUBMenuLoop
    If you're interested, you might consider trying out a non-interrupt version by adding a sample/debounce subroutine to your program;

    Code:
    '
    '  I need help with PBP commands for a "delay" and for "compliment"
    '
    SUB_SWITCHES                    '
      delay_ms(16)                  ' 16-msec debounce interval  ??? how
      SWNEW = ~PORTB                ' sample active lo switches  ??? how
      SWNEW = SWNEW AND 0xF0        ' on RB7..RB4 pins
      SWNEW = SWNEW XOR SWOLD       ' changes, press or release
      SWOLD = SWOLD XOR SWNEW       ' update switch state latch
      SWNEW = SWNEW AND SWOLD       ' filter out "new release" bits
      FLAGS = FLAGS XOR SWNEW       ' toggle switch flag bits
    RETURN
    Then you would need to call the subroutine at the top of each of your switch test loops (forgive me for shortening your program and for any PBP syntax errors);

    Code:
    RB_SUBMenuLoop:
      GoSub SUB_SWITCHES                    ' sample switches
    ' BTN_PLUS is the Next Choice button
       IF BTN_PLUS=1 THEN
          BTN_PLUS=0
          bSubMenuPos=bSubMenuPos+1
          IF bSubMenuPos>1 THEN
             bSubMenuPos=1
          ENDIF
          GoTo DisplaySubMenuLoop
       ENDIF
    ' BTN_PREV is the Exit button
       IF BTN_PREV=1 THEN
          BTN_PREV=0
          RETURN
       ENDIF
    ' BTN_NEXT is the Goto SubMenu Choice button
       IF BTN_NEXT=1 THEN
          BTN_NEXT=0
          IF bSubMenuPos=1 THEN
             GoSub SUB_ADJ
          ENDIF
          GoTo DisplaySubMenuLoop
       ENDIF
    GoTo RB_SUBMenuLoop
    
    '----------------------------------------------------------------
    '
    '   adjust EEPROM value indexed by 'bMenuPos' variable (1..22)
    '
    '   1 SQUATS_WT          9 PREACHER CURL WT  17 CALF RAISES WT
    '   2 SQUATS_RP         10 PREACHER CURL RP  18 CALF RAISES RP
    '   3 PULLDOWN WT       11 PUSHDOWN WT       19 DBWRIST CURL WT
    '   4 PULLDOWN RP       12 PUSHDOWN RP       20 DBWRIST CURL RP
    '   5 LAT RAISE WT      13 PEC DECK WT       21 DECLINE SITUP WT
    '   6 LAT RAISE RP      14 PEC DECK RP       22 DECLINE SITUP RP
    '   7 OVHEAD PRESS WT   15 CABLE SHRUG WT
    '   8 OVHEAD PRESS RP   16 CABLE SHRUG RP
    '
    SUB_ADJ:                        '
      READ bMenuPos,COUNTER         ' read EEPROM location 1..22
    SUB_ADJ_1MDLoop:                '
      LCDOUT $FE,192,"                "
      LCDOUT $FE,192,DEC COUNTER    '
    SUB_ADJ_1MLoop:                 '
      GoSub SUB_SWITCHES            ' sample switches
      IF BTN_PLUS = 1 THEN          ' if BTN_PLUS press
        BTN_PLUS = 0                ' clear switch flag
        IF COUNTER>=255 THEN        '
          COUNTER=0                 '
        ELSE                        '
          COUNTER=COUNTER+1         '
        ENDIF                       '
        GoTo SUB_ADJ_1MDLoop        ' refresh displayed count
      ENDIF                         '
      IF BTN_MINUS=1 THEN           ' if BTN_MINUS press
        BTN_MINUS=0                 ' clear switch flag
        IF COUNTER<=0 THEN          '
          COUNTER=255               '
        ELSE                        '
          COUNTER=COUNTER-1         '
        ENDIF                       '
        GoTo SUB_ADJ_1MDLoop        ' refresh displayed count
      ENDIF                         '
      IF BTN_PREV=1 THEN            ' if BTN_PREV press
        BTN_PREV=0                  ' clear switch flag
        WRITE bMenuPos,COUNTER      ' update EEPROM
        RETURN                      ' exit
      ENDIF                         '
      GoTo SUB_X_1MLoop             ' loop (for key press)
    RETURN                          '
    Have fun. Cheerful regards, Mike
    Last edited by Mike, K8LH; - 1st August 2010 at 23:16.

  6. #6
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Mike,

    I would suggest delegating switch debounce/management to the ISR
    With his switch inputs on RB7-RB4, how would you go about that without waiting for a switch release, and then clearing the int-on-change flag bit?

    Wouldn't releasing the switch re-trigger the interrupt?
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  7. #7
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Bruce View Post
    Mike,

    With his switch inputs on RB7-RB4, how would you go about that without waiting for a switch release, and then clearing the int-on-change flag bit?

    Wouldn't releasing the switch re-trigger the interrupt?
    Oh no, I wouldn't use IOC interrupts in this application Bruce. Bouncing would be problematic. I would use periodic timer interrupts and poll the switches as in the example in post #15. And since OP is going to include RTC or Stopwatch functionality, periodic timer interrupts make sense.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts