Forum: Mikrocontroller und Digitale Elektronik Texteingabe Matrixtastatur Atmega8


von Tekasiko (Gast)


Lesenswert?

Hallo Liebe Microcontroller Freunde,

Ich ha´be mich gefragt ob es möglich ist über eine 4x3 Matrixtastatur 
(angeschlossen wie in der Bascom Hilfe) möglich ist einen Text 
einzugeben und diesen am LCD anzeigen zu lassen und sogar im Atmega8 
eeprom zu speichern.

Also wenn ich 1 x die 1 drücke, Ausgabe = A
2 x 1 = B
3 x1 = C
4 x 1 = 1

Wie eben bei einer Handytastatur wenn eine SMS geschrieben wird.

Dann soll dieser "Buchstabe oder Zahl" im display stehen bleiben und der 
cursor soll dann eine stelle weiter rücken.

Falls ich mich vertippt habe, sollte mit * die vorherige stelle gelöscht 
werden und erneut eingegeben werden können.

Wenn dann # gedrückt wird, soll die Eingabe beendet werden und der 
Vollständige Text im EEprom abgespeichert werden.

Ich bin noch nicht so fit im programmieren, und würde mich über eure 
Hilfe freuen dies zu realisieren.

Das momentane Programm ist in Bascom geschrieben.

Vielen dank schon mal

von Karl H. (kbuchegg)


Lesenswert?

Tekasiko schrieb:

> Ich ha´be mich gefragt ob es möglich ist über eine 4x3 Matrixtastatur
> (angeschlossen wie in der Bascom Hilfe) möglich ist einen Text
> einzugeben und diesen am LCD anzeigen zu lassen und sogar im Atmega8
> eeprom zu speichern.

Warum soll das nicht möglich sein?

Du kannst alle Schritte beschreiben und hast eine klare Vorstellung 
davon, wie das alles funktionieren soll. Jetzt musst du es nur noch 
etwas detaillieren und es programmieren.

> Ich bin noch nicht so fit im programmieren, und würde mich über eure
> Hilfe freuen dies zu realisieren.

Letztendes ist der Kern des Programms einen Buchstaben an einen String 
anzuhängen und diesen eventuell noch mal zu verändern bzw. zu löschen. 
Dazu noch eine Timeout Steuerung damit man auch mehrmals hintereinander 
denselben Buchstaben eingeben kann.

Vorschlag: vergiss erst mal die Buchstaben und werte die Tastendrücke 
als Ziffern und sieh zu, dass du den String aus den Einzeltastendrücken 
aufbauen kannst. Wenn du das hast, kannst du dich um die Erweiterung 
kümmern, wie man mehrfache Tastendrücke innerhalb eines bestimmten 
Zeitraumes als Buchstaben wertet. Vom Einfachen zum Schwierigeren 
vorgehen.

von Peter D. (peda)


Lesenswert?

Tekasiko schrieb:
> Wie eben bei einer Handytastatur wenn eine SMS geschrieben wird.

Ja, das geht.

Dein Problem ist aber, Du mußt irgendwann mal aufhören, immer nur nach 
passenden Legosteinchen zu suchen und die dann aneinander pappen.
Du mußt einfach mal anfangen, selber zu programmieren.

Sobald Programme umfangreicher werden, findet man keine passenden 
Legosteinchen mehr, die ja mal jemand zuvor programmiert haben muß.

Nimm Dir Papier und Bleistift und zeichen den Ablaufplan auf, wie Deiner 
Meinung nach so ein Programm funktionieren könnte.
Dann teste es auf dem Papier durch und wenn das klappt, kannst Du 
anfangen, den Plan in Deine konkrete Programmiersprache umzusetzen.


Peter

von Kai B. (tekasiko)


Lesenswert?

Hallo Karl Heinz,

ich bin inzwischen so weit das ich einen Zahlencode bis zu 25 Stellen 
schreiben und auch speichern kann, das funktioniert auch sehr gut.

Also den String aufbauen bekomm ich demnach hin,

Was ich mir vorgestellt habe ist:

Eine variable immer hochzählen lassen
erster tastendruck = A = Variable ist 1
Beim zweiten Variable überprüfen dann wenn variable 1 = Taste B = 
Variable 2

usw.

Dann ab dem 4. mal drücken wird die variable wieder 0

Das zu programmiern bekomme ich hin.

Sieht dann leider so aus bei mir:

Versuche ein C zu schreiben:

Im Lcd steht dann

ABC und leider nicht nur C da die anderen Zeichen nicht überschrieben 
werden sondern einfach weiter gemacht wird.

Dann geht mir noch ab das nach einer gewissen Zeit (zb. 2 s)in der 
nichts gedrückt wurde die stelle um eins weiter rückt und wie gesagt die 
löschfunktion der vorhergehenden stelle

von Peter D. (peda)


Lesenswert?

Kai Burghart schrieb:
> ABC und leider nicht nur C da die anderen Zeichen nicht überschrieben
> werden sondern einfach weiter gemacht wird.

Dann hast Du was falsch gemacht.
Der MC kann nicht hellsehen, ob der 2.Druck nun der nächste Buchstabe 
oder die nächste Stelle sein soll.
Ein Programm braucht immer eine Regel, wie es was unterscheiden kann.
Beim Handy erfolgt das z.B. über die Druckdauer.


Peter

von Kai B. (tekasiko)


Lesenswert?

Hallo Peter,

vielen dank für deine Meinung, ich bin wirklich auch dankbar für kritik.

Da hast du einerseits schon recht, aber andererseits programmiere ich 
erst seit ca. 3-4 monaten und das hobbymässig also nicht wirklich viele 
Stunden.

