mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GLCD Display mit einem Menü


Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle zusammen,

ich habe mir für ein kleine Hobbyprojekt einen AT-Mega128 mit einem 
128x128GLCD Display aufgebaut. Das Display kann ich auch schon 
erfolgreich ansteuern.

Ich möchte auf dem Display ein relativ einfaches menü darstellen welches 
aus zwei ebenen besteht. Dafür habe  ich das Display in 2 Teile geteilt 
96pixel und 32pixel. Der Schönheit halber auch schon mit linien 
versehen.

Jetzt möchte ich im oberen Teil das Hauptmenu anzeigen, die Länge des 
menüs kann ich jetzt noch nicht genau sagen. Wenn ich jetzt mit den 
Tasten oben auswähle dann soll sich im Unteren Teil das Menü ändern.

Also mal als Strucktur dargestellt

Menü1
-----Submenü1
-----Submenü2
-----Submenü3
Menü2
-----Submenü1
...

Jeder untermenüeintrag soll dann bestimmte Pins Setzen oder nicht.
Beispiel:
Auswahl Menü1-->Submenü1
PortD : Pin0 (1), Pin1(0), Pin2(1), Pin3(0)
Auswahl Menü1-->Submenü2
PortD : Pin0 (0), Pin1(1), Pin2(0), Pin3(0)

Jetzt liegt mein Problem darin das ich mich gerade in C einarbeite, habe 
mir dafür auch einige Nützliche Bücher besorgt.

Mir fehlt momentan ein gescheiter Ansatzpunkt wie ich das ganze beginne. 
Wenn mir da jemand ein paar Tipps geben könnte wo ich mir ähnliches auch 
anschauen kann, wäre ich euch echt sehr dankbar.

Das dann nach dem Auswählen noch mehr geschied ist klar und auch jetzt 
nicht unbdingt das Problem (momentan).

Tschau ingo

P.S.: Bitte nicht falsch verstehen, ich möchte es nicht vorgekaut 
bekommen, denn dann kann ich es ja auch nicht lernen ;-)

Autor: Puppetmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würd eine Funktion anlegen die mir das Menü zeichnet wenn es 
aufgerufen wird und mit einer Variablen die Auswahl speichern.

Pseudocode:
int Menüpunkt;
void Menüzeichnen(void)
{
//Zeichnet das menü
}

void Auswahl(int i)
{
Menüzeichnen();/*Stellt das normale menü erst wieder her damit nicht alles markiert ist*/
//Zeichnet einen Kastenmarkierung oder was auch immer an Position int i ^^ z.b. mit einer if Abfrage
}

void Normal(void)
{
//Zeichnet alles nochmal so wie es aussehen soll ohne Menü ausgeklappt
}

while(1)
{

if(ereigniss== menüöffnen)  
{
Menüzeichnen();
Auswahl(0);
Menüpunkt=0;
}

if(ereigniss== menü up && Menüpunkt |= 0) Auswahl(--Menüpunkt);
else if(ereigniss== menü down && Menüpunkt < Maximum) Auswahl(++Menüpunkt);
}

if(ereigniss== bestätigen gedrückt)
{
if(Menüpunkt == 0) PortD : Pin0 (1), Pin1(0), Pin2(1), Pin3(0); 
else if(Menüpunkt == 1) PortD : Pin0 (0), Pin1(1), Pin2(0), Pin3(0);
//usw...
Menüpunkt=0;
Normal();
}

Ich hoffe das ist so verständlich so würde ich das im groben aufbauen ps 
das ist jetzt nicht 100% durchdacht und besonders beim umschalten der 
pins müsste man sich gedanken machen ob das ned etwas mit ner Schleife 
besser ging die überprüft welcher Pin gesetzt werden muss

Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz brauchbarer Code für einen Menu-Handler auf Basis eines 
tabellengesteuerten endlichen Automaten ist im AVR Butterfly code zu 
finden (sieh mal auf 
http://www.mikrocontroller.net/articles/AVR_Butterfly , GCC port hier: 
http://www.siwawi.arubi.uni-kl.de/avr_projects/).

Ist ein gutes Beispiel für datengesteuertes Programmieren (im Gegensatz 
zum Ausprogrammieren des Verhaltens in endlosen Würsten von if/then/else 
und case statements) : das Verhalten des Menübaums wird durch Tabellen 
(arrays im Flash) definiert  - man muss nur noch die für den Menüpunkt 
spezifische Funktion hinzufügen. Und über C-Datentypen und Pointer auf 
Funktionen lernst auch gleich was dabei.

lg Michael

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Tipps. Ich werde jetzt über den Weg mit Array und 
mehrdimensionale Arrays gehen. Praktisch die Inhalte des menüs in einem 
Array im Flash ablegen. Die Koordinaten werde ich dann im EEprom 
abspeichern, damit die Werte auch nach einem neustart noch vorhanden 
sind. Habe mir einen Programmablaufplan aufgestellt damit ich das 
Programm gescheit umsetzen kann.

Wenn ich dann wieder ein Problemchen haben, hoffe ich doch das ich die 
Probleme mit euch Klären kann.

Tschau Ingo

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

so bin jetzt dabei das erste Array anzulegen. Sinnvollerweise würde ich 
das Menü im flash ablegen. Dafür habe ich mir das Tutorial mal zur Hilfe 
genommen aber irgendwie verstehe ich die ganze sache nicht.

Als erstes in der Definition das array selbst
const char str1[] PROGMEM = "Betriebssysteme";
const char str2[] PROGMEM = "Speicherconfig";
const char str3[] PROGMEM = "Sound";
 
const char *strarray1[] PROGMEM = {
  str1,
  str2,
  str3
};

Aber irgendwie verstehe ich das Prinzip des lesens aus dem Flash nicht 
richtig, was auch sehr dürftig beschrieben ist.
int main(void)
{
  int i, j, l;
  const char *pstrflash;
  char work[20], work2[20];
  // fuer Simulation: per volatile Optimierung verhindern, 
  //                  da c nicht genutzt
  volatile char c;
  
  for ( i = 0; i < (sizeof(strarray1)/sizeof(strarray1[0]) ); i++ ) {
 
    // setze Pointer auf die Addresse des i-ten Elements des
    // "Flash-Arrays" (str1, str2, ...)
    pstrflash = (const char*)( pgm_read_word( &(strarray1[i]) ) );
    
    // kopiere den Inhalt der Zeichenkette von der
    // in pstrflash abgelegten Adresse in das work-Array
    // analog zu strcpy( work, strarray1[i]) wenn alles im RAM
    strcpy_P( work, pstrflash );
    // verkuerzt:
    strcpy_P( work2, (const char*)( pgm_read_word( &(strarray1[i]) ) ) );
    
 
    // Zeichen-fuer-Zeichen
    l = strlen_P( pstrflash );
    for ( j=0; j < l; j++ ) {
      // analog zu c=strarray[i][j] wenn alles im RAM
      c = (char)( pgm_read_byte( pstrflash++ ) );
    }
  }
 
  while (1) { ; }
}

Sehe ich das richtig das jedes Zeichen einzeln in den Speicher kopiert 
werden muß`?

Oder gibts da noch einen einfacheren weg?

Wieder für Tips Dankbar. Ingo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.