Forum: Mikrocontroller und Digitale Elektronik Passwort per Tastendruck um ein Zeichen minimieren,Getkbg


von AT32_Bascom_Programmierer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe µC- Freunde

ich bin gerade dabei eine Password abfrage zu programmieren, habe 
bereits im Forum gesucht jedoch nichts brauchbares gefunden...


Ich möchte ein Passwort abfragen und dann auswerten (funktioniert 
bereits)

Nun zu meinem Problem:

ich arbeite mit Bascom und möchte mit dem befehl Getkbg arbeiten der es 
ermöglicht ein 3x4 Zahlenfeld auszulesen...

jedoch schaffe ich es nicht eine Ziffer aus meinem Eingegebenen String 
per Tastendruck zu löschen.

Bitte daher um Hilfe...

Mein Programm befindet sich im Anhang, habe es reichlich Kommentiert

von Karl H. (kbuchegg)


Lesenswert?

Da du hier
1
      Keycode = Keycode + 1                                 'könnte aich incr KEYCODE sein

den KeyCode um 1 erhöhst, sollte dann nicht eigentlich, laut deiner 
Tabelle, für # mit 15 verglichen werden und nicht mit 14?
1
      If Keycode = 15 Then                                  'wird die taste "#" gedrückt werden  soll eine Ziffer im Passwort gelöscht werden

Du hättest auch schreiben können

     if Taste = "#" Then

aber da wäre dann das Potential sich selbst auszutricksen nicht so groß 
:-)

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

hallo... danke Karl Heinz... jetzt suche ich schon seit mehreren Tagen 
nach diesem Problem und dann ist es so einfach... muss jetzt noch 
hinzufügen das dass letzte Zeichen auch am Bildschirm gelöscht wird 
Funktioniert auch noch nicht richtig...

schon mal vielen Dank für die Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Kriegst du sicher hin.

Der Tip den ich dir gebe.
Wenn du Text überschreibst, dann denk daran: Die Teile die du nicht 
überschreibst, sind nach wie vor sichtbar.

Hast du also einen 3 buchstabigen String auf der Anzeige und 
überschreibst du ihn mit einem 2-buchstabigen, dann bleibt die 3. Stelle 
vom alten String sichtbar.

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

ach ja... ich habe da noch eine Frage... die jetzt nicht direkt etwas 
hiermit zu tun hat...

Woran liegt das, dass beim übertragen eines Programmes (via Bascom) 
oftmals der Fehler " Differene at 00100" kommt (Zahl ändert immer...

das ist ziemlich störend da ich sehr oft übertragen muss um mein 
Programm zu testen...

Anfangs hatte ich dieses Problem nie...

ein freund meinte das es am Quarz liegen könnte stimmt das?

(P.S.: habe jetzt (if Taste = "#" then) ins Programm geschrieben da das 
mit den Keycode's sonst nur noch mehr durcheinander wird... wenn ich 
auch noch eine Bestätigung's Taste mache

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

zum überschreiben der alten Anzeige hab ichs jetzt so gemacht


>>>

Locate 2 , 1
'der gesamte String wird angezeigt "zur Kontrolle"
           Lcd Eingabe ; "    "
            Waitms 100
' durch den Getadc Befehl müssen 100ms gewachtet werden

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

mir fällt gerade noch was auf... ich bekomme das erste Zeichen meiner 
Eingabe nicht gelöscht sieht jemand woran es liegen kann???

von Karl H. (kbuchegg)


Lesenswert?

AT32_Bascom_Programmierer schrieb:
> mir fällt gerade noch was auf... ich bekomme das erste Zeichen meiner
> Eingabe nicht gelöscht sieht jemand woran es liegen kann???

Ohne jetzt in die BASCOM Hilfe geschaut zuhaben
1
         Anzahl = Len(eingabe)                              '!!!!!!!so sollte es meiner Meinung gehn... geht aber nicht...!!!!!!!!!!!!!!!!!!!!!!!!!
2
         Anzahl = Anzahl - 1                                '!!!!!!!!es wird immer ein "#" zeichen anstelle der geschriebennen Zahl geschrieben!!!!
3
         Eingabe = Left(eingabe , Anzahl)                   '!!!!!!!wie kann ih das lösen?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Left wird wohl verweigern, wenn du einen Substring der Länge 0 haben 
willst. (Btw. was passiert dann eigentlich wenn du dann nochmal # 
drückst :-)

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

in der Bascom Hilfe finde ich nichts , das darauf deutet das es keinen 
Substring der länge 0 geben darf...

jedoch passiert nichts wenn ich weiter auf "#" drücke

ich versuche dieses hier jetzt noch...

jedoch dauert es immer sehr lange bis ich mal was übertragen bekomme, da 
ich immer diese Fehlmeldung am ende des Vorgangs erhalte

von Karl H. (kbuchegg)


Lesenswert?

AT32_Bascom_Programmierer schrieb:
> in der Bascom Hilfe finde ich nichts , das darauf deutet das es keinen
> Substring der länge 0 geben darf...

Na ja.
Die Anforderung 'Gib mir die 0 linken Zeichen eines Strings' klingt ein 
wenig albern. Man muss kein Hellseher sein um das Ergebnis vorhersagen 
zu können. Kann gut sein, dass der Hersteller entschieden hat, dass 
diese Operation nicht geht.

Aber: Im Zweifel - schreib dir ein Testprogramm und probiers aus.

> jedoch dauert es immer sehr lange bis ich mal was übertragen bekomme, da
> ich immer diese Fehlmeldung am ende des Vorgangs erhalte

Dazu kann ich wenig sagen.
Verkabelung checken. Kabel auf Defekte absuchen. An den Steckern 
wackeln, etc.

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

ich hab jetzt noch ne andere Idee, die evt schlauer ist als die 
vorherige

If Taste = "#" Then                                   ' = Keycode14+1 = 
Keycode 15
         Anzahl = Len(eingabe)
         Anzahl = Anzahl - 1
         Eingabe = Left(eingabe , Anzahl)

         If Anzahl = 1 Then                                 'überprüfen 
!$!$!$!$!$!!$!$!$!$!$!$!$!$!$!
         Eingabe = ""
         End If
      Else                                                  'sollte eine 
andere Taste gedrücht werden:

         If Len(eingabe) < 4 Then                           'muss die 
gesamt länge unter 4 zeichen sein
            Eingabe = Eingabe + Chr(taste)                  'dann wird 
eine Ziffer dran gehangen
         End If
      End If

    End If

hier sage ich einfach das wenn anzahl den Wert 1 erreicht , und nochmal 
auf löschen gedrückt wird der String "eingabe gelöscht 
wird...(>>>Eingabe = "")

von Karl H. (kbuchegg)


Lesenswert?

AT32_Bascom_Programmierer schrieb:

> hier sage ich einfach das wenn anzahl den Wert 1 erreicht , und nochmal
> auf löschen gedrückt wird der String "eingabe gelöscht

Anzahl ist aber zu diesem Zeitpunkt nicht mehr 1 :-)
Du hast es vorher schon um 1 vermindert.

Und wenn geht such nach einer Lösung, die auch dann funktioniert, wenn 
der String schon leer ist und in dem Fall Anzahl dann in Ruhe lässt :-) 
Sonst musst du nach 8 mal # drücken mindestens 3 mal eine andere taste 
drücken, damit dein System bei 'Kein Tastendruck vorhanden' angelangt 
ist. Frei nach: Wenn aus einem Raum mit 5 Leuten 9 hinausgehen, wieviele 
müssen wieder reingehen, damit keiner drinnen ist?

(PS: das ELSE bei IF THEN ENDIF hast du aber schon entdeckt?)

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Anzahl ist aber zu diesem Zeitpunkt nicht mehr 1 :-)
> Du hast es vorher schon um 1 vermindert.


hmm... stimmt auch wieder... dann versuch ich's mal mit if anzahl = 0 
then...

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> PS: das ELSe bei IF THEN ENDIF hast du aber schon entdeckt?)


wie darf ich das verstehen?

von Karl H. (kbuchegg)


Lesenswert?

Überleg mal, was das hier logikmässig machen würde

         Anzahl = Len(eingabe)

         IF Anzahl < 2 THEN                      ' 1 oder 0
           Anzahl = 0
           Eingabe = ""
         ELSE
           Anzahl = Anzahl - 1
           Eingabe = Left(eingabe , Anzahl)
         End If

von AT32_Bascom_Programmierer (Gast)


Angehängte Dateien:

Lesenswert?

Karl heinz Buchegger schrieb:
> Anzahl = Len(eingabe)
>
>          IF Anzahl < 2 THEN                      ' 1 oder 0
>            Anzahl = 0
>            Eingabe = ""
>          ELSE
>            Anzahl = Anzahl - 1
>            Eingabe = Left(eingabe , Anzahl)
>          End If


ja das würde nichts bringen...oder?
 ich habe das auch nicht so in meinem programm...

siehe Anhang

von Karl H. (kbuchegg)


Lesenswert?

AT32_Bascom_Programmierer schrieb:
> Karl heinz Buchegger schrieb:
>> Anzahl = Len(eingabe)
>>
>>          IF Anzahl < 2 THEN                      ' 1 oder 0
>>            Anzahl = 0
>>            Eingabe = ""
>>          ELSE
>>            Anzahl = Anzahl - 1
>>            Eingabe = Left(eingabe , Anzahl)
>>          End If
>
>
> ja das würde nichts bringen...oder?

Warum sollte das nichts bringen?

Gehs doch mal durch

Angenommen dein String in eingabe sei "2"

Anzahl = Len(eingabe)

Anzahl bekommt dann den Wert 1

IF Anzahl < 2 THEN

Ist das der Fall? Da Anzahl 1 ist und 1 kleiner als 2 ist, ist das der 
Fall. Also gehts weiter mit
  ANzahl = 0
  Eingabe = ""

Das besagt: Es wurde keine Taste gedrückt und der Eingabestring ist 
leer. Genau das was man erwarten würde, wenn bei "2" ein Zeichen 
gelöscht wird.

So, jetzt sei in Eingabe der leere String. Wieder drückst du #, was 
passiert?

Anzahl bekommt daher den Wert 0, weil Len vom leeren String nun mal 0 
ist.

IF Anzahl < 2 THEN

Ist das der Fall? Ja, das ist der Fall. 0 ist kleiner als 2. Also gehts 
wie weiter?

  ANzahl = 0
  Eingabe = ""

Hmm. Nichts passiert. Anzahl bleibt 0 und Eingabe wird wieder auf den 
leeren String gesetzt. Genau so wie es sein soll.

von AT32_Bascom_Programmierer (Gast)


Lesenswert?

Hallo vielen lieben dank für diesen sehr ausführlichen Tipp...

sorry das ich erst so spät schreibe...

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.