Re: String ausgeben Kategorie: Programmierung (von Udo - 28.03.2005 15:16) | ||
Als Antwort auf Re: String ausgeben von Olaf - 27.03.2005 23:54 | ||
| ||
> > key = Taste(); > > if key > -1 and key ... usw. > > > > Gru� > > > > Udo > > Hallo Udo, > > danke für Deinen Tipp. > Die Funktion Taste sieht so aus: > > > function Taste () returns int > { > int u1, u2, key; > while (ports.adc(7)>900); > u1= ports.adc(7); > u2= ports.adc(7); > if (math.abs(u1-u2))< 4 > { > if u1<901 key=3;//3 > if u1<825 key=6;//6 > if u1<755 key=9;//9 > if u1<690 key=12;//# > if u1<620 key=2;//2 > if u1<550 key=5;//5 > if u1<480 key=8;//8 > if u1<410 key=0;//0 > if u1<335 key=1;//1 > if u1<270 key=4;//4 > if u1<190 key=7;//7 > if u1<110 key=11;//* > if u1>1000 key=-1; > } > return key; > } > > > Das habe ich schon probiert, was Du mir geschrieben hast. Leider funktioniert es auch nicht !? > > Wie würdest Du denn solch ein Problem angehen? > > Danke! > > MfG > > Olaf Hallo, Du machst mehrere prinzipielle Fehler. Zunächst darfst Du in Deinem Hauptprogramm die Funktion Taste nur 1 mal aufrufen und dann nur noch die zugewiesene Variable benutzen wie oben beschrieben. Andernfalls machst Du 4 Tastatur- abfragen in Folge und alle 4 müssten ein identisches Ergebnis liefern, damit der Programmablauf Sinn macht. Die Funktion Taste hat auch so ihre Probleme. Das erste ist, die Funktion wird nie mehr verlassen, wenn keine Taste gedrückt wird (kann aber auch Absicht sein). Danach fragst Du 2 mal den AD- Wandler ab und vergleichst die beiden Werte. Aber was, wenn die Differenz eben nicht kleiner als 4 ist? Dann wird key zurückgeliefert ohne dass jemals ein Wert zugewiesen wurde. Da diese Abfrage sehr schnell geht, ist die Wahrscheinlichkeit, dass dies geschieht sogra recht hoch. Du musst sicher- stellen, dass der AD-Wandler solange abgefragt wird, bis die Differenz kleiner 4 ist und erst danach darfst Du den Wert zuordnen. Weiterhin kann es Sinn machen, die Funktion Taste() erst dann wieder zu verlassen, wenn die Taste losgelassen wurde. So können auf einfache Weise fehlerhafte Doppeleingaben vermieden werden. Bei normaler Betätigung einer Taste ist diese Verzögerung kaum spürbar. Hier ein Beispiel aus der mitgelieferten CD. Da sich das Beispiel auf die Station bezieht, sind die AD-Werte nicht mit Deinen vergleichbar, aber ich denke das Funktionsprinzip ist erkennbar. int keycode; muss global definiert sein. /*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*/ /*HHHHHHHHHH KEYBOARD DECODER AND UTILITIES HHHHHHHHHH*/ /*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*/ /* NOMINAL ADC READINGS: */ /* 1=264 2=329 3=394 4=459 5=524 6=590 7=655 8=788 9=721 */ /* 0=855 CLEAR=923 ENTER=992 F1=67 F2=133 F3=196 */ /******************************************************************/ /***********************************/ /* Get single Key # */ /***********************************/ function getkey()returns int { int adcval; int oldval; if ports.adc(7)< 32 {keycode=255;return keycode;} // let the adc value get stable oldval=0; while math.abs(oldval-ports.adc(7))>10 {oldval=ports.adc(7);sleep 20;} // decode the pressed key adcval=ports.adc(7); if adcval>32 {keycode=10;}//F1 - 67 if adcval>98 {keycode=11;}//F2 - 134 if adcval>161 {keycode=12;}//F3 - 200 if adcval>229 {keycode=1;} // - 264 if adcval>294 {keycode=2;} // - 330 if adcval>359 {keycode=3;} // - 395 if adcval>424 {keycode=4;} // - 461 if adcval>489 {keycode=5;} // - 526 if adcval>555 {keycode=6;} // - 592 if adcval>620 {keycode=7;} // - 657 if adcval>686 {keycode=9;} // - 727 if adcval>753 {keycode=8;} // - 790 if adcval>820 {keycode=0;} // - 858 if adcval>888 {keycode=13;}//CLEAR - 926 if adcval>957 {keycode=14;}//ENTER - 996 return keycode; } //---------------------------------- //---- WAIT FOR KEY RELEASE-------- //---------------------------------- function wait_for_release() { while keycode != 255 {keycode=getkey();} } | ||
Antwort schreiben Antworten: |