www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Geschachtelte Funktionen mit Pointern


Autor: Nicki, der Affe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so ein riesen Aufriß, um eine Zahl in ein Bitmuster
für eine 7seg Anzeige umzuwandeln?
unsigned char lookup[10] = { 0x60, 0xFC, 0xDA .... };

void eingabe(unsigned char * stelle, unsigned char * seg)
{
   // ...
   *seg = lookup[*stelle];
}

Autor: Nicki, der Affe (Gast)
Datum:

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

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso das Gebastel mit Zeigern? Exzessive Zeigernutzung ist der beste 
Weg sich ins Knie zu schießen. So ist es doch viel sauberer:
uint8_t bcd_seg(uint8_t bcd)
{
  // wenn man dafür schon eine eigene Funktion schreibt, dann richtig
  assert(bcd < sizeof(lookup));
  return lookup[bcd];
}

...

seg = bcd_seg(bcd);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.