Увлекательная электронная логическая игра-головоломка “Flip-Flop”. Игра собрана на Arduino и содержит минимум деталей.

Нам понадобится:

  • 2 кнопки,
  • 8 светодиодов,
  • 8 резисторов на 220 Ом,
  • макетная плата,
  • плата Arduino, 
  • блок питания 4.5 — 5 Вольт. 

Идею игры предложил наш соотечественник, автор многих логических игр Сергей Полозков.

Для написания программы, мы будем использовать:

  • структуру программы для Arduino
  • функцию условного выполнения if и else
  • функции создания циклов while и for
  • битовые операции и операции сдвига 

Битовыми называют операции над цепочками битов. Основными битовыми операциями являются побитовые операции и битовые сдвиги.

Побитовые операции - это операции, которые применяются к каждому биту из цепочки битов. Основными побитовыми операциями являются побитовое отрицание bitNot, побитовая конъюнкция bitAnd, побитовая дизъюнкция bitOr и побитовая строгая дизъюнкция bitXor.

Битовые и побитовые операции изучают разделе дискретной математики, а применяют в программировании, например, в обработке сигналов. В языке C++ определены следующие операции:

Symbol   Operator
 &    Побитовое И (умножение, конъюнкция) 
 |    Побитовое ИЛИ (дизъюнкция) 
 ^    Побитовое исключающее или XOR (строгая дизъюнкция, сложение по модулю 2)
 ~    Побитовое отрицание НЕ (дополнение). Унарная операция. 
 >>    Битовый сдвиг вправо. Деление на 2
 <<    Битовый сдвиг влево. Умножение на 2

Табл. 1.

Рис. 1.

// Flip-Flop

int k = 0;

void setup() {
  DDRD  = 0b11111111;
  randomSeed(analogRead(0));
  for (int i = 0; i < 5; i++) {
    PORTD |= 1 << random(7);
  }
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
}

void loop() {
  while (digitalRead(9) and digitalRead(10)) {  }
  if (! digitalRead(9)) {
    k = (k + 1) % 8;
    for (int i = 0; i < 4; i++) {
      PORTD ^= 1 << k;
      delay(50);
    }
  }
  else {
    if (k > 3) {
      PORTD = (~PORTD & 0b00001111) | (PORTD & 0b11110000);
      PORTD ^= 1 << k;
    }
    else {
      PORTD = (PORTD & 0b00001111) | (~PORTD & 0b11110000);
      PORTD ^= 1 << k;
    }
  }
  delay(300);
}

Лист. 1.