LCD Userinterface

Gast #1035161
Hallo!
Dies ist mein erstes richtiges projekt mit einem µC und C als Sprache.
Es handelt sich um eine Stoppuhr mit Speicher für mehrere Runden/Werte 
und dabei habe ich auch kein Problem.
Eine Debounce Funktion habe ich mit Absicht noch nicht eingebaut.

Es können mehrere Betriebsmodi verwendet werden, welches Programm man 
nutzen möchte wird beim Start über ein Userinterface ausgewählt.
Ebenso können verschiedene Setup Werte über ein UI geändert werden.
Der "proof of concept" Code dafür ist fertig.

Ich habe nur das Gefühl das das ganze irgendwie suboptimal gelöst ist.
Es würde mich freuen wenn ich jemand mal den Codeschnipsel anschauen 
würd und mir sagen könnte ob es wirklich sehr krude gelöst ist.
Mir fällt leider keine andere Lösung ein.

Ich hab eine Zip mit dem Code und zwei Bildern der Ausgabe angehängt 
damit man sich vorstellen kann wie das ganze ausschaut.
Der Ablauf ist folgender:
Start -> UI zur Programmauswahl anzeigen -> Programm auswählen und 
starten.

Ich habe, um es besser lesbar zu machen alles aus dem Code rausgenommen 
was nichts damit zu tun hat und nach bestem Willen kommentiert.

Vielen Dank schon einmal!

Mfg,
Peter
Angehängte Dateien:
@ Peter (Gast)

>Ich habe nur das Gefühl das das ganze irgendwie suboptimal gelöst ist.

Ja, so viele _delay_ms in einem Programm können nicht gut sein. Warum 
taktest du deinen uC nicht ei nfach mit 50 Hz Netzfrequenz?
Sowas macht man per Timer und Interrupt üer ein Flag.

>Es würde mich freuen wenn ich jemand mal den Codeschnipsel anschauen
>würd und mir sagen könnte ob es wirklich sehr krude gelöst ist.

Jain. es gibt wie immer Verbesserungsmöglichkeiten.

>    lcd_gotoxy(0,0);
>    lcd_puts("   Select Program");
>    lcd_gotoxy(1,1);
>    lcd_puts("FastDraw  Stopwatch");
>    lcd_gotoxy(1,2);
>    lcd_puts("IPSC      PPC");
>    lcd_gotoxy(1,3);
>    lcd_puts("Chrono    Duel");

Diese vielen konstanten String brauchen so doppelt Speicher, im Flash 
und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von 
lcd_puts() kann man die konstanten Strings in den Flash verschieben, 
siehe Doku der libc zum Themas sprintf().

>      lcd_gotoxy(0,1);
>      lcd_puts(">");
>      break;

Hier reicht es EINMAL ein lcd_puts(">"); NACH dem switch zu machen, 
spart Programmspeicher. Genauso in main.

  while (1) {

>    // wenn runter taste gedrückt auswahl erhöhen
>    if ( button_active(down) && active_programm < 5) {
>      active_programm++;
>      lcd_draw_ui(3);
>      _delay_ms(100);
>    }

MfG
Falk
Gast
> Falk:
> Ja, so viele _delay_ms in einem Programm können nicht gut sein. Warum
> taktest du deinen uC nicht ei nfach mit 50 Hz Netzfrequenz?
> Sowas macht man per Timer und Interrupt üer ein Flag.

Ja, ich weiss... theoretisch weiss ich auch wie das geht an der 
praktischen umsetzung hapert es nur noch.
Da ich gern ein repeat beim gedrückt halten und eine erkennung von zwei 
gleichzeitigen Tastendrücken als Metataste haben möchte.

> Falk:
> Hier reicht es EINMAL ein lcd_puts(">"); NACH dem switch zu machen,
> spart Programmspeicher. Genauso in main.

Oh, stimmt ja, das macht mehr Sinn, danke!

> Falk:
> Diese vielen konstanten String brauchen so doppelt Speicher, im Flash
> und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von
> lcd_puts() kann man die konstanten Strings in den Flash verschieben,
> siehe Doku der libc zum Themas sprintf().

Stimmt, daran hatte ich garnicht gedacht.
Danke für die Tips!

Mfg,
Peter
Gast
> @  Peter (Gast)
>
> > Da ich gern ein repeat beim gedrückt halten und eine erkennung von zwei
> > gleichzeitigen Tastendrücken als Metataste haben möchte.
>
> Lässt sich alles problemlos mit einem Timer machen.

Ja, ich weiss.
Ist nun auch eingebaut ;)

Mfg,
Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.