SparkFun Forums 

Where electronics enthusiasts find answers.

General project discussion / help
Did you make a robotic coffee pot which implements HTCPCP and decafs unauthorized users? Show it off here!
By BusinessCat
#195288
Hello all!

I'm trying to interface a 7-segment common-anode driver (http://www.mouser.com/ProductDetail/Max ... zoGQ%3d%3d) with my Arduino Uno. After studying the datasheet and timing diagram I wrote code to display the number "01234567" on my display but it isn't lighting up at all. :( I put the timing diagram and the code I wrote below. My method for updating the display in the code is to first update the data pins for the respective digit then pulse WRITE. I hate to be vague but I really don't know where I'm going wrong here. If anyone could take the time to help I would truly appreciate it!

Image
Code: Select all
int MODE = 0;
int WRITE = 1;
int ID0 = 2;
int ID1 = 3;
int ID2 = 4;
int ID3 = 5;
int ID4 = 6;
int ID5 = 7;
int ID6 = 8;
int ID7 = 9;

void setup()
{
  pinMode(MODE, OUTPUT);
  pinMode(WRITE, OUTPUT);
  pinMode(ID0, OUTPUT);
  pinMode(ID1, OUTPUT);
  pinMode(ID2, OUTPUT);
  pinMode(ID3, OUTPUT);
  pinMode(ID4, OUTPUT);
  pinMode(ID5, OUTPUT);
  pinMode(ID6, OUTPUT);
  pinMode(ID7, OUTPUT);

  delay(1000);

  updateDisplay();
}

void loop()
{
  
}

void updateDisplay()
{
  digitalWrite(MODE, LOW);
  digitalWrite(WRITE, HIGH);
  
  //Set up data pins for control word.
  digitalWrite(ID3, HIGH);
  digitalWrite(ID4, HIGH);
  digitalWrite(ID5, LOW);
  digitalWrite(ID6, LOW);
  digitalWrite(ID7, HIGH);
  
  //Pulse WRITE while MODE is high.
  digitalWrite(MODE, HIGH);
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);
  digitalWrite(MODE, LOW);

  //Set up pins for digit 1 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, LOW);
  digitalWrite(ID2, LOW);
  digitalWrite(ID3, LOW);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 2 byte.
  digitalWrite(ID0, HIGH);
  digitalWrite(ID1, LOW);
  digitalWrite(ID2, LOW);
  digitalWrite(ID3, LOW);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 3 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, LOW);
  digitalWrite(ID2, HIGH);
  digitalWrite(ID3, LOW);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 4 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, LOW);
  digitalWrite(ID2, HIGH);
  digitalWrite(ID3, HIGH);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 5 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, HIGH);
  digitalWrite(ID2, LOW);
  digitalWrite(ID3, LOW);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 6 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, HIGH);
  digitalWrite(ID2, LOW);
  digitalWrite(ID3, HIGH);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 7 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, HIGH);
  digitalWrite(ID2, HIGH);
  digitalWrite(ID3, LOW);

  //Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);

  //Set up pins for digit 8 byte.
  digitalWrite(ID0, LOW);
  digitalWrite(ID1, HIGH);
  digitalWrite(ID2, HIGH);
  digitalWrite(ID3, HIGH);

  //Pulse WRITE while MODE is high.
  digitalWrite(MODE, HIGH);
  digitalWrite(WRITE, LOW);
  digitalWrite(WRITE, HIGH);
  digitalWrite(MODE, LOW);
}
User avatar
By DanV
#195308
I would start by putting a delay between pulsing the WRITE line.
Code: Select all
//Pulse WRITE while MODE is high.
  digitalWrite(WRITE, LOW);
  // delay here 
  digitalWrite(WRITE, HIGH);
Then, I would play with eliminating your final MODE writing.

There is nothing in function loop().
If you want to run once, create a bool as a flag to allow for running updateDisplay() one time. Place updateDisplay() inside function loop().
Code: Select all
void loop()
{
  if not bOneTime 
  {
    updateDisplay();
    bOneTime = true;
  }
}
I personally know nothing of the device you are working with short of browsing through the datasheet just now.
By n1ist
#195309
According to the timing diagram you posted (the notes at the bottom), the display is blanked if the control word is written with ID7 high, and the control word is written when write goes low while mode is high. This is exactly what you are doing after writing the 8th digit.

/mike