4-stellige 7-Segment Anzeige (SPI)

Von Sparkfun gibt es 4-stellige 7-Segment Anzeigen, welche  einen eigenen ATmega328 Controller besitzen und eine serielle Schnittstelle und SPI zur Ansteuerung bereitstellen.

Die Platine ist nicht breiter als die Anzeige, so das auch mehrere nebeneinander montiert werden können. Die Anschlüsse befinden sich oberhalb  der 7-Segment Anzeige.

Auf der Rückseite befindet sich der Controller und die Beschriftung der Anschlüsse.

Die Anzeige gibt es in verschiedenen Farben und in Deutschland bei unter anderem bei Watterott. Im User’s Manual bei Sparkfun sind die Steuercodes dokumentiert.

Folgend ein Bespielprogramm das per SPI von 0 bis 9999 zählt und auf der 7-Segment Anzeige ausgibt. 5 Anschlüsse werden verwendet.

Arduino 7-Segment Anzeige
GND GND
5V VCC
PIN 13 SCK Clock
PIN 11 SI Datenleitung
PIN 10 CSN Slave Select

 

/*
** Beispielprogramm fuer 4-stellige 7-Segment Anzeige
** von Sparkfun ( http://www.sparkfun.com/products/9767 )
** per SPI. Basiert auf dem Code von Quazar & Busaboi
** ( http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1247533060 ),
** allerdings etwas gekürzt. Benutzung auf eigene Gefahr.
*/

#define DATAOUT 11 //SI
#define SPICLOCK 13 // SCK
#define SLAVESELECT 10 //CSN

char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

void setup()
{
  byte clr;
  pinMode(DATAOUT, OUTPUT);
  pinMode(SPICLOCK, OUTPUT);
  pinMode(SLAVESELECT, OUTPUT);
  digitalWrite(SLAVESELECT, HIGH); //disable device
  // SPCR = 01010010
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/64
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
  clr=SPSR;
  clr=SPDR;
  delay(10);
  write_led_numbers(0x78,0x78,0x78,0x78); // Display loeschen
}

void write_led_numbers(int digit1, int digit2, int digit3, int digit4)
{
   digitalWrite(SLAVESELECT, LOW);
   spi_transfer(digit1);    // Thousands Digit
   spi_transfer(digit2);    // Hundreds Digit
   spi_transfer(digit3);    // Tens Digit
   spi_transfer(digit4);    // Ones Digit
   digitalWrite(SLAVESELECT, HIGH); //release chip, signal end transfer
}

void write_led(unsigned short num)
{
    unsigned short digit[4] = { 0, ' ', ' ', ' ' };
    unsigned short place = 0;

        while ( (num ) && (place<4) ) {
            if ( (num>0)   )
                digit[place++] = num % 10;
            num /= 10;
        }
        write_led_numbers(digit[3], digit[2], digit[1], digit[0]);
}

void loop()
{
 for (int i = 0; i < 9999; i++) {
     write_led (i);
     delay(10);
   }
}

Download des Beispielprogramms: 7segment_spi.ino

Das Programm in Aktion.

 

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.