Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler LCD Ausgabe mittels Tastendruck erhöhen


von J. S. (harry_2)


Lesenswert?

Hallo,

da mir die letzten Denkanstöße hier sehr geholfen haben
möchte ich es natürlich hier auch weiter versuchen.
Wie gesagt ich versuche im Selbststudium die Ausgabe auf LCD´s
in Assembler auf die Reihe zu bekommen.
Zur Problemstellung:

ich möchte auf dem LCD einen Sollwert schreiben
den ich dann verändern möchte.
Den Sollwert schreiben ist nicht das Problem, das
funktioniert. Wenn ich den jetzt ändern will muß
ich, nach meinen Vorstellungen, mit dem Curser auf
die entsprechende LCD Adresse und dort hin schreiben
was ich möchte? mit Text geht das ja, aber einfach mit
Tastendruck habe ich hier ein Wissensloch, mangels Erfahrung.
Also z.B. an einer Position (welche 2rangig) in Zeile 2
des Display steht "123" nun möchte ich die dritte Stelle,
also die "3" mit drei Tastendrücken auf "6" stellen,
genau da stoße ich an meine Grenzen, wahrscheinlich
ist das Problem überhaupt keins aber mit wenig Erfahrung
halt schon, vor allem deshalb weil der gespeicherte Wert,
der ja für was gut sein soll, auch entsprechend verändert
werden muss.
Es wäre toll wenn mir hier jemand eine verständliche Erklärung
oder einen kleinen Codeschnippsel geben könnte.

Gruß
Harry

von Karl H. (kbuchegg)


Lesenswert?

J. S. schrieb:

> funktioniert. Wenn ich den jetzt ändern will muß
> ich, nach meinen Vorstellungen, mit dem Curser auf
> die entsprechende LCD Adresse und dort hin schreiben
> was ich möchte? mit Text geht das ja, aber einfach mit
> Tastendruck habe ich hier ein Wissensloch, mangels Erfahrung.
> Also z.B. an einer Position (welche 2rangig) in Zeile 2
> des Display steht "123" nun möchte ich die dritte Stelle,
> also die "3" mit drei Tastendrücken auf "6" stellen,

Du konzentrierst du dich zusehr auf das LCD. Das LCD zeigt nur einen 
Wert an, den du im Programm in einem Register oder einem Speicher hast. 
Dort manipulierst du den Wert und zeigst dann den veränderten Wert 
erneut an.

D.h. deine 3 Tastendrucke verändern nicht am LCD die Anzeige "3" zu "6" 
sondern sie erhöhen im Register den Wert von 123 auf 126 und die 
nachfolgende Ausgabe sorgt dann dafür, dass am LCD 126 steht, mit deiner 
zur "6" geänderten "3"

von Peter D. (peda)


Lesenswert?

Du legst eine Variable im SRAM an.
Bei jeden Tastendruck wird die Variable geändert und komplett neu auf 
das LCD ausgegeben.


Peter

von J. S. (harry_2)


Lesenswert?

Hallo Karl Heinz,

das war auch mein erster Gedanke, was mich allerdings
zum zweifeln gebracht hat ist, wie geht das dann wenn
ich anstelle der einer Stelle "3" die hunderter Stelle
die "1" um drei erhöhen will, da funktioniert das so
nicht mehr.

von Karl H. (kbuchegg)


Lesenswert?

J. S. schrieb:
> Hallo Karl Heinz,
>
> das war auch mein erster Gedanke, was mich allerdings
> zum zweifeln gebracht hat ist, wie geht das dann wenn
> ich anstelle der einer Stelle "3" die hunderter Stelle
> die "1" um drei erhöhen will, da funktioniert das so
> nicht mehr.

Das Prinzip ist nach wie vor dasselbe.
Du musst nur Buch führen, wo dein Cursor gerade ist. Ist er über der 
Hunderterstelle dann zählst du eben nicht 1 dazu oder weg, sondern 100 
dazu oder weg. Geht dein Benutzer mit der Taste nach rechts von den 
Hundertern zu den Zehnern über (das registrierst du in einem anderen 
Register), dann eben nur noch Zehn dazu oder weg.