Aus allen legoteilchen die ich inzwischen gesammelt habe, habe ich einen 
"für mich" wirklich ansehbaren Quellcode gebastelt, denn ich nicht 
einfach nur zusammengebaut habe, sonder wirklich selber programmiert 
habe.

Wenn ich ein Problem habe versuche ich es erst immer selber zu lösen, 
wenn ich dann hier im forum nachfrage und ich hilfreiche Antworten 
bekomme, dann arbeite ich mich immer soweit rein das ich ganz genau 
verstehe was und warum das so ist.

Das heist alles was ich bisher Programmiert habe, verstehe ich bins ins 
kleinste detail, aber das es ist wirklich sehr umfangreich und ich kann 
wirklich nicht alles in 3-4 monaten lernen, aber alles was ich bisher 
gelernt habe, habe ich diesem Forum zu verdanken.

Ich kupfere wirklich nicht alles ab, versuche eigentlich nur zu 
verstehen wie etwas funktioniert und baue es mir dann selber auf.

von MWS (Gast)


Lesenswert?


von Kai B. (tekasiko)


Lesenswert?

Hallo MWS,

warum nicht?

Ich will jetzt wirklich nicht blöd rüberkommen oder habe irgendetwas 
blödes mit absicht gemacht.

Was ist daran schlimm wenn ich es in einem anderen Forum auch einstelle?

Dachte eben das Das ja speziel ein Bascom Forum ist und das hier ein 
Allgemeines Forum.

Mir ist wirklich nicht bewusst das ich gerade was falsches gemacht habe.

Aber bitte kläre mich auf

von MWS (Gast)


Lesenswert?

Kai Burghart schrieb:
> Aber bitte kläre mich auf

Es ist grundsätzlich nicht gerne gesehen, wenn gleichzeitig identische 
Posts in verschiedenen Foren gemacht werden.

Du beschäftigst quasi parallel eine Gruppe von Leuten mit Deinem 
Problem, ohne daß die im Regelfall voneinander wissen. Das ist unfair 
gegenüber den potentiellen Helfern.
Das System eines Forums beruht auf gemeinsamen Interesse und 
Hilfsbereitschaft, letzteres nutzt Du mit Crossposts aus.

Mir geht's so, daß ich nicht das beliebige Helferlein sein möchte und 
wenn ich ein Crosspost entdecke Anderen den Vortritt lasse und mich ab 
sofort zurückhalte.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
> Kai Burghart schrieb:
>> Aber bitte kläre mich auf
>
> Es ist grundsätzlich nicht gerne gesehen, wenn gleichzeitig identische
> Posts in verschiedenen Foren gemacht werden.
>
> Du beschäftigst quasi parallel eine Gruppe von Leuten mit Deinem
> Problem, ohne daß die im Regelfall voneinander wissen. Das ist unfair
> gegenüber den potentiellen Helfern.

Es ist nicht nur unfair. Es ist in vielen Fällen auch oft 
kontraproduktiv.
Denn meistens gibt es mehrere Möglichkeiten wie man ein Problem lösen 
kann. Und da die eine Gruppe nichts von der anderen Gruppe weiß, ist es 
gar nicht so ungewöhnlich, wenn in verschiedenen Foren auch verschiedene 
Lösungsstrategien vorgeschlagen und durchexerziert werden. Die 
Verwirrung beim Lernenden ist damit aber vorprogrammiert, weil sich die 
Aussagen für ihn scheinbar widersprechen.

von Weingut P. (weinbauer)


Lesenswert?

aaalso ... zunächst mal wie hast Du denn die Tastenabfrage gemacht ...

einfach in der Mainloop ein if pinx.y = 0 then oder etwas feinsinniger
evtl. in einem Timer?

Timer ist übrigens das Stichwort.

Du kannst hin gehen und einfach in einem Timer den Wert Deiner
Tastatur zwischenspeichern, beim nächsten Timer interrupt
prüfst Du, ob der gespeciherte Wert gleich dem aktuellen ist,
ist er das so zählst Du eine Variable hoch.
Ab einem bestimmten Wert der Variable kannst Du die Taste als gedrückt
ansehen, da hast Du gleich Deine Entprellung, bei Überlauf der Variable
ist die Taste dauerhaft gedrückt, also ein langer Tastendruck.

Zur Abfrage ob die gleiche taste mehrmals gedrückt wurde machst Du das 
ähnlich. Tastenwert zwischenspeichern, bei nächstem Tastendruck 
vergleichen ob identisch, wenn ja, dann Buchstabe 1 hoch zählen, wenn 
nicht, dann nächster Buchstabe ...

Hilfreich in dem Zusammenhang in Bascom sind die Overlayvariablen,
einfach nen String anlegen, n Bytearray overlay und dann den Pointer 
hoch laufen lassen

von Kai B. (tekasiko)


Lesenswert?

Erstmal an alle,

es tut mir leid wenn ich durch das Chrossposten jemanden verärgert habe, 
das wollte ich nicht.

So wie ihr mir das beschrieben habt, leuchtet das natürlich ein und ich 
wollte hier niemanden unfair behandeln oder verärgern.

Ich bitte daher um Entschuldigung bei allen, und werde dies auch nicht 
mehr so machen.

Vielen dank auch für die Hinweise.

@ Weinbauer

Die Tastenabfrage ist momentan mit der Bascom Routine GeTKBD realisiert.

Eingabe = Getkbd()
If Eingabe <> 16 Then

Select Case Eingabe

Case 0
Code = Code + "3"
Case 1
Code = Code + "2"
Case 2
Code = Code + "1"

usw.

Das hört sich alles sehr kompliziert an, ich werde es mal so testen und 
versuchen wie du es mir erklärt hast. Da ich momentan noch nicht 
wirklich alles verstehe. Aber ich werd da schon dahinter kommen :-)

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.