Forum: Mikrocontroller und Digitale Elektronik AVR LCD Display Menü (Pfeil)


von Tony (Gast)


Lesenswert?

Hallo Leute!!
Ich hab ein Problem mit dem programmieren eines atmega8 LCD Displays 
4x16.
Ich schaffe es Texte per Tasten druck erscheinen zu lassen^^. Ich habe 4 
Taster und möchte ein Menü erstellen. 2 Tasten sollen RAUF und RUNTER 
fahren. Auf der ersten Spalte hab ich Platz gelassen weil ich dort einen 
Pfeil haben will welches mir zeigt, welches Programm ich wähle. Könnt 
ihr mir bitte helfen den Pfeil so zu programmieren das es beim 
RUNTER_taste nach unten geht und anders rum. Bitte!!
Danke im Voraus ;)

von Achim M. (minifloat)


Lesenswert?

Speichere die momentane Pfeilposition doch in einer (modul-)globalen 
Variable. Pseudocode:
1
uint8_t pfeil;
2
#define PFEIL_MAX 3
3
4
void init(void)
5
{
6
   pfeil = 0;
7
   pfeil_setze(pfeil);
8
   //...andere init-sachen
9
}
10
11
void taste_runter(void)
12
{
13
   pfeil_lösche(pfeil);
14
   pfeil++;
15
   pfeil = (pfeil > PFEIL_MAX) ? 0 : pfeil;
16
   pfeil_setze(pfeil);
17
   // tue dieses
18
}
19
20
void taste_hoch(void)
21
{
22
   pfeil_lösche(pfeil);
23
   pfeil--;
24
   pfeil = (pfeil = 255) ? PFEIL_MAX : pfeil; // 255 wegen überlauf
25
   pfeil_setze(pfeil);
26
   // tue jenes
27
}
mfg mf

von Tony (Gast)


Lesenswert?

WOW dankee für die schnelle Antwort!!^^
Was meinst du den mit "andere init-sachen" -> bin voll der Anfänger :P

von Tony (Gast)


Angehängte Dateien:

Lesenswert?

so sieht mein jetziges Programm aus!!

von Tony (Gast)


Angehängte Dateien:

Lesenswert?

so schaut es jetzt aus!!

von Uwe (de0508)


Lesenswert?

Hallo,

was sollen den die _delay_ms(20); alle da ?

Ich kann C seit >30 Jahren programmieren, aber denn Sinn verstehe ich 
nicht.

von troll (Gast)


Lesenswert?

>IMG_20121226_181729.jpg
>5,4 MB, 0 Downloads
Bildformate Himmel Donnerwetter nochmal!

von Tony (Gast)


Lesenswert?

hy ja ich weiss eig voll unnötig!! aba ich weiss nicht weiter.

an troll sryy !!

von Karl H. (kbuchegg)


Lesenswert?

Tony schrieb:
> hy ja ich weiss eig voll unnötig!! aba ich weiss nicht weiter.

Wurde doch schon gesagt.

Dein Menü ist in Zeilen aufgeteilt.
Wenn du in die 3. Zeile einen > haben willst, dann musst du eben den 
Cursor in die 3. Zeile schicken und dort den > hinmalen (und von der 
Stelle wegnehmen, an der er vorher war).

Woher weißt du, in welche Zeile du den > brauchst?
Indem du eine Variable hast, die dir genau das festhält.
Bei jedem Tastendruck 'runter' erhöhst du diese Variable um 1, bei jedem 
Tastendruck 'rauf' verringerst du ihn. D.h. der Inhalt dieser Variablen 
sagt dir zu jedem Zeitpunkt, welche Zeile (die Nummer der Zeile) die 
gerade 'aktive' ist. D.h. das ist die, welche ausgewählt wird, wenn der 
Benutzer auf 'jetzt machen' drückt.


Und lern erst mal ein bischen C. Ohne sich die Funktionalität in 
Funktionen aufzuteilen, macht das alles wenig Sinn.

von Karl H. (kbuchegg)


Lesenswert?

