> Aber wie
bekomme ich diese in diese Form (0x"meine Zahl")?
Du brauchst nichts in Hex.
Zahl ist Zahl.
Egal ob du eine Zahl in Hex oder in Dezimal ausdrückst, es bleibt immer
dieselbe Zahl. Hex bzw. Dezimal bzw. Binär sind nur unterschiedliche
Schreibweisen.
in deinem Fall brauchst du allerdings eine BCD Kodierung, daher ist Hex
eine gute Schreibweise dafür. Aber: Du musst dir nur klar machen, dass
0x12 nichts anders als 18 ist. Warum? Weil die erste Ziffer deiner Hex
Zahl für Vielfache von 16 steht und die zweite Ziffer die Einer
darstellt.
Das ist wie im Dezimalsystem.
Die Zahl 34 bedeutet, dass du 3 10-er hast und 4 einer.
0x12 hat analog dazu 1 16-er (weil du ja im Hex-System bist) und 2
Einer.
D.h. du kannst deine Dezimalzahl 23 in Zehner und Einer zerlegen
23 / 10 -> 2 da sind die Zehner
23 % 10 -> 3 da sind die Einer.
Und dann aus den Zehnern und Einer eine gleichwertige BCD Zahl
zusammensetzen
Zehner * 16 + Einer
2 * 16 -> 32
+ 3
----
35
und hast damit eine Zahl, die wenn man sie sich in Hex ansieht, den Wert
0x23 hat.
Also schreibst du dir eine Funktion, die einen int in seine BCD
darstellung überführt
1 | unsigned char ByteToBCD( unsigned char number )
|
2 | {
|
3 | unsigned char Zehner = number / 10;
|
4 | unsigned char Einer = number % 10;
|
5 |
|
6 | return Zehner * 16 + Einer;
|
7 | }
|
und verwendest sie um die Werte deiner Variablen entsprechend in einer
BCD Form aufzubereiten, so wie die RTC sie haben will.
1 | RTCHOUR = ByteToBCD( hour );
|
2 | ...
|
> ist schon ein bisschen eigenartig gelöst
Eigentlich nicht. Das hat schon seinen Grund. Mit BCD kann man eine Zahl
ganz leicht in ihre '10-er' und 'Einer' zerlegen, ohne langwierig
dividieren zu müssen. Schieben und Maskieren reicht. Und das kann jeder
popelige µC aus dem Stand.