Problem ist eher andersrum... es werden 4 Zeichen geholt, aber nur 3 gespeichert. Das 4. Zeichen landet irgendwo, wo es nicht hinsoll.

Den Teil hier
Code:
   while (*number)
   {
      if(i == 0)
      {
         zahl1 = (uint8_t) *number;
      }
      if(i == 1)
      {

         dotpoint = *number;
      }
      if(i == 2)
      {
      
         zahl2 = (uint8_t) *number;
      }
      
      number++;
      i++;
   }
würd ich eher abkürzen:

Code:
zahl1 = number[0];
dotpoint = number[1];
zahl2 = number[2];
Beseitigt auch die Gefahr, dass die While-Schleife mal hängen bleibt.

Die gesamte Bit-Zusammenbauerei könnte man natürlich noch weiter zusammenkürzen. Ich mach das z.B. nicht über einzelne Bits, sondern verwende pro Segment ein Byte. Sind ja 7 Segmente + 1 Punkt = 8 Bits.
Die Bitfolge sieht dann pro Byte so aus [DP][G][F][E][D][C][B][A].
Und dieses Byte schieb ich dann normal raus.
Könnte dann z.B. so aussehen:
case 1: daten = 0x06; // Bits: 0000 0110
case 2: daten = 0x5B; // Bits: 0101 1011
...
Soll der Punkt der jeweiligen Ziffer gesetzt werden:
data |= 0x80.