Und nochwas:
Verabschiede dich von der Technik, das LCD ständig zu löschen und neu zu 
bechreiben. Genau das willst du nicht, weil sonst alles flackert. Du 
malst EINMAL deine 4 Menüpunkte aufs LCD und dann veränderst du nur 
noch, wo der > hinkommt, abhängig davon, welche Taste gedrückt wurde.

von Karl H. (kbuchegg)


Lesenswert?

Da fällt mir noch was ein.
Du brauchst als aller erstes erst mal eine vernünftige Tastenauswertung!

Entprellung

Mit deiner Technik wertest du aus, ob eine Taste gedrückt ist! Das hilft 
dir aber nicht weiter. Du musst einen einzelnen Tastendruck sauber 
erkennen können.

von Tony (Gast)


Lesenswert?

Danke für die Erklärung. :D
aber wie lösche ich den Pfeil?

von Karl H. (kbuchegg)


Lesenswert?

Tony schrieb:
> Danke für die Erklärung. :D
> aber wie lösche ich den Pfeil?

:-)
Indem du ein Leerzeichen 'darüber' malst.
Jede LCD-Position zeigt immer irgendetwas an. Und wenn diese Position 
'nichts' anzeigt, dann zeigt sie eben ein Leerzeichen an.

von Karl H. (kbuchegg)


Lesenswert?

Aber wie schon gesagt:
Ehe du ans Menü gehen kannst, brauchst du erst mal eine ordentliche 
Erkennung eines Tastendrucks. Ehe du das nicht hast, geht gar nichts mit 
dem Menü, so wie du dir das vorstellst.

von Tony (Gast)


Lesenswert?

Voll dankee :D

Ich hab jetzt ein anderes Problem wie kann ich den hier ">" als "pfeil" 
defienieren?

von Karl H. (kbuchegg)


Lesenswert?

Tony schrieb:
> Voll dankee :D
>
> Ich hab jetzt ein anderes Problem wie kann ich den hier ">" als "pfeil"
> defienieren?


Was meinst du mit 'hier'?

Du schreibst das in deinem Programm einfach hin.


   lcd_move_cursor( actLine, 0 );
   LOG_str(" ");
   actLine++;
   lcd_move_cursor( actLine, 0 );
   LOG_str(">");

von Tony (Gast)


Lesenswert?

lcd_move_cursor(LCD_LINE_2,0);
LOG_str(" ");

LCD_LINE_2++;

lcd_move_cursor(LCD_LINE_2,0);
LOG_str(">");

ich habs so hingeschrieben aber es zeigt mir einen ERROR bei der 3 Zeile 
^^
ERROR:  error: lvalue required as increment operand

von Karl H. (kbuchegg)


Lesenswert?

Tony schrieb:
> lcd_move_cursor(LCD_LINE_2,0);


LCD_LINE_2 ist wahrscheinlich bei dir eine KONSTANTE.
Die kannst du nicht verändern!


Kann es sein, dass dir das Konzept einer Variablen überhaupt nicht sagt?
Wenn ja, dann solltest du erst mal ein C-Buch von Anfang an studieren. 
Das sind Grundlagen. Sozusagen: erste Klasse, erste Stunde.
Ohne gewisse Grundkentnisse in C geht es nunmal nicht.

von Tony (Gast)


Lesenswert?

Ja tschuldigung ich sollte mir wirklich das alles nochmal anschauen, nur 
hab ich jez meine Matura und hab keine Zeit das alles neu zu lernen. Das 
Display ist ein Teil der Matura bei mir. Desshalb bräuchte ich eure 
Hilfe!!

Wenn es jetzt eine Konstante ist wie könnte ich es dann machen? Ich komm 
irgendwie nicht drauf :D

Danke im Voraus ^^

von Tony (Gast)


Lesenswert?

So ist es vordefiniert:


#define LCD_LINE_1              0x80 /* bit 7 is always set: 0x80 = 0x00 
*/
#define LCD_LINE_2              0xC0 /* 2nd line at position 40 */
#define LCD_LINE_3              0x90 /* 3nd line at position 20 */
#define LCD_LINE_4              0xD0 /* 4nd line at position 40 */

von Hmm (Gast)


