Uhrzeit in einen String packen...

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo,

Ich möchte gerne die Uhrzeit die ich einstelle via. Drehgeber in einen String packen.



CodeBox C
    if (hour < 10)
     {
       strcpy(str_hour,"0");
     }
     itoa(hour,str_hour+strlen(str_hour),10);
     
     
     strcpy(str_hour+strlen(str_hour),":00");


Wenn die "Stunden" kleiner als "10" sind, soll automatisch eine "0" davor stehen. Das klappt soweit bis ich zur "10" komme. Dann wird mein ganzes Display voll geschrieben. Was mache ich falsch?

Freue mich mal wieder über eure Hilfe.
 
Befindet sich vor der if-Abfrage eine Zeichenkette in str_hour? Dies wäre wichtig. Es reicht auch eine "Null-Länge" mit Stringabschluss '\0'.

Auch sollte das char Array str_hour ausreichend viele Zeichen aufnehmen können.

Dirk :ciao:
 
Steht vorher nichts drinn.



CodeBox C
void user_set_timer(uint8_t menue_return)
{
   init_time_base_tmr1();
   
   lcd_gotoxy(0,0);
   lcd_puts("Set Time for Timer");
   lcd_gotoxy(0,1);
     
   lcd_clrscr();
     
   uint8_t hour = 5 ,minute = 23;   
   uint8_t old_value;
   
   char str_hour[5];
   char str_minute[5];
     
   while(1)
   {
     
     hour += encode_read();
     
     if (hour > 24)
     {
       hour = 0;
     }
     
     if (hour < 10)
     {
       strcpy(str_hour,"0");
     }
     itoa(hour,str_hour+strlen(str_hour),10);
     
     
     strcpy(str_hour+strlen(str_hour),":00");
     
     lcd_gotoxy(0,0);
     lcd_puts(str_hour);   
     
     if (ENC_SWITCH_PRESSED)
     {
       _delay_ms(500);
       break;
     }
     
   }
 
Steht vorher nichts drinn.

Der String ist somit nicht definiert, die Stringlänge ist unbekannt.
Dies gibt dann Probleme, wenn die if-Bedingung unwahr ist.

Schreibe einmal vor die if-Abfrage wenigstens
str_hour[0] = '\0';
 
Super. Funktioniert!

Besten dank!
 
Die Stunden kann ich nun einstellen. Die Minuten leider noch nicht so wie ich möchte.
Und zwar...

Stelle ich die Stunden z.B auf "12" sollte das auf dem LCD so aussehen -->

12:00 (es sollen nur die Stunden verändert werden)...

Wenn ich jetzt die Minuten einstelle möchte ich gerne folgendes auf dem LCD stehen haben...

12:xx (es sollen nur die Minuten verändert werden)...

hier mein bisheriges "hin und her kopiere"...



CodeBox C
  while(1)
   {
     
     hour += encode_read();
     
     if (hour > 24)
     {
       hour = 0;
     }
     
     
     str_hour[0] = '\0';
     
     if (hour < 10)
     {
       strcpy(str_hour,"0");
     }
     
     itoa(hour,str_hour+strlen(str_hour),10);
     strcpy(str_hour+strlen(str_hour),":00");
     
     lcd_gotoxy(0,0);
     lcd_puts(str_hour);   
     
     if (ENC_SWITCH_PRESSED)
     {
       _delay_ms(500);
       break;
     }
     
   }
   
   while(1)
   {
     
     minute += encode_read();
     
     if (minute > 59)
     {
       minute = 0;
     }
     
     
     str_minute[0] = '\0';     

     strcpy(str_minute, str_hour);
     itoa(minute,str_minute,10);
     
     lcd_gotoxy(0,0);
     lcd_puts(str_minute);
     
     if (ENC_SWITCH_PRESSED)
     {
       _delay_ms(500);
       break;
     }
     
   }
   
}

geht es evtl. eleganter?
 
geht es evtl. eleganter?

Deinen Sourcecode verstehe ich leider nicht ganz.

Allgemein würde ich nur dann eine Ausgabe auf dem LCD machen, wenn die notwendig ist. Also nicht permanent in einer while(1) Schleife. Wobei ich jetzt auch nicht weiß, was encode_read macht.

Ich würde hier auch auf strcpy und itoa verzichten, es sei denn du nutzt das noch woanders.
Es geht prinzipiell zum Beispiel so einfacher (ist von kbuchegg mikrocontroller.net, eventuell sogar ein älteres Thema von dir).
Vielleicht hilft das ja schon mal irgendwie weiter.


CodeBox C
void WriteTime( uint8_t hour, uint8_t minute, uint8_t second )
{
  char timeStr[9];

  timeStr[0] = ( hour >> 4 ) + '0';
  timeStr[1] = ( hour & 0x0F ) + '0';
  timeStr[2] = ':';
  timeStr[3] = ( minute >> 4 ) + '0';
  timeStr[4] = ( minute & 0x0F ) + '0';
  timeStr[5] = ':';
  timeStr[6] = ( second >> 4 ) + '0';
  timeStr[7] = ( second & 0x0F ) + '0';
  timeStr[8] = '\0';

  ks0108Puts( timeStr );
}
 
Hallo Dirk,

ich war gestern ziemlich verzweifelt und habe zu viel experementiert! Am abend bin ich dann auch auf die Idee gekommen, dies so zu verwirklichen.

Wieso sollte man nicht ständig auf das LCD schreiben?
 
Wieso sollte man nicht ständig auf das LCD schreiben?

Naja, wenn sich keine Ausgabedaten ändern, ist es nicht notwendig, eine Ausgabe zu machen. Der Mikrocontroller kann in dieser Zeit eventuell etwas sinnvolleres machen, der Bus zum Display ist "ruhig", das ist ein Vorteil bezüglich EMV.

Wenn du mit dem Auto an einer roten Ampel stehst, kuppelst du normalerweise aus und gehst vom Gas ;)
 
Hi,

Wieso sollte man nicht ständig auf das LCD schreiben?
außerdem frißt die LCD-Ausgabe Unmengen von Prozessortakten weg. Unter anderem auch wegen der relativ langsamen Bus-Signale zum LCD (Wartezeiten). Wenn du ein Programm langsam bekommen möchtest, dann schreib möglichst viel aufs LCD.

Probier es doch einfach mal aus. Bau dir ne Schleife in der alle 256 Durchläufe (Bytevariable überlaufen lassen) eine LED getoggelt wird. Laß die Schleife mal ohne Wartebefehle oder mal mit Wartebefehlen darin laufen. Dann pack mal statt der ganzen Wartebefehle einfach eine LCD-Ausgabe rein. Fall aber nicht vom Hocker wenn du das Ergebnis siehst.

Gruß
Dino
 
Hallo!


Also sprintf() wäre da auch eine Lösung und so viel frisst das auch nicht an Platz:



CodeBox C
uint8_t oldsec;

void WriteTime( uint8_t hour, uint8_t minute, uint8_t second )
{
 char timeStr[9];
   if (oldsec != second)
  {
    sprintf(timeStr,"%02d:%02d:%02d",hour,minute,second);
    ks0108Puts( timeStr );
    oldsec=second;
  }
}


Grüße
Hans-Joachim
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)