Aufwändig ist immer eine Frage des Betrachters. In erster Linie sollte
es zunächst mal korrekt sein.
Was ein
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.