Jumbo I2C 4-Digit LED Display

This is a huge 4-digit i2c display based on an Atmega8 @16MHz which operates as a i2c slave and does all the multiplexing via timer interrupt. The display is composed of four sa23-12srwa seven segment displays (common anode) with a digit height of 57mm. The firmware for the Atmega8 was written in AVR Studio in C.

It can be addressed simply connecting it to an Arduino and using the wire library. Whenever an ultra-readable bright digit display is needed that is easy to use, this one might come in handy. Some projects I thought of were an oldschool thermometer clock or a distance-measuring device for the garage entrance.

Circuit details Jumbo LED Display

The anodes are driven using an ADN2981 driver and are attached to PB0…3. The cathodes take up the entire PORT D and are driven by a ULN2803. Those drivers are necessary, since the segments (except for the decimal point) are several red LEDs connected in series dropping ca. 7.4V. One does not simply connect one of those to a blank microcontroller port.

I2C Arduino Jumbo LED Display

Source code for the Atmega8 (AVR Studio, C) as well as the Arduino which acts as a I2C master:


// Functions to talk to the DIY jumbo LED four digit display board

#include <Wire.h>

void setup()
  Wire.begin(); // join i2c bus (address optional for master)

void loop()
  for(int i = 0; i < 10000; i++){

void ledDisplayInt(int number){
  int number_disass = number;
  int Digit_X000, Digit_0X00, Digit_00X0, Digit_000X;
  Digit_X000 = number_disass/1000; 
  number_disass %= 1000;
  Digit_0X00 = number_disass/100;  
  number_disass %= 100;
  Digit_00X0 = number_disass/10;	  
  number_disass %= 10;
  Digit_000X = number_disass;
  Wire.beginTransmission(40); // transmit to device #40 for some reason it addresses a slave with the address 0x50
  //Wire.write("x is ");        // sends five bytes
  Wire.write(byte(0));  //begin
  //sending 0...9 displays the digit, sending 10 makes digit dark
  if(number > 999){
    Wire.write(Digit_X000);              //thousands
  if(number > 99){
    Wire.write(Digit_0X00);                //hundreds
  if(number > 9){
    Wire.write(Digit_00X0);                //tens
  Wire.write(Digit_000X);                //ones
  Wire.write(4);                //decimal point position (0...3, 4 is no comma)
  Wire.write(1);                //display on/off (0x00 => off)
  Wire.endTransmission();    // stop transmitting

Leave a Reply

Your email address will not be published. Required fields are marked *