Jump to content

Uhr auf dem Segment Display


tatzemax

Recommended Posts

Hallo,

bin Frischling bei der C++ Programmierung

Ich habe vor das 7 Segment-display als Uhr zu nutzen, habe da auch schon Erfolge zu verzeichen, allerdings weiß ich nicht wie ich die Schleife zeitlich pausiern lassen kann

 

des weitern hatte ich vor dass duch die eingabe von "a" das Programm/die Schleife beendet wird, klappt auch aber die schleife wird erst wiederholt wenn enter gedrückt wird, sollte sich aber wiederholen.


#include <stdio.h>
#include <time.h>

#include "ip_connection.h"
#include "bricklet_segment_display_4x7.h"


#define HOST "localhost"
#define PORT 4223



const uint8_t digits[] = {0x3f,0x06,0x5b,0x4f,
                          0x66,0x6d,0x7d,0x07,
                          0x7f,0x6f,0x77,0x7c,
                          0x39,0x5e,0x79,0x71}; // 0~9,A,b,C,d,E,F
int main(void)
{

// Create IP connection
    IPConnection ipcon;
    ipcon_create(&ipcon);

    // Create device object
    SegmentDisplay4x7 sd4x7;
    segment_display_4x7_create(&sd4x7, "iX8", &ipcon); 

// Connect to brickd
    if(ipcon_connect(&ipcon, HOST, PORT) < 0) {
        fprintf(stderr, "Could not connect\n");
        exit(1);
    }


    while(getchar()!='a')
    {
    
    struct tm *newtime;
    time_t long_time;

    time( &long_time );
    newtime = localtime( &long_time );

    int stunde = newtime->tm_hour;
    int minute = newtime->tm_min;

    //Befehl an die Anzeige senden
    uint8_t segments[4] = {digits[stunde/10], digits[stunde%10], digits[minute/10], digits[minute%10]};
    segment_display_4x7_set_segments(&sd4x7, segments, 1, true);
          
    }
ipcon_destroy(&ipcon); // Calls ipcon_disconnect internally
} 

Link zu diesem Kommentar
Share on other sites

Wenn ich das richtig sehe, dürfte sich Deine Anzeige derzeit nur aktualisieren, wenn Du ENTER drückst - korrekt?

 

getchar() liest stdin immer "buffered", d. h. die Anwendung bekommt immer nur eine ganze Zeile, die dann zeichenweise gelesen werden kann. Um das zu umgehen musst Du stdin in einen unbuffered mode versetzen und dann kannst Du prüfen, ob überhaupt ein Zeichen getippt wurde, siehe z:b. http://stackoverflow.com/questions/5616092/non-blocking-call-for-reading-descriptor.

 

Zum warten gibt es z. B. usleep oder besser noch die C++ Varianten davon, siehe z: B. http://stackoverflow.com/questions/4184468/sleep-for-milliseconds. Du könntest also immer etwas warten, prüfen ob eine Taste gedrückt wurde und die Anzeige aktualisieren.

 

Alternativ geht es nur mit 2 Threads (dann wird es aber auch gleich komplizierter): einer wartet auf Tastatureingabe, die kann dann auch gepuffert sein, und der andere aktualisiert die Anzeige. Die Threads müssen sich dann aber noch synchronisieren ...

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...