Увлекательная электронная логическая игра-головоломка “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.