Lesenswert?

>Wenn es jetzt eine Konstante ist wie könnte ich es dann machen?
Indem Du es machst, wie Karl Heinz angeregt hat. (Mach' immer das was 
Karl Heinz sagt :-) )

>Kann es sein, dass dir das Konzept einer Variablen überhaupt nicht sagt?
>Wenn ja, dann solltest du erst mal ein C-Buch von Anfang an studieren.

Das Du mit der Matura (ich will 'nen Almdudler) zu tun hast, ersetzt 
keine Kenntnisse über Variablen. Eines von beiden musst Du jetzt 
vorziehen.

von Karl H. (kbuchegg)


Lesenswert?

Tony schrieb:
> Ja tschuldigung ich sollte mir wirklich das alles nochmal anschauen, nur
> hab ich jez meine Matura und hab keine Zeit das alles neu zu lernen. Das
> Display ist ein Teil der Matura bei mir.

In dem Fall bin ich raus.
Ich will nicht, dass jemand mit 0 Ahnung einen Abschluss bekommt (egal 
in was)

> Desshalb bräuchte ich eure Hilfe!!
> Wenn es jetzt eine Konstante ist wie könnte ich es dann machen?
> Ich komm irgendwie nicht drauf :D

Du brauchst keine Hilfe, du brauchst einen Dummen, der deine 
Maturaarbeit für dich macht. Interessant wird es allerdings dann, wenn 
du vor der Kommission stehst und der Vorsitzende ein paar Fragen dazu 
hat.

von Hmm (Gast)


Lesenswert?

Mist. Jetzt habe ich erst verstanden das das für das Abitur gebraucht 
wird.

von Karl H. (kbuchegg)


Lesenswert?

Hmm schrieb:
>>Wenn es jetzt eine Konstante ist wie könnte ich es dann machen?
> Indem Du es machst, wie Karl Heinz angeregt hat. (Mach' immer das was
> Karl Heinz sagt :-) )

In dem Fall nicht ganz.
Seine Zeilenkonstanten sind so (wie ich jetzt weiß), dass man erst mal 
eine Zwischenfunktion brauchen würde um eine ordentliche, bei 0 
beginnende Nummerierung der Zeilen zu erreichen.
Allerdings ist auch das nichts, was jemanden mit Grundkentnissen vor 
unüberwindliche Probleme stellen sollte.

Und vor allen Dingen sollte er alleine drauf kommen, dass er sowas 
braucht!

von Hmm (Gast)


Lesenswert?

>In dem Fall nicht ganz.
Richtig.
Uups. Gut das ich meine Hochschulreife schon in der Tasche habe. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Hmm schrieb:
> Mist. Jetzt habe ich erst verstanden das das für das Abitur gebraucht
> wird.

Genau.
Matura ist der österreichische Begriff für Abitur.
Die einzige Schule, die ich kenne, in der auch praktisch gearbeitet 
werden muss, ist eine HTL (Höhere Technische Lehranstalt). Daher vermute 
ich mal, dass es sich um genau so eine Schule handelt. Da aber mit dem 
Abschluss dieser Schule gewisse Rechte verbunden sind (unter anderem 
darf man sich nach 3 Praxisjahren 'Ingenieur' nennen) lehne ich es ab, 
unter einem gewissen Niveau zu helfen. Dass sich mal wer verrennt ist 
schon ok. Passiert uns allen mal. Aber ein gewisses Niveau verlange ich 
von einem angehenden Ingenieur.
Und wenns keine HTL ist: Wie kommt man dazu, sich eine Maturaarbeit 
selbst auszusuchen, von der man keine Ahnung hat?

von Hmm (Gast)


Lesenswert?

>Matura ist der österreichische Begriff für Abitur.

Das wusste ich schon. Deswegen die Piefke-Anspielung mit dem Almdudler.
Nur, das unser Thema hier für die Arbeit notwendig war, das hatte ich 
nicht verstanden. Ich dachte, er müsste sich zwischen Matura und Hobby 
entscheiden.

Na gut. Lassen wir das. Ich wollte nur das Du weisst das ich weiss... 
LOL

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.