Forum: Mikrocontroller und Digitale Elektronik Zahleneingabe mittels LCD und Taster: Vorgehensweise, Code?


von Jan Mayer (Gast)


Lesenswert?

Hallo,

beschäftige mich erst seit kurzem mit uControllern und habe die ersten 
LED/Taster Übungen hinter mir und habe jetzt ein 2*16 LCD an einem 
ATMega88 Controller. Das ganze betreibe ich mit der Library von Peter 
Fleury, funktioniert prima. Würde nun gerne Zahlen per RS232 an den PC 
senden, klappt mit statischen auch super (wobei ich noch nie über 5 
Stellige Zahlen (mit atoi) gekommen bin).
Mein Wunsch ist nun, über das LCD und ein paar Taster (z.B. rechts/links 
für Stellenauswahl und hoch/runter zum ändern der Ziffer an der Stelle) 
eine Zahl über das LCD einzugeben und diese zu versenden. Wie macht man 
das am Besten? Man kann das LCD ja auch wieder auslesen, sprich ich 
zeige eine Zahl auf dem LCD an, mache was mit den Tasten und lese die 
Zahl wieder aus. Oder eher Zahl anzeigen, nur Tastendrücke auswerten und 
im uC verarbeiten und nach Druck auf eine Enter/OK-Taste das LCd 
aktualisieren?

1) Wie geht man da prinzipiell vor?
2) Hat das evtl. schon mal jemand gemacht und hätte einen Codeschnipsel?
3) Wie kann ich "beliebig" große Zahlen in einzelne Chars, bzw. einen 
String wandeln?

Gruß,

Jan

von Ralf (Gast)


Lesenswert?

mit itoa und utoa kannst Du nach char wandeln.

Ich würde mir von hand ein char mit beliebiger Länge machen char 
zahl[i]. Bei Druck auf die Enter-Taste wird i incrementiert. Dann die 
Ziffer aus dem Array
mit +/-  incrementieren bzw  decrementieren.

Den Cursor würde ich mit lcd_gotoxy(i, y) an die entsprechende Ziffer 
stellen und blinken lassen (lcd_command(LCD_DISP_ON_BLINK)). Und dann 
halt nur an dieser Stelle nach Auswertung der Taste die Ziffer updaten 
(lcd_putc (zahl[i])).

Zumindest so in groben Zügen.

Gruss Ralf

von Falk B. (falk)


Lesenswert?


von Jan Mayer (Gast)


Lesenswert?

Hallo,

Ralf: danke für die Tipps, werde es wohl so machen
Falk: das wäre der "umgekehrte Weg", möchte ja ncihts ausgeben, sondern 
vom LCD einlesen. Hat mich aber auch nicht dümmer gemacht ;=)

Gruß,

Jans

von Johannes M. (johnny-m)


Lesenswert?

Wieso willst Du vom LCD etwas einlesen, was Du eh vorher da 
reingeschrieben hast? Hast Du Angst, das LCD könnte eigenmächtig etwas 
an dem Text verändern?

von Christoph (Gast)


Lesenswert?

@Jan,

normalerweise geht das so:

- im uC wird der anzuzeigende Wert im Programm in einer Variable 
gespeichert und auf dem Display angezeigt
- beim Drücken der [+] bzw. [-] Taste erhöht bzw. erniedrigt der uC den 
Wert der Variablen und aktualisiert die Anzeige auf dem Display

Für Fließkommazahlen und die Änderung einzelner Stellen mußt Du dir im 
uC die Stelle merken, die Du ändern möchtest (auch in einer Variablen). 
Bei [+]/[-] ist dann etwas an Berechnung notwendig, damit sich nur die 
eine Stelle ändert bzw. bei einem Überlauf/Unterlauf die vorherigen 
Stellen auch angepaßt werden (4,594 -> 2'te Nachkommastelle [+] -> 
4,604). Nach jedem Tastendruck auf [+] bzw. [-] wird die Änderung 
duchgeführt und anschließend das Display aktualisiert. Zur Information, 
welche Stelle geändert wird, kannst Du nach jeder Display-Aktualisierung 
den aktivierten Cursor auf die jeweilige Stelle setzen.

Gruss
Christoph

von Falk B. (falk)


Lesenswert?

@ Christoph (Gast)

>Für Fließkommazahlen und die Änderung einzelner Stellen mußt Du dir im
>uC die Stelle merken, die Du ändern möchtest (auch in einer Variablen).

Fliesskommazahlen braucht man nur sehr selten. Besser sind meist 
Festkommazahlen.
Festkommaartihmetik

MFg
Falk

von Jan Mayer (Gast)


Lesenswert?

Hallo,

noch mal zum Verständnis: mein LCD ist ein 2*16, also 2 Zeilen a 16 
Stellen. Was ich bis jetzt schaffe, sind Zahlen die in 2^16 (also atoi) 
passen einfach in der letzten Stelle zu erhöhen/erniedrigen. Hätte aber 
gerne so etwas wie:

123456789012345

im uController. aber selbst mit einem long bin ich da aufgeschmissen. 
Und das auch nur mit Hilfe einer +/- Taste immer um 1 zu erhöhen ist 
wohl auch nicht so toll. Also suchte ich nach etwas was ich Stellenweise 
erhöhen kann.

Hätte dann auf dem Display halt die Zahlenkolonne zu Anfang ausgegeben 
und würde die an den einzelnen Stellen verändern (Ziffer an 
Cursorposition auslesen, je nach Tastendruck um eins erhöhen oder 
erniedrigen) und zum Schluss die Zeile ganz einlesen und irgendwie in 
eine Zahl umwandeln. Werde da mal eine Nacht drüber schlafen und mir 
Gedanken machen.

Grüße,

Jan

von wechsi (Gast)


Lesenswert?

So viel ich weiss haben die meisten uC einen eigenen Speicher, du musst 
nicht auslesen, was im LCD steht, denn das hast du bereits im Speicher 
deines uC.
Wenn du nun mit dem Cursor auf dem Display auf der Hunderterstelle bist 
und die Taste + gedrückt wird, dann addierst du im uC 100 zu deiner 
Variable und lässt die Zahl wieder auf dem uC anzeigen.

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.