Forum: Mikrocontroller und Digitale Elektronik Uhrzeit in einem String zusammen packen!


von Jan.H (Gast)


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
}

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

char buffer[9];
  Sekunden &= 0x7F;
  Minuten &= 0x7F;
  Stunden &= 0x3F;

 ks0108GotoXY(30, 40);
 snprintf(buffer, sizeof(buffer), "%02X:%02X:%02X", Stunden, Minuten, 
Sekunden);
 ks0108Puts(buffer);

von Jan.H (Gast)


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);
}

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Jan.H (Gast)


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 ?!

von Karl H. (kbuchegg)


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?

von holger (Gast)


Lesenswert?

>Die lösung klingt gut, nur leider wird nichts angezeigt ?!

Das liegt an deinem unsichtbaren Programm.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Wird die Funktion aufgerufen?
> Kommt deine String Ausgabefunktion mit längeren Strings klar?

* Hast du dir vielleicht unabsichtlich den offenbar notwendigen
ks0108GotoXY(30, 40)
beim Einbau des Aufrufs gleich mit gelöscht?

von Jan.H (Gast)


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);


}

von holger (Gast)


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.

von greg (Gast)


Lesenswert?

Was spricht hier nochmal gegen printf? Stringformatierung selbst 
hinfummeln macht doch keinen Spaß. Das sollte man nur tun, wenn es 
anders nicht geht.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:

> Und dann ruft sich das Viech auch noch selber auf!

Damit hab nicht mal ich gerechnet. Und ich rechne ansonsten mit fast 
allem, was auch nur den Hauch einer Chance hat falsch gemacht zu werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.