Всем доброго! Подскажите пожалуйста, как можно реализовать следующую задачу. Есть семь кнопок и один 7-ми сегментный индикатор с ОК, При включении платы (UNO) на индикаторе зажигается цифра "0", при нажатии кнопки №1 - загорается цифра "1", при нажатии кнопки №2 - загорается цифра "2" и так далее, при нажатии кнопки №7 происходит сброс цифр на "0".
Пока по примерам вывод (последовательный) цифр, как счетчик, а мне нужно, чтобы при нажатии кнопок выводилась определенная цифра, а как это сделать ни как не могу найти.
Код (Text): // список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора int pins[7]={2,3,4,5,6,7,8}; // значения для вывода цифр 0-9 byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11100110}; // переменная для хранения значения текущей цифры int number=0; void setup() { // Сконфигурировать контакты как выходы for(int i=0;i<7;i++) pinMode(pins[i],OUTPUT); } void loop() { showNumber(number); delay(1000); number=(number+1)%10; } // функция вывода цифры на семисегментный индикатор void showNumber(int num) { for(int i=0;i<7;i++) { if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент digitalWrite(pins[i],HIGH); else // потушить сегмент digitalWrite(pins[i],LOW); } }
Копируя примеры вы далеко не уедете. Их надо разбирать и понимать, чтобы учиться делать что-то самому. Уберите функцию счетчика, чтобы он был только на одну цифру. Потом добавите вторую кнопку на другую цифру, и так далее.
Код (C++): // список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора int pins[7]={2,3,4,5,6,7,8}; int button[5] = {9, 10, 11, 12, 13}; // значения для вывода цифр 0-9 byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11100110}; // переменная для хранения значения текущей цифры int number=0; void setup() { // Сконфигурировать контакты как выходы for(int i=0;i<7;i++) pinMode(pins[i],OUTPUT); for(int i=0; i<5; i++) pinMode(button[i], INPUT_PULLUP); } void loop() { for(int i=0; i<5; i++) if(digitalRead(button[i]) == LOW) number = i; showNumber(number); } // функция вывода цифры на семисегментный индикатор void showNumber(int num) { for(int i=0;i<7;i++) { if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент digitalWrite(pins[i],HIGH); else // потушить сегмент digitalWrite(pins[i],LOW); } }
Код (Text): int e = 6; int d = 5; int c = 4; int b = 3; int a = 2; int f = 7; int g = 8; int PinOut = 9; // пин-выход int PinIn[4] {11, 10, 13, 12}; // пины входа void setup() { pinMode(e, OUTPUT); pinMode(d, OUTPUT); pinMode(c, OUTPUT); pinMode(b, OUTPUT); pinMode(a, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode (10, INPUT); digitalWrite(10, HIGH); pinMode (11, INPUT); digitalWrite(11, HIGH); pinMode (12, INPUT); digitalWrite(12, HIGH); pinMode (13, INPUT); digitalWrite(13, HIGH); //установить выходной пин на вывод pinMode (PinOut, OUTPUT); //установить входные пины на ввод и подать на них ток for (int i = 0; i < 4; i++) { pinMode (PinIn[i], INPUT_PULLUP); digitalWrite(PinIn[i], HIGH); } displayDigit(0); } void displayDigit(int digit) { if (digit == 0) { digitalWrite(e, HIGH); digitalWrite(d, HIGH); digitalWrite(c, HIGH); digitalWrite(b, HIGH); digitalWrite(a, HIGH); digitalWrite(f, HIGH); } else if (digit == 1) { digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 2) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(g, HIGH); digitalWrite(e, HIGH); digitalWrite(d, HIGH); } else if (digit == 3) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(g, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); } else if (digit == 4) { digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 5) { digitalWrite(a, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); } else if (digit == 6) { digitalWrite(a, HIGH); digitalWrite(f, HIGH); digitalWrite(e, HIGH); digitalWrite(d, HIGH); digitalWrite(c, HIGH); digitalWrite(g, HIGH); } else if (digit == 7) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 8) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } else if (digit == 9) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } } void turnOff() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } void loop() { digitalWrite(PinOut, LOW); //подать 0 на выходной пин for (int i = 1; i <= 4; i++) // обойти цикл по кнопкам (колнкам кнопок) { if (digitalRead(PinIn[0]) == LOW) { turnOff(); displayDigit(1); } if (digitalRead(PinIn[1]) == LOW) { turnOff(); displayDigit(2); } if (digitalRead(PinIn[2]) == LOW) { turnOff(); displayDigit(3); } if (digitalRead(PinIn[3]) == LOW) { turnOff(); displayDigit(4); } } digitalWrite(PinOut, HIGH); //вернуть ток на выходной пин } Подскажите пожалуйста как этот код можно сделать более компатным