Jump to content

Uhr auf dem Segment Display


tatzemax
 Share

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 to comment
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 to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...