Оператор switch сверяет переменную со списком значений, которые называются cases(случай), находит совпадения и выполняет блок кода в том case, где это совпадение было найдено.
Switch case - переключатель.
Синтаксис:
switch (var) {
case константа:
// блок кода
break;
case константа:
// блок кода
break;
default:
// блок кода
}
Оператор break позволяет выйти из оператора swich если совпадение было найдено и нет необходимости выполнять код в остальных блоках case. Блок кода в операторах case не заключён в фигурные скобки, а оператор break является завершающим оператором блока кода оператора case.
Блок кода следующий за оператором default выполняется только тогда, когда в операторе switch не было найдено ни одного совпадения.
В следующем примере, игра «flip-flop», показано примерение функции switch case.
Для понимания программы из этого примера студентам достаточно знать типы и операции C++. Знание других, управляющих ходом выполнения программы функций, кроме switch case, не требуется.
Ниже приведена принципиальная электрическая схема электронной игры:
Рис. 1.
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
PORTD = 0b11011000;
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
delay(50);
}
Лист. 1. Выбор светодиода
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
PORTD = 0b11011000;
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
switch(led_set) {
case 0:
PORTD ^= 1;
break;
case 1:
PORTD ^= 2;
break;
case 2:
PORTD ^= 4;
break;
case 3:
PORTD ^= 8;
break;
case 4:
PORTD ^= 16;
break;
case 5:
PORTD ^= 32;
break;
case 6:
PORTD ^= 64;
break;
case 7:
PORTD ^= 128;
break;
}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 2. Инверсия выбранного светодиода
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
PORTD = 0b11011000;
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
switch(led_set) {
case 0:
PORTD ^= 128;
break;
case 1:
PORTD ^= 64;
break;
case 2:
PORTD ^= 32;
break;
case 3:
PORTD ^= 16;
break;
case 4:
PORTD ^= 8;
break;
case 5:
PORTD ^= 4;
break;
case 6:
PORTD ^= 2;
break;
case 7:
PORTD ^= 1;
break;
}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 3. Инверсия светодиода, противоположного выбранному
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
PORTD = 0b11011000;
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
switch(led_set) {
case 0:
PORTD ^= 1;
PORTD ^= 2;
PORTD ^= 4;
PORTD ^= 8;
PORTD ^= 128;
break;
case 1:
PORTD ^= 1;
PORTD ^= 2;
PORTD ^= 4;
PORTD ^= 8;
PORTD ^= 64;
break;
case 2:
PORTD ^= 32;
break;
case 3:
PORTD ^= 16;
break;
case 4:
PORTD ^= 8;
break;
case 5:
PORTD ^= 4;
break;
case 6:
PORTD ^= 2;
break;
case 7:
PORTD ^= 1;
break;
}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 4. Инверсия строки и колонки
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
PORTD = 0b11011000;
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
switch(led_set) {
case 0:
PORTD ^= 0b10001111;
break;
case 1:
PORTD ^= 0b01001111;
break;
case 2:
PORTD ^= 0b00101111;
break;
case 3:
PORTD ^= 0b00011111;
break;
case 4:
PORTD ^= 0b11111000;
break;
case 5:
PORTD ^= 0b11110100;
break;
case 6:
PORTD ^= 0b11110010;
break;
case 7:
PORTD ^= 0b11110001;
break;
}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 5. Инверсия строки и колонки
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
randomSeed(analogRead(0));
PORTD = random(2,128);
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
switch(led_set) {
case 0:
PORTD ^= 0b10001111;
break;
case 1:
PORTD ^= 0b01001111;
break;
case 2:
PORTD ^= 0b00101111;
break;
case 3:
PORTD ^= 0b00011111;
break;
case 4:
PORTD ^= 0b11111000;
break;
case 5:
PORTD ^= 0b11110100;
break;
case 6:
PORTD ^= 0b11110010;
break;
case 7:
PORTD ^= 0b11110001;
break;
}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 6. Добавлена функция random
auto kset = 9, kstart = 10, led_set = 0;
void setup() {
DDRD = 0b11111111;
randomSeed(analogRead(0));
PORTD = random(2,128);
pinMode(kset, INPUT_PULLUP);
pinMode(kstart, INPUT_PULLUP);
}
void loop() {
digitalRead(kset) ? 0 : led_set++ ;
led_set %= 8;
auto tmp = PORTD;
while(not digitalRead(kset)){
bitSet(PORTD, led_set);
delay(100);
bitClear(PORTD, led_set);
delay(100);
}
PORTD = tmp;
digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
if(led_set < 8){
PORTD ^= 1 << (7-led_set);
if(led_set < 4){
PORTD ^= 0b00001111;
}
else {
PORTD ^= 0b11110000;
}}
while(not digitalRead(kstart)){
delay(100);
}
delay(50);
}
Лист. 7. Игра написана с использованием функции if