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