Hi, Konrad
I used such a "multi role" button simply by using the BUTTON Command in a loop...
the example is here,
Code:
'*****************************************************************************
'Servotest 84 D'après Elektor
'*****************************************************************************
'
'16F84A à 20 Mhz
' Barregraph 7 leds sur PortB
' résolution variable 2-6-20 µS
' Mémorisation réglage " moyen"
@ __config _HS_OSC & _WDT_ON & _CP_ON
DEFINE OSC 20 '
DEFINE BUTTON_PAUSE 18
Signal var PortA.0
Writeok var PortA.1 ' Indicateur mode : 0 = manuel 1 = Cycle
Up var PortA.2 ' Rotation à Droite
Down var PortA.3 ' Rotation à gauche
Prog var PortA.4 ' Bouton mémorisation
pos var Word
posn var Word
compte var Byte
dir var Byte
delay var Byte
N var Byte
PORTA = 0
PORTB = %00001000 'PortB.7 libre, Led centrale allumée.
TRISA = %00011100
TRISB = %00000000
READ 1, Posn.HighByte
READ 2, Posn.LowByte
IF posn = $FFFF OR posn < 750 OR posn > 2250 THEN posn = 1500
pos = posn
'*****************************************************************************
mainloop:
Writeok = 0
delay = 0
button Up, 0, 255, 0, delay, 1, upbutton
button Down, 0, 255, 0, delay, 1, dwnbutton
button Prog, 0, 255, 0, delay, 1, Program
Gosub Outsig
PAUSE 18
compte = 0
Goto Mainloop
'*****************************************************************************
upbutton:
IF Down = 0 THEN
Pos = posn
Goto Jump1
Endif
Compte = compte + 1
Select Case Compte
Case 255
Compte = Compte-1
N = 10
Case is > 50
N = 10
Case is > 15
N = 3
Case else
N = 1
End Select
pos = pos + 2*N
if pos > 2250 then pos = 2250
Jump1:
For delay = 1 to 9
Gosub Outsig
Pause 18
Next delay
Gosub Outsig
Goto mainloop
'*****************************************************************************
dwnbutton:
IF Up = 0 THEN
Pos = posn
Goto Jump2
Endif
Compte = compte + 1
Select Case Compte
Case 255
Compte = Compte - 1
N = 10
Case is > 50
N = 10
Case is > 10
N = 3
Case else
N = 1
End Select
pos = pos - 2*N
if pos < 750 then pos = 750
Jump2:
For delay = 1 to 9
Gosub Outsig
Pause 18
Next delay
Gosub Outsig
Goto mainloop
'*****************************************************************************
Program:
Compte = 0
Test:
IF Prog = 0 Then
compte = compte + 1
Gosub Outsig
Pause 18
IF Compte > 250 THEN Compte = 250: Goto Test
IF Compte >= 80 THEN WriteoK = Compte .4 : Goto Test
IF Compte >= 20 THEN WriteoK = Compte .2
Goto Test 'Attendre relâchement bouton ...
Endif
IF Compte > 250 OR Compte < 20 Then mainloop
IF Compte >= 80 Then
pos = 1500
Goto Save 'remise au Neutre
Endif
'Position "moyenne"
Save:
WRITE 1, Pos.HighByte ' 10ms
WRITE 2, Pos.LowByte ' 10ms
Posn = pos
Gosub Outsig
For delay = 1 to 25
WriteoK = 1
Gosub Outsig
Pause 18
Next Delay
Goto mainloop
'*****************************************************************************
Outsig:
Select Case pos 'Allumage Bargraph
Case 750
PortB = %01100001
Case is <= posn - 635
PortB = %01000000
Case is <= posn - 519
PortB = %01100000
Case is <= posn - 404
PortB = %00100000
Case is <= posn - 288
PortB = %00110000
Case is <= Posn - 173
PortB = %00010000
Case is <= Posn - 58
PortB = %00011000
Case is <= Posn
PortB = %01001000
'*****************************************************************************
Case posn ' Position centrée
PortB = %01001001
'*****************************************************************************
Case is <= posn + 58
PortB = %00001001
Case is <= posn + 173
PortB = %00001100
Case is <= posn + 288
PortB = %00000100
Case is <= posn + 404
PortB = %00000110
Case is <= posn + 519
PortB = %00000010
Case is <= posn + 635
PortB = %00000011
Case is < posn + 750
PortB = %00000001
Case 2250
PortB = %01000011
END Select
Low Signal
Pulsout Signal, pos /2 'Envoi Signal servo
RETURN
END
The "important" sections have been Highlighted ...
Here, the more the pressing UP and DOWN buttons speed up the 'count speed' ... pressing "prog" permits to choose beetween options ...
Note WriteOk is a led that shows the delay increasing value when pushing the button ...
Alain
Bookmarks