Forum: Mikrocontroller und Digitale Elektronik Taster kurz oder lang


von mr-unbekannt (Gast)


Lesenswert?

hallo!

wie kann ich rausfinden ob ein taster lang oder kurz gedrückt worden 
ist?
Das brauche ich nämlich für die Forward-Funktion des MP3-Players...

vielen Dank,
mr

von fabs (Gast)


Lesenswert?

z.B. mit der universellen Tastenentprellroutine von PeDa.
Sonst musste halt die Zeit von Drücken bis Loslassen auswerten, und wenn 
das Loslassen nicht innerhalb von Zeit X kam ist es ein Repeat.

Gruß
Fabian

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Zähler bei gedrückter Taste mitlaufen lassen, wenn Taste losgelassen 
wird, Zählerwert vergleichen, wenn größer xx, dann war´s ein langer 
Druck.Dann Zähler löschen für nächste Abfrage. Oder Zählwert gleich 
während gedrückter Taste auf >xx vergleichen, dann Schaltvorgang 
auslösen. Bei Loslassen der Taste wieder Zähler löschen.

von mr-unbekannt (Gast)


Lesenswert?

sorry, ich hatte wieder mal einen denkfehler...!

Folgende Problemstellung:
Der MP3-Player soll das nächste Lied spielen wenn man den Taster normal 
drückt. Die Forward (Vorspulen) Funktion soll natürlich nur bei 
gedrückthalten des Tasters on sein.

beim folgendem code wird bei einem druch auf den taster nur vorgespult, 
weis jemand warum?
1
// this function processes the button messages
2
void process_buttons(void)
3
{ 
4
5
  // find out which buttons were pressed
6
  u08 tmp = inp(BUTTON_PIN);
7
  // invert as 0 -> button pressed
8
  tmp = ~tmp;
9
  // make sure the button was not pressed before
10
  u08 cleaned_val = tmp ^ last_button;
11
  cleaned_val = cleaned_val & tmp;
12
  // store current val as last val
13
  last_button = tmp;
14
    
15
  //return if HOLD is active
16
  if (!(BUTTON_PIN&(1<<BTN_HOLD))) return; 
17
18
  // button 2 is pressed -> fast forward
19
  if (last_button&(1<<BTN_SONG_UP))   
20
    {
21
  FAST_FORWARD_ON;
22
  return;
23
  }
24
  FAST_FORWARD_OFF;
25
  
26
  // button 1 was pressed -> song back
27
  if(cleaned_val&(1<<BTN_SONG_DOWN)) play_prev();
28
  // button 2 was pressed -> song next
29
  if(cleaned_val&(1<<BTN_SONG_UP))   play_next();
30
  // button 3 was pressed -> vol -
31
  if(cleaned_val&(1<<BTN_VOL_DOWN))  vol_down();
32
  // button 4 was pressed -> vol +
33
  if(cleaned_val&(1<<BTN_VOL_UP))    vol_up();
34
  // button 5 was pressed -> play/stop
35
  if(cleaned_val&(1<<BTN_PLAY))
36
    {   
37
    if (bPause) bPause=false;
38
    else bPause=true;
39
  
40
    if (bPause) PLAY_LED_ON;
41
    else PLAY_LED_OFF;
42
  
43
    if(ps.state == IDLE) ps.state = PLAYING_MMC_INIT;  // go to start of file
44
    }
45
  
46
}

danke

von Peter D. (peda)


Lesenswert?


von mr-unbekannt (Gast)


Lesenswert?

danke!

jetzt habe ich deine funktionen verwendet, funktioniert super, ausser 
dass wenn ich den taster gedrückt halte wird auch noch das nächste lied 
gespielt.

kann man das irgendwie verhindern?

folgender code:
1
  // button 2 is pressed -> fast forward
2
  if (get_key_rpt(1<<BTN_SONG_UP)) FAST_FORWARD_ON;
3
  else FAST_FORWARD_OFF;
4
  
5
  // button 2 was pressed -> song next
6
  if (get_key_press(1<<BTN_SONG_UP))  play_next();

von Peter D. (peda)


Lesenswert?

Zur lang/kurz Erkennung mußt Du get_key_short und get_key_long nehmen.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.