В прошлом эксперименте мы научились выводить данные на LED - индикатор. Усовершенствуем немного схему и программу, что бы получить простейший секундомер, который отсчитывает и отображает секунды и будет управляться кнопкой.
int a = 8; int b = 9; int c = 11; int d = 5; int e = 4; int f = 7; int g = 6; int h = 10; int keyPin = 12; // Цифра "Один" void display1(void) { digitalWrite(b,HIGH); digitalWrite(c,HIGH); } // Цифра "Два" void display2(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(e,HIGH); digitalWrite(d,HIGH); } // Цифра "Три" void display3(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(g,HIGH); } // Цифра "Четыре" void display4(void) { digitalWrite(f,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); } // Цифра "Пять" void display5(void) { digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } // Цифра "Шесть" void display6(void) { digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); } // Цифра "Семь" void display7(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); } // Цифра "Восемь" void display8(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); } // Цифра "Девять" void display9(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(f,HIGH); } // Цифра "Нуль" void display0(void) { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); } //Очистка дисплея void clearDisplay(void) { digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(g,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); } void setup() { int i; for(i=4;i<=11;i++) pinMode(i,OUTPUT); pinMode(keyPin,INPUT); digitalWrite(h,HIGH); display0(); } int x = -1; int switchState = 0; int oldSwitchState = 0; boolean lightsOn = false; void loop() { switchState = digitalRead(keyPin); if (switchState != oldSwitchState) { oldSwitchState = switchState; if (switchState == HIGH) { lightsOn = !lightsOn; } } if(lightsOn) { delay(100); x = x + 1; } if (x == 0) {clearDisplay(); display0();} if (x == 1) {clearDisplay(); display1();} if (x == 2) {clearDisplay(); display2();} if (x == 3) {clearDisplay(); display3();} if (x == 4) {clearDisplay(); display4();} if (x == 5) {clearDisplay(); display5();} if (x == 6) {clearDisplay(); display6();} if (x == 7) {clearDisplay(); display7();} if (x == 8) {clearDisplay(); display8();} if (x == 9) {clearDisplay(); display9();} if (x > 9) {x = 0;} }
На первый взгляд программа может показаться очень сложной, но не стоит пугаться, давайте присмотримся повнимательнее.
В начале программы мы инициализируем переменные соответствующие номерам пинов к которым подключен LED - индикатор и кнопка.
Далее следуют одиннадцать функций очень похожих друг на друга. При выполнении функций display0()…display9()
на LED - индикаторе зажигаются цифры от 0 до 9, а при выполнении функции clearDisplay()
все сегменты индикатора гаснут.
В функции setup()
настраиваем пины контроллера и запускаем на выполнение функцию display0()
, что-бы на индикаторе при запуске сразу загорелся «0».
В функции loop()
прописан обработчик кнопки, который запускает или останавливает смену цифр на LED - индикаторе.
Благодаря тому, что мы отображение цифр вынесли в отдельные функции, основной цикл программы более прост и легче читаем. Кроме того при допущении ошибки ее легче найти и исправить.
Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F
Напиши программу с аналогичным результатом используя массивы