mdraber
Published © LGPL

Optimising Arduino Code using PIN registers

Alternative to using pinmode, digitalRead and digitalWrite commands to manipulate arduino pins.

IntermediateFull instructions provided466
Optimising Arduino Code using PIN registers

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
LilyPad LED Blue (5pcs)
SparkFun LilyPad LED Blue (5pcs)
×1
7 Segment LED Display, InfoVue
7 Segment LED Display, InfoVue
×1
Resistor 220 ohm
Resistor 220 ohm
×1

Story

Read more

Code

Controlling 7 segment display with pinmode, digitalWrite

Arduino
int digits [10][7]{
  {1,1,1,1,1,1,0}, // digit 0
  {0,1,1,0,0,0,0}, // digit 1
  {1,1,0,1,1,0,1}, // digit 2
  {1,1,1,1,0,0,1}, // digit 3
  {0,1,1,0,0,1,1}, // digit 4
  {1,0,1,1,0,1,1}, // digit 5
  {1,0,1,1,1,1,1}, // digit 6
  {1,1,1,0,0,0,0}, // digit 7
  {1,1,1,1,1,1,1}, // digit 8
  {1,1,1,1,0,1,1}  // digit 9
};
void setup() {
  pinMode(0, OUTPUT);// Segment A
  pinMode(1, OUTPUT);// Segment B
  pinMode(2, OUTPUT);// Segment C
  pinMode(3, OUTPUT);// Segment D
  pinMode(4, OUTPUT);// Segment E
  pinMode(5, OUTPUT);// Segment F
  pinMode(6, OUTPUT);// Segment G
}
void display_digit(int d){
  if (digits[d][0]==1) digitalWrite(0, LOW); else digitalWrite(0, HIGH); //A
  if (digits[d][1]==1) digitalWrite(1, LOW); else digitalWrite(1, HIGH); //B
  if (digits[d][2]==1) digitalWrite(2, LOW); else digitalWrite(2, HIGH); //C
  if (digits[d][3]==1) digitalWrite(3, LOW); else digitalWrite(3, HIGH); //D
  if (digits[d][4]==1) digitalWrite(4, LOW); else digitalWrite(4, HIGH); //E
  if (digits[d][5]==1) digitalWrite(5, LOW); else digitalWrite(5, HIGH); //F
  if (digits[d][6]==1) digitalWrite(6, LOW); else digitalWrite(6, HIGH); //G
}
void loop() {
  for (int i=0;i<10;i++) {
    display_digit(i);
    delay(1000);
  }
}

Controlling 7 segment display with PIN registers

Arduino
The code is not only optimised and much shorter.
It is also much faster in terms of sending appropriate signals to Arduino pins.
int digits [10]{
  B01000000, // digit 0
  B11111001, // digit 1
  B00100100, // digit 2
  B00110000, // digit 3
  B00011001, // digit 4
  B00010010, // digit 5
  B00000010, // digit 6
  B01111000, // digit 7
  B00000000, // digit 8
  B00010000  // digit 9
}; 
void setup() {
  DDRD=B11111111;
}
void loop() {
  for (int i=0;i<10;i++) {
    PORTD=digits[i];
    delay(1000);
  }
}

Credits

mdraber
50 projects • 74 followers

Comments