Uhrzeit in einem String zusammen packen!

Gast #3501453
Lesenswert?

Hallo Leutz...

Ist es möglich ohne großen Aufwand... meine Daten -->

Sekunden...
Minuten...
Stunden...

in einen String zu packen und gemeinsam auf dem GLCD aus zu geben ?!

hier der Code... Ich mache es imoment so...

eine kleine frage noch...

Code:
1
  Sekunden &= 0x7F;
2
  Minuten &= 0x7F;
3
  Stunden &= 0x3F;
4

5
 ks0108GotoXY(30, 40);  
6
 WriteBCD(Sekunden);
7
 
8
  ks0108GotoXY(50, 40);
9
 WriteBCD(Minuten);
10
 
11
 ks0108GotoXY(70, 40);
12
 WriteBCD(Stunden);
13

14

15
 
16

17

18
}//Ende While
19

20
}// Ende Main
21

22

23

24
void WriteBCD(char Value)
25
  
26
{
27
  char Buffer[2];
28
  Buffer + 0 = (Value >> 4)  + 0x30;
29
  Buffer + 1 = (Value & 0x0f) + 0x30;
30
  Buffer + 2 = '\0';
31
  ks0108Puts(Buffer);
32
}
Gast #3501472
Lesenswert?

sorry... so mache ich es ... das davor war noch ein Versuch...

Code:

  Sekunden &= 0x7F;
  Minuten &= 0x7F;
  Stunden &= 0x3F;

 ks0108GotoXY(30, 40);
 WriteBCD(Sekunden);

  ks0108GotoXY(50, 40);
 WriteBCD(Minuten);

 ks0108GotoXY(70, 40);
 WriteBCD(Stunden);





}//Ende While

}// Ende Main



void WriteBCD(char Value)

{
  char Buffer[2];
  Buffer[0] = (Value >> 4)  + 0x30;
  Buffer[1] = (Value & 0x0f) + 0x30;
  Buffer[2] = '\0';
  ks0108Puts(Buffer);
}
#3501482
Lesenswert?

Aufwändig ist immer eine Frage des Betrachters. In erster Linie sollte 
es zunächst mal korrekt sein.
Was ein
1
  char Buffer[2];
in der Funktion definitiv nicht ist.

Was zb ginge:

Anstatt diesem hier
1
  Buffer + 0 = (Value >> 4)  + 0x30;
2
  Buffer + 1 = (Value & 0x0f) + 0x30;
mit nachfolgender einzelner Ausgabe, die Einzelteil halt zunächst mal in 
einem String zusammensetzen
1
void WriteTime( uint8_t hour, uint8_t minute, uint8_t second )
2
{
3
  char timeStr[9];
4

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

15
  ks0108Puts( timeStr );
16
}

Die BDC Aufdröselung könnte man mit 2 Makros BDC_HIGH_CHAR und 
BCD_LOW_CHAR noch etwas schöner verstecken, eventuell könnte man sich 
auch eine BCD Umwandlungsfunktion machen, so dass das ganze auf
1
void BcdToChar( char* target, uint8_t bcdNumber )
2
{
3
  target[0] = ( bcdNumber >> 4 ) + '0';
4
  target[1] = ( bcdNumber & 0x0F ) + '0';
5
}
6

7
void WriteTime( uint8_t hour, uint8_t minute, uint8_t second )
8
{
9
  char timeStr[9];
10

11
  BcdToChar( &timeStr[0], hour );
12
  timeStr[2] = ':';
13
  BcdToChar( &timeStr[3], minute );
14
  timeStr[5] = ':';
15
  BcdToChar( &timeStr[6], second );
16
  timeStr[8] = '\0';
17

18
  ks0108Puts( timeStr );
19
}
hinausläuft, aber so in der Richtung finde ich das schon unaufwändig 
genug.

Da aber wahrscheinlich die Ausgabe auf ein GLCD sowieso den Löwenanteil 
an der Ausgabe verschlingt, spricht eigentlich auch nicht viel dagegen 
sprintf einzusetzen. packed BCD hat den Charme, dass man sie einfach als 
HexZahlen ausgeben kann.
Gast #3501500
Lesenswert?

Karl Heinz schrieb:
> 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';
....

Die lösung klingt gut, nur leider wird nichts angezeigt ?!
#3501503
Lesenswert?

Jan.H schrieb:
> Karl Heinz schrieb:
>> 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';
> ....
>
> Die lösung klingt gut, nur leider wird nichts angezeigt ?!

Wird die Funktion aufgerufen?
Kommt deine String Ausgabefunktion mit längeren Strings klar?
Gast #3501513
Lesenswert?

das ist mein code...

Sekunden &= 0x7F;
Minuten &= 0x7F;
Stunden &= 0x3F;

TimeToString();


}//Ende While

}// Ende Main



void TimeToString(char *strg, uint8_t Stunden, uint8_t Minuten, uint8_t 
Sekunden)
{

  char MeineZeit[10];

  strg[0] = (Stunden >> 4)  + 0x30;
  strg[1] = (Stunden & 0x0f) + 0x30;
  strg[2] = ':';
  strg[3] = (Minuten >> 4)  + 0x30;
  strg[4] = (Minuten & 0x0f) + 0x30;
  strg[5] = ':';
  strg[6] = (Sekunden >> 4)  + 0x30;
  strg[7] = (Sekunden & 0x0f) + 0x30;
  strg[8] = '\0';



  TimeToString(MeineZeit, Stunden, Minuten, Sekunden);
    ks0108GotoXY(50, 40);
  ks0108Puts(MeineZeit);


}
Gast #3501527
Lesenswert?

>das ist mein code...

Das glaubst du doch selber nicht;)
TimeToString() in main wird ohne Parameter aufgerufen.
Alleine das gibt schon einen Error.
Und dann ruft sich das Viech auch noch selber auf!
Ach wie rekursiv kann das Leben doch sein;)

Ich bin dann mal weg.
#3501559
Lesenswert?

Jan.H schrieb:
> das ist mein code...

Kauf dir ein C-Buch.
Ernsthaft.

In dem präsentierten Codeausschnitt ist so viel daneben, dass man gar 
nicht weiß, worüber man zuerst schmunzeln soll.
Dabei hab ich dir eine sauber funktionierende Funktion gegeben, die du 
nur noch so wie sie ist hättest aufrufen müssen. Statt dessen machst du 
Änderungen und jede einzelne deiner Änderungen ist ein Griff ins Klo.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren