 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
inc1ude
Anmeldungsdatum: 21.03.2005 Beiträge: 3
|
Verfasst am: 21.03.2005, 18:08 Titel: Input Problem |
|
|
Hi,
bin hier neu und hab direkt mal ne frage
Wir Programmieren in der Schule eine Steuerung für 8 LED's die am LPT Port hängen.
Mein Programm soll 4 vorprogrammierte LED abspiel Reihenfolgen
abspielen können und durch die tasten 1-8 soll jede LED einzeln zum aufleuchten gebracht werden.
auserdem soll das Programm jederzeit durch ESC abgebrochen werden können.
Das Menü und das erste Programm und die einzel Tasten sind schon relativ fertig.
Jetzt hatte ich noch die Idee das man die anzahl der wiederholungen für jedes Programm selbst bestimmen kann.
Nur leider ist es jetzt so, das egal welche taste ich drücke kommt: "wieviele wiederholungen?"
Freue mich über Hilfe und auch über anregungen wie ich den code leichter bzw.
sauberer schreiben kann! (die for .... next wartezeiten sind unsauber, aber ich brauche hier wohl keine genauen zeiten )
der code:
Code: | 10 'WIDTH 80, 50
20 COLOR 0, 7
30 CLS
'------- Kopfzeile --------
40 COLOR 15, 4
50 PRINT " Interface Control Panel V0.01 (c) Manuel Hoell, 2005 ":
'------- Begrussungstext & Auswahl ------
60 COLOR 0, 7
70 PRINT " | | =========================================== |"
80 PRINT " | | Welcome to Interface Control Panel V0.01 |"
90 PRINT " | | =========================================== |"
100 PRINT " | | |"
110 PRINT " | | Bitte waehle zwischen den Punkten a-d |"
115 PRINT " | | |"
120 PRINT " | | Alternativ kannst du mit den tasten |"
130 PRINT " | | 1-8 einzelne LED's blinken lassen |"
150 PRINT " | | __________________________________ |"
160 PRINT " | | | | | |"
170 PRINT " | | | <a> knight rider | | |"
180 PRINT " | | | | | |"
190 PRINT " | | | <b> lauflicht | | |"
200 PRINT " | | | | | |"
210 PRINT " | | | <c> blablaasdffsa | | |"
220 PRINT " | | | | | |"
230 PRINT " | | | <d> blablaasfdsdaf | | |"
240 PRINT " | | | | | |"
250 PRINT " | | ___ |________________________________| | ___ |"
260 PRINT " | | |_| | |_________________________________\| |_| | |"
270 PRINT " | | |__\| |__\| |"
280 PRINT " \|______________________________________________________________|"
290 COLOR 15, 4
295 IF INKEY$ = CHR$(27) THEN GOTO 10000
SLEEP
'------------- Punkt <a> ------------
310 IF INKEY$ = CHR$(97) THEN GOTO 311
311 INPUT "Wieviele Wiederholungen?", w1%
312 p1% = 0
316 OUT 888, 255
317 FOR t = 1 TO 2500: NEXT t
318 OUT 888, 255
319 FOR t = 1 TO 2500: NEXT t
320 OUT 888, 1
325 FOR t = 1 TO 2500: NEXT t
330 OUT 888, 2
335 FOR t = 1 TO 2500: NEXT t
340 OUT 888, 4
345 FOR t = 1 TO 2500: NEXT t
350 OUT 888, 8
355 FOR t = 1 TO 2500: NEXT t
360 OUT 888, 16
365 FOR t = 1 TO 2500: NEXT t
370 OUT 888, 32
375 FOR t = 1 TO 2500: NEXT t
380 OUT 888, 64
385 FOR t = 1 TO 2500: NEXT t
390 OUT 888, 128
395 FOR t = 1 TO 2500: NEXT t
400 OUT 888, 64
405 FOR t = 1 TO 2500: NEXT t
410 OUT 888, 32
415 FOR t = 1 TO 2500: NEXT t
420 OUT 888, 16
425 FOR t = 1 TO 2500: NEXT t
430 OUT 888, 8
435 FOR t = 1 TO 2500: NEXT t
440 OUT 888, 4
445 FOR t = 1 TO 2500: NEXT t
450 OUT 888, 2
455 FOR t = 1 TO 2500: NEXT t
460 OUT 888, 1
465 FOR t = 1 TO 2500: NEXT t
470 p1% = p1% + 1
475 IF INKEY$ = CHR$(27) THEN GOTO 10000
480 IF p1% < w1% THEN GOTO 316 ELSE GOTO 10
'------------- einzelne LED's ---------------
490 IF INKEY$ = CHR$(49) THEN GOTO 500
500 OUT 888, 1
505 FOR t = 1 TO 2500: NEXT t
506 GOTO 10
510 IF INKEY$ = CHR$(50) THEN GOTO 520
520 OUT 888, 2
525 FOR t = 1 TO 2500: NEXT t
526 GOTO 10
530 IF INKEY$ = CHR$(51) THEN GOTO 535
535 OUT 888, 2
540 FOR t = 1 TO 2500: NEXT t
541 GOTO 10
550 IF INKEY$ = CHR$(52) THEN GOTO 555
555 OUT 888, 4
560 FOR t = 1 TO 2500: NEXT t
542 GOTO 10
570 IF INKEY$ = CHR$(53) THEN GOTO 575
575 OUT 888, 8
580 FOR t = 1 TO 2500: NEXT t
581 GOTO 10
590 IF INKEY$ = CHR$(54) THEN GOTO 595
595 OUT 888, 16
600 FOR t = 1 TO 2500: NEXT t
601 GOTO 10
610 IF INKEY$ = CHR$(55) THEN GOTO 620
620 OUT 888, 32
625 FOR t = 1 TO 2500: NEXT t
626 GOTO 10
630 IF INKEY$ = CHR$(56) THEN GOTO 635
635 OUT 888, 64
640 FOR t = 1 TO 2500: NEXT t
641 GOTO 10
645 IF INKEY$ = CHR$(57) THEN GOTO 650
650 OUT 888, 128
655 FOR t = 1 TO 2500: NEXT t
656 GOTO 10
10000 END | [/code] |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 21.03.2005, 19:01 Titel: Re: Input Problem |
|
|
inc1ude hat Folgendes geschrieben: |
auserdem soll das Programm jederzeit durch ESC abgebrochen werden können. |
Das könnte man mit
Code: | IF INKEY$ = CHR$(27) THEN END |
lösen.
inc1ude hat Folgendes geschrieben: | Jetzt hatte ich noch die Idee das man die anzahl der wiederholungen für jedes Programm selbst bestimmen kann. |
Daran muss ich mich noch arbeiten ....  _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 20:01 Titel: |
|
|
An deiner Stelle würde ich das Programm mal optimieren,
schon mal von einer FOR-NEXT-Schleife gehört???
jb |
|
Nach oben |
|
 |
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 21.03.2005, 21:57 Titel: |
|
|
@jb: Anscheinend...guck dir die ganzen Verzögerungsschleifen an  _________________
 |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 22:19 Titel: |
