Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Input Problem

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
inc1ude



Anmeldungsdatum: 21.03.2005
Beiträge: 3

BeitragVerfasst am: 21.03.2005, 18:08    Titel: Input Problem Antworten mit Zitat

Hi,

bin hier neu und hab direkt mal ne frage lächeln

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 lächeln )

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
Benutzer-Profile anzeigen Private Nachricht senden
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 21.03.2005, 19:01    Titel: Re: Input Problem Antworten mit Zitat

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 .... zwinkern
_________________
www.piratenpartei.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 20:01    Titel: Antworten mit Zitat

An deiner Stelle würde ich das Programm mal optimieren,
schon mal von einer FOR-NEXT-Schleife gehört??? zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 21.03.2005, 21:57    Titel: Antworten mit Zitat

@jb: Anscheinend...guck dir die ganzen Verzögerungsschleifen an mit den Augen rollen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 22:19    Titel: Antworten mit Zitat

@ICC: Schon klar[ mit den Augen rollen ], 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 geschockt

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
inc1ude



Anmeldungsdatum: 21.03.2005
Beiträge: 3

BeitragVerfasst am: 21.03.2005, 22:24    Titel: Antworten mit Zitat

vielen dank, super tip! lächeln

habt ihr auch noch eine lösung für mein input problem?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 22:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
inc1ude



Anmeldungsdatum: 21.03.2005
Beiträge: 3

BeitragVerfasst am: 21.03.2005, 22:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 22:58    Titel: Antworten mit Zitat

inc1ude hat Folgendes geschrieben:

wird INPUT$(1) genauso verwendet wie INKEY$ ?

Eigentlich schon. Nur dass man anstatt
Code:

IF INPUT$(1)

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 22.03.2005, 00:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz