Рассматриваются способ подключения нескольких семи-сегментных сегментных индикаторов и более 10 кнопок непосредственно к плате Ардуино. Способ — "общая шина" и "коммутационная матрица".

Подключение одного семи-сегментного индикатора к Ардуино

Рис. 1. Схема подключения одного семи-сегментного индикатора к Ардуино

Общая шина

Подключение нескольких цифровых семи-сегментных индикаторов.

Рис. 1. Схема подключения четырёх семи-сегментных индикаторов к Ардуино

fhfyiu

int a = 2; int b = 3; int c = 4; int d = 5; int e = 6; int f = 7; int g = 8;
int s1 = 9; int s2 = 10; int s3 = 11; int s4 = 12;
int l1, l2, l3, l4;
int n = 0;

byte segment(int n) {
  byte x;
  switch (n) {
    case 0:
      x = 0b11111110;
      break;
    case 1:
      x = 0b00011000;
      break;
    case 2:
      x = 0b01101111;
      break;
    case 3:
      x = 0b00111111;
      break;
    case 4:
      x = 0b10011011;
      break;
    case 5:
      x = 0b10110111;
      break;
    case 6:
      x = 0b11110111;
      break;
    case 7:
      x = 0b00011110;
      break;
    case 8:
      x = 0b11111111;
      break;
    case 9:
      x = 0b10111111;
      break;
  }
  return x;
}

void led(int y) {
  int z1, z2, z3, z4;
  z1 = y % 10;
  z4 = y / 1000;
  z3 = (y - 1000 * z4) / 100;
  z2 = (y - 1000 * z4 - 100 * z3) / 10;
  l1 = segment(z1);
  l2 = segment(z2);
  l3 = segment(z3);
  l4 = segment(z4);
}

void setup() {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
}

void loop() {
  n++;
  if (n == 10000) {
    n = 0;
  }
  led(n);
  delay(100);
}

void yield() {
  PORTD = l1;
  digitalWrite(g, l1 & 1);
  digitalWrite(s1, HIGH);
  delayMicroseconds(500);
  digitalWrite(s1, LOW);
  PORTD = l2;
  digitalWrite(g, l2 & 1);
  digitalWrite(s2, HIGH);
  delayMicroseconds(500);
  digitalWrite(s2, LOW);
  PORTD = l3;
  digitalWrite(g, l3 & 1);
  digitalWrite(s3, HIGH);
  delayMicroseconds(500);
  digitalWrite(s3, LOW);
  PORTD = l4;
  digitalWrite(g, l4 & 1);
  digitalWrite(s4, HIGH);
  delayMicroseconds(500);
  digitalWrite(s4, LOW);
}

Подключение нескольких цифровых семи-сегментных индикаторов.

int a = 2; int b = 3; int c = 4; int d = 5; int e = 6; int f = 7; int g = 8;
int s1 = 9; int s2 = 10; int s3 = 11; int s4 = 12;
int l1, l2, l3, l4;
byte x[] = {0b11111110, 0b00011000, 0b01101111, 0b00111111, 0b10011011,
            0b10110111, 0b11110111, 0b00011110, 0b11111111, 0b10111111
           };
int dutyH = 10;
int dutyL = 500;
int n = 0;

void led(int y) {
  int z1, z2, z3, z4;
  z1 = y % 10;
  z4 = y / 1000;
  z3 = (y - 1000 * z4) / 100;
  z2 = (y - 1000 * z4 - 100 * z3) / 10;
  l1 = x[z1];
  l2 = x[z2];
  l3 = x[z3];
  l4 = x[z4];
}

void setup() {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
}

void loop() {
  n++;
  if (n == 10000) {
    n = 0;
  }
  led(n);
  delay(100);
}

void yield() {
  PORTD = l1;
  digitalWrite(g, l1 & 1);
  digitalWrite(s1, HIGH);
  delayMicroseconds(dutyH);
  digitalWrite(s1, LOW);
  delayMicroseconds(dutyL);
  PORTD = l2;
  digitalWrite(g, l2 & 1);
  digitalWrite(s2, HIGH);
  delayMicroseconds(dutyH);
  digitalWrite(s2, LOW);
  delayMicroseconds(dutyL);
  PORTD = l3;
  digitalWrite(g, l3 & 1);
  digitalWrite(s3, HIGH);
  delayMicroseconds(dutyH);
  digitalWrite(s3, LOW);
  delayMicroseconds(dutyL);
  PORTD = l4;
  digitalWrite(g, l4 & 1);
  digitalWrite(s4, HIGH);
  delayMicroseconds(dutyH);
  digitalWrite(s4, LOW);
  delayMicroseconds(dutyL);
}

Подключение нескольких цифровых семи-сегментных индикаторов.

int a = 2; int b = 3; int c = 4; int d = 5; int e = 6; int f = 7; int g = 8;
int s[] = {9, 10, 11, 12};
int l[4];
byte x[] = {0b11111110, 0b00011000, 0b01101111, 0b00111111, 0b10011011,
            0b10110111, 0b11110111, 0b00011110, 0b11111111, 0b10111111
           };
int dutyH = 50;
int dutyL = 500;
int n = 0;

void led(int y) {
  int z1, z2, z3, z4;
  z1 = y % 10;
  z4 = y / 1000;
  z3 = (y - 1000 * z4) / 100;
  z2 = (y - 1000 * z4 - 100 * z3) / 10;
  l[0] = x[z1];
  l[1] = x[z2];
  l[2] = x[z3];
  l[3] = x[z4];
}

void setup() {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  for (int i = 0; i < 4; i++) {
  pinMode(s[i], OUTPUT);
  digitalWrite(s[i], LOW);
  }
}

void loop() {
  n++;
  if (n == 10000) {
    n = 0;
  }
  led(n);
  delay(100);
}

void yield() {
  for (int i = 0; i < 4; i++) {
    PORTD = l[i];
    digitalWrite(g, l[i] & 1);
    digitalWrite(s[i], HIGH);
    delayMicroseconds(dutyH);
    digitalWrite(s[i], LOW);
    delayMicroseconds(dutyL);
  }
}

Подключение нескольких цифровых семи-сегментных индикаторов.

Коммутационная матрица

Подключение четырёх кнопок