my experience with button press usage is to have to wait for button release, can either stay in present routine and wait before switching OR moving to other routine and wait for release before looking for new press and going back.
my experience with button press usage is to have to wait for button release, can either stay in present routine and wait before switching OR moving to other routine and wait for release before looking for new press and going back.
Here is the practical code I'm using, but it sometimes behaves strangely.
Say, button was pressed, action was made once, user still holds button, so no advance in code. But when user releases the button, sometimes it acts as button was pressed once again. Any ideas how to fix it?
Code:MENULOOP: 'MAIN CONFIG SCREEN IF UPBT=0 THEN MENUITEM=MENUITEM+1 IF MENUITEM>4 THEN MENUITEM=1 GOSUB CENTRAL pause 200 'debounce ENDIF WHILE UPBT=0:WEND IF DNBT=0 THEN MENUITEM=MENUITEM-1 IF MENUITEM<1 THEN MENUITEM=4 GOSUB CENTRAL pause 200 'debounce ENDIF WHILE DNBT=0:WEND if menuitem=1 and rbut=0 then pause 5 while rbut=0: wend goto clockconfig endif GOTO MENULOOP
There does not seem to be any debounce on button release. TryCode:IF UPBT=0 THEN MENUITEM = MENUITEM+1 IF MENUITEM > 4 THEN MENUITEM = 1 GOSUB CENTRAL ' PAUSE 20 ' May be needed if subroutine CENTRAL executes very fast. WHILE UPBT = 0 : WEND PAUSE 20 'debounce ENDIF
read switch a few times to be sure and debounce......
IF UPBT=0 THEN
PAUSE 20 ' or 40 or 50
IF UPBT=0 THEN 'go ahead........
MENUITEM = MENUITEM+1
do same for release check .... if upbt=1 then.....
Last edited by amgen; - 21st April 2023 at 15:26.
For couple of buttons this code works fine, but when I increase number of button handling operations, some weird things occur - the further from beginning is the button handling routine, more rarely it responds to user.
The code below has 8 "blocks" of button handling.
first 3 work fine, 4th one works only maybe on 10 or 15th press. 5th and further - do not work at all.
And this is not issue of particular code - if I move say "5th block" to 1st place of this code, then it works fine.
PIC18F45K80 @64mhz.
Code:IF UPBT=0 THEN MENUITEM=MENUITEM+1 IF MENUITEM>6 THEN MENUITEM=1 pause 200 ENDIF WHILE UPBT=0:WEND IF DNBT=0 THEN MENUITEM=MENUITEM-1 IF MENUITEM<1 THEN MENUITEM=6 pause 200 ENDIF WHILE DNBT=0:WEND IF LBUT=0 AND MENUITEM=2 THEN RICXVI=RICXVI+1 IF RICXVI>31 THEN RICXVI=1 pause 200 GOSUB SETTIME ENDIF WHILE LBUT=0:WEND IF RBUT=0 AND MENUITEM=2 THEN RICXVI=RICXVI-1 IF RICXVI<1 THEN RICXVI=31 pause 200 GOSUB SETTIME ENDIF WHILE RBUT=0:WEND IF LBUT=0 AND MENUITEM=1 THEN TVE=TVE+1 IF TVE>13 THEN TVE=1 pause 200 GOSUB SETTIME ENDIF WHILE LBUT=0:WEND IF RBUT=0 AND MENUITEM=1 THEN TVE=TVE-1 IF TVE<1 THEN TVE=13 pause 200 GOSUB SETTIME ENDIF WHILE RBUT=0:WEND IF LBUT=0 AND MENUITEM=3 THEN DGE=DGE+1 IF DGE>7 THEN DGE=1 pause 200 GOSUB SETTIME ENDIF WHILE LBUT=0:WEND IF RBUT=0 AND MENUITEM=3 THEN DGE=DGE-1 IF DGE<1 THEN DGE=7 pause 200 GOSUB SETTIME ENDIF WHILE RBUT=0:WEND
I tried to reduce PAUSE 200 to 20 or even 2 - no change.
what about something like this instead?
it could be simplified even more, but...Code:IF UPBT=0 THEN MENUITEM=MENUITEM+1 IF MENUITEM>6 THEN MENUITEM=1 PAUSE 20 WHILE UPBT=0:WEND PAUSE 20 ENDIF IF DNBT=0 THEN MENUITEM=MENUITEM-1 IF MENUITEM<1 THEN MENUITEM=6 PAUSE 20 WHILE DNBT=0:WEND PAUSE 20 ENDIF IF LBUT=0 THEN IF MENUITEM=1 THEN TVE=TVE+1 IF TVE>13 THEN TVE=1 GOSUB SETTIME ENDIF IF MENUITEM=2 THEN RICXVI=RICXVI+1 IF RICXVI>31 THEN RICXVI=1 GOSUB SETTIME ENDIF IF MENUITEM=3 THEN DGE=DGE+1 IF DGE>7 THEN DGE=1 GOSUB SETTIME ENDIF PAUSE 20 WHILE LBUT=0:WEND PAUSE 20 ENDIF IF RBUT=0 THEN IF MENUITEM=1 THEN TVE=TVE-1 IF TVE<1 THEN TVE=13 GOSUB SETTIME ENDIF IF MENUITEM=2 THEN RICXVI=RICXVI-1 IF RICXVI<1 THEN RICXVI=31 GOSUB SETTIME ENDIF IF MENUITEM=3 THEN DGE=DGE-1 IF DGE<1 THEN DGE=7 GOSUB SETTIME ENDIF PAUSE 20 WHILE RBUT=0:WEND PAUSE 20 ENDIF
Bookmarks