|
|
@ICC: Schon klar[ ], aber das
Code: |
320 OUT 888, 1
325 FOR t = 1 TO 2500: NEXT t
330 OUT 888, 2
335 FOR t = 1 TO 2500: NEXT t
340 OUT 888, 4
345 FOR t = 1 TO 2500: NEXT t
350 OUT 888, 8
355 FOR t = 1 TO 2500: NEXT t
360 OUT 888, 16
365 FOR t = 1 TO 2500: NEXT t
370 OUT 888, 32
375 FOR t = 1 TO 2500: NEXT t
380 OUT 888, 64
|
könnte man zu
Code: |
FOR i = 1 TO 6
OUT 888, 2 ^ i
FOR t = 1 TO 2500: NEXT t
PRINT 2 ^ i
NEXT i
|
verkürzen.
Also zwei ineinander verschachtelte FOR-NEXT-Schleifen
jb |
|
Nach oben |
|
 |
inc1ude
Anmeldungsdatum: 21.03.2005 Beiträge: 3
|
Verfasst am: 21.03.2005, 22:24 Titel: |
|
|
vielen dank, super tip!
habt ihr auch noch eine lösung für mein input problem? |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 22:31 Titel: |
|
|
Ich seh jetzt nicht das konkrete Problem, aber du solltest lieber nicht
mit INKEY$ arbeiten, da INKEY$ nicht auf einen Tastendruck wartet.
Verwende anstatt INKEY$ lieber INPUT$(1).
Ach ja: Die Zeilennummern kannst du weglassen, du arbeitest ja mit QBasic, oder?
jb |
|
Nach oben |
|
 |
inc1ude
Anmeldungsdatum: 21.03.2005 Beiträge: 3
|
Verfasst am: 21.03.2005, 22:49 Titel: |
|
|
ja ich arbeite mit qbasic, unser lehrer hat gesagt wir sollen das so machen,
und ich finde es auch recht praktisch da man mit dem goto befehl dann zu der jeweiligen zeile springen kann, oder gibts da noch eine besssere lösung?
wird INPUT$(1) genauso verwendet wie INKEY$ ?
also IF INPUT$(1) = CHR$(97) THEN
das konkrete problem ist einfach das egal was ich mache das Programm einen Wert für die Variable w1% will, also abfragt wieviel mal es einen bestimmten LED leuchvorganng wiederholen soll
Code: |
311 INPUT "Wieviele Wiederholungen?", w1%
480 IF p1% < w1% THEN GOTO 316 ELSE GOTO 10 |
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 22:58 Titel: |
|
|
inc1ude hat Folgendes geschrieben: |
wird INPUT$(1) genauso verwendet wie INKEY$ ?
|
Eigentlich schon. Nur dass man anstatt
besser
Code: |
A$ = INPUT$(1)
IF A$ = ...
|
Zu den Zeilennummern und GOTO:
Das erzeugt einen sehr unsauberen und sehr unübersichtlichen Code.
Mit Schleifen lässt sich das für gewöhnlich umgehen...
jb |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 22.03.2005, 00:58 Titel: |
|
|
Hallo!
Ich glaube, das Problem besteht darin, das du dem Rechner zwar sagst, was er tun soll wenn eine entsprechende Taste gedrückt wurde, aber nicht was passieren soll, wenn sie nicht gedrückt wurde. Wie z.B. hier:
Code: | 490 IF INKEY$ = CHR$(49) THEN GOTO 500
500 OUT 888, 1 |
Also wenn die "1" gedrückt wurde springt er zu 500, wenn nicht dann aber auch weil es ja sowieso die nächste Zeile ist. Sowas machst du im ganzen Programm.
Bei einer Abfrage mit INKEY$ wird der Tastaturpuffer geleert und das nächste INKEY$ bringt nichts mehr. Man muss die Eingabe also in einer Variablen zwischenspeichern. Du könntest es dann vielleicht so machen:
Code: | 480 taste$ = INKEY$
490 IF taste$ = CHR$(49) THEN GOTO 800
500 IF taste$ = CHR$(50) THEN GOTO 850
510 IF taste$ = CHR$(51) THEN GOTO 900
520 IF taste$ = CHR$(52) THEN GOTO 950
530 IF taste$ = CHR$(27) THEN END
...
790 GOTO 480
800 OUT 888, 1
810 GOTO 480
850 OUT 888, 2
860 GOTO 480
900 OUT 888, 4
910 GOTO 480
... |
Aber wo werden LEDs eigentlich wieder ausgeschaltet?
Wie wär's denn damit:
Code: | 10 taste$ = INKEY$
20 IF taste$ = "" THEN GOTO 10
30 IF taste$ = CHR$(27) THEN END ' Abbruch mit ESC
40 lampe = ASC (taste$) - 48
50 IF lampe < 1 OR lampe > 8 THEN GOTO 10
60 IF status(lampe) = 0 THEN byte = byte + 2 ^ (lampe - 1)
70 IF status(lampe) = 1 THEN byte = byte - 2 ^ (lampe - 1)
80 IF status(lampe) = 0 THEN status(lampe) = 1 ELSE status(lampe) = 0
90 OUT 888, byte
100 GOTO 10 |
Ist jetzt nicht getestet, aber so sollten sich alle acht LEDs einzeln mit den entsprechenden Zahlentasten von 1-8 mit einem Tastendruck ein- und beim nächsten wieder ausschalten lassen.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|