Forum: Mikrocontroller und Digitale Elektronik Geschachtelte Funktionen mit Pointern


von Nicki, der Affe (Gast)


Lesenswert?

Guten Abend!!!
Dies ist ein Teil aus meinem Quellcode:

void eingabe(int8_t *stelle, uint8_t *seg_stelle, struct bit *sig_bit)
{
     _delay_ms(ZEIT50);

     *stelle++;

     if(*stelle > 9)  *stelle = 0;

     bcd_seg(stelle, seg_stelle);
};

void bcd_seg(int8_t *bcd, uint8_t *seg)
{
  if(*bcd == 0)    *seg = 0xfc;
  else if(*bcd == 1)  *seg = 0x60;
  else if(*bcd == 2)  *seg = 0xda;
  else if(*bcd == 3)  *seg = 0xf2;
  else if(*bcd == 4)  *seg = 0x66;
  else if(*bcd == 5)  *seg = 0xb6;
  else if(*bcd == 6)  *seg = 0xbe;
  else if(*bcd == 7)  *seg = 0xe0;
  else if(*bcd == 8)  *seg = 0xfe;
  else if(*bcd == 9)  *seg = 0xf6;
};

Kurze Erklärung:

Funktion eingabe bekommt 3 Zeigen übergeben, *stelle enthält einen Wert 
von 0 bis 9, *seg_stelle entsprächende Wert für 7 Segment-Anzeige, 
*sig_bit ist zur Kontrolle (wird hier nicht benutzt). Mit der Hilfe von 
Funktion bcd_seg bekommt seg_stelle durch if-Anweisungen die Werte.

Meine Frage: Kann man das auf diese Weise realisieren? Bitte um die 
Korrektur!

MfG Nicki

von ARM-Fan (Gast)


Lesenswert?

Warum so ein riesen Aufriß, um eine Zahl in ein Bitmuster
für eine 7seg Anzeige umzuwandeln?
1
unsigned char lookup[10] = { 0x60, 0xFC, 0xDA .... };
2
3
void eingabe(unsigned char * stelle, unsigned char * seg)
4
{
5
   // ...
6
   *seg = lookup[*stelle];
7
}

von Nicki, der Affe (Gast)


Lesenswert?

Danke für deine Antwort. Werde auch so machen. Mich würde aber auch noch 
interessieren, wie man dies mit Funktionen losen kann.

von ARM-Fan (Gast)


Lesenswert?

Wie du es oben geschrieben hast, ist es völlig richtig.
Du kannst die Zeiger beliebig an weitere Funkionen weitergeben
und dort auch jeweils dereferenzieren.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wieso das Gebastel mit Zeigern? Exzessive Zeigernutzung ist der beste 
Weg sich ins Knie zu schießen. So ist es doch viel sauberer:
1
uint8_t bcd_seg(uint8_t bcd)
2
{
3
  // wenn man dafür schon eine eigene Funktion schreibt, dann richtig
4
  assert(bcd < sizeof(lookup));
5
  return lookup[bcd];
6
}
7
8
...
9
10
seg = bcd_seg(bcd);

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.