D.h. in dem Fall hast du 2 Register.
Das eine, "Stelle", sagt dir, welche Stelle dein Benutzer gerade 
verändert (zb 1 -> Hunderter verändern, 2 -> Zehner verändern, 3 -> 
Einer verändern) und im anderen Register hast du deine Zahl selber.

Drückt dein Benutzer die Taste "nach Rechts", dann erhöhst du Stelle um 
1. Drückt er "nach Links", dann verinngerst du Stelle um 1. Natürlich 
nur wenn das geht, d.h. wenn Stelle danach nicht 0 oder 4 werden würde.

Und beim eigentlichen Erhöhen fragst du dann nach einem Tastendruck das 
Register Stelle ab: ist es 1 dann zählst du 100 dazu/weg. Ist es 2 dann 
10 dazu oder weg oder aber wenn es 3 ist, dann eben nur 1 dazu oder weg.

Denk dir was aus! Solange du dir vorstellen kannst was funktioniert, 
kann man das auch programmieren. Und manchmal müssen eben mehrere 
Mechanismen zusammenarbeiten, damit ein bestimmter Effekt entsteht.
Was ich damit sagen will: Das beschrieben ist nicht die einzige 
Möglichkeit wie man eine mehrstellige Eingabe machen kann. Ich machs zb 
gerne so, wie du es von deiner PC-Tatstur kennst: drückst du die Taste 
einmal schreibst du nur 1 Buchstaben. Drückst du sie aber und hältst sie 
gedrückt, dann werden immer weiter Buchstaben geschrieben. Dasselbe kann 
man auch bei Zahleneingaben machen. Einmal drücken - einmal erhöhen. 
Drücken und gedrückt halten - 'Dauerfeuer' beim Erhöhen.

von J. S. (harry_2)


Lesenswert?

Hallo Karl Heinz,

in fast die selbe Richtung ging meine Vorstellung auch
aber ich dachte, eventuell gibt es da was einfacheres.
Ich werde es dann einfach mal so machen.
Vielleicht erreicht uns ja hier doch noch ein Vorschlag
der uns beide überrascht.
Vielen Dank noch.

von Dr G. Reed (Gast)


Lesenswert?

Schau mal hier

http://www.loetstelle.net/projekte/belichtungs_timer/belichtungs_timer.php


In dieser Software wird genau das gemacht, der Cursor wird an geeigneter 
Stelle positionoert und Variablen im Speicher werden erhöht/Erniedrigt.

Zwar eine etwas umfangreichere Anwendung und das ganze nocht über Taster 
sondern Drehencoder, aber im Prinzip genau so ein Code wie Du sucht.

von Harry_2 (Gast)


Lesenswert?

Hallo,

ist auch eine Alternative, wirklich weniger Aufwand
ist das allerdings auch nicht. Aber darum alleine geht es
ja auch nicht, wie gesagt bei mir mangelt es noch an der
Erfahrung und da ist man auch froh alleine mehrere
Lösungsmöglichkeiten zu sehen für ein und das selbe Problem.

von Peter D. (peda)


Lesenswert?

Ist zwar schon ewig her, daß ich noch in Assembler programmiert habe.
Hier mal ein Beispiel:

Beitrag "DCF77-Uhr mit ATTINY12"

Gerade in Assembler ist es wichtig, sich erstmal ein Konzept zu machen 
und nicht wild drauflos zu programmieren.
Die einzelnen Aufgaben werden dann einzeln für sich implementiert und 
dann im Main nur noch includiert und aufgerufen.

Wichtig ist auch, den Code zu kommentieren. Sonst weiß man später selber 
nicht mehr, was man sich dabei gedacht hatte.

Durch das Funktionskonzept mit Parametern und Returnwerten, ist es in C 
einfacher, modular und übersichtlich zu programmieren.

In Assembler muß man sich erstmal Regeln aufstellen (welche Register 
enthalten Parameter, welche kann die aufgerufene Funtion zerstören, 
welche Register sind für Interrupts reserviert usw.).
Ohne diese Regeln artet Assembler in Push/Pop-Orgien aus, viele Register 
werden umsonst gesichert.


Peter

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.