Прошу помощи в написании скетча для следующей задачи: Есть 4-разрядный 7-сегментный индикатор, подключенный через сдвиговый регистр 74HC595N и четыре кнопки. При запуске отображаются цифры, напр. 1234. Нужно сделать так, чтобы: - при нажатии на первую кнопку менялся первый разряд на +1 (т.е. 2234, ещё раз нажали - 3234 и т.д. - 9234 затем 0234; - при нажатии на вторую кнопку - второй разряд +1 (т.е. 1334, 1434 и т.д.), - при нажатии на третью - 3 разряд (1244, 1254, 1264 и т.д), - и на четвёртую - 4 разряд (1235, 1236 и т.д.). После цифры 9 снова 0, т.е. не должно происходить суммирование к следующему разряду. После набора некоторой переменной присваивается полученное итоговое четырёхзначное число.
Для одного разряда понятно как, а вот передать данные shiftOut для следующего разряда, чтобы не сдвигались другие - не понятно.
Хотя уже примерно понял как - можно просто математическим делением на разряды и выводить один итоговый результат.
чтоб не сдвигались - никак. При изменении любого разряда придется выводить все. После того как поймешь это - проблем нет, задачка простейшая
Всё получилось! Код (C++): #include "Timer.h" Timer t; //создание объекта Timer int number = 1234; int first_digit = 0; int second_digit = 0; int third_digit = 0; int fourth_digit = 0; int data = 4; int latch = 5; int clk = 6; int OK_1 = 12; int OK_2 = 11; int OK_3 = 10; int OK_4 = 9; int count = 0; int BUTTON_PIN1 = 13; int BUTTON_PIN2 = 8; int BUTTON_PIN3 = 7; int BUTTON_PIN4 = 3; boolean buttonWasUp1 = true; boolean buttonWasUp2 = true; boolean buttonWasUp3 = true; boolean buttonWasUp4 = true; int led = 2; int digits[4]; int CAS[4] = {12, 11, 10, 9}; byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110}; // 0 – 9 void setup() { pinMode(data, OUTPUT); pinMode(latch, OUTPUT); pinMode(clk, OUTPUT); pinMode(OK_1, OUTPUT); pinMode(OK_2, OUTPUT); pinMode(OK_3, OUTPUT); pinMode(OK_4, OUTPUT); digitalWrite(OK_1, HIGH); digitalWrite(OK_2, HIGH); digitalWrite(OK_3, HIGH); digitalWrite(OK_4, HIGH); pinMode(BUTTON_PIN1, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); pinMode(BUTTON_PIN3, INPUT_PULLUP); pinMode(BUTTON_PIN4, INPUT_PULLUP); pinMode(led, OUTPUT); digitalWrite(led, LOW); t.every(1, display_number); // прерывание по таймеру 1 мс break_number(number); } void loop() { t.update(); digitalWrite(led, LOW); if (buttonWasUp1 && !digitalRead(BUTTON_PIN1)) { delay(10); if (!digitalRead(BUTTON_PIN1)) digits[0] ++; if (digits[0] > 9) digits[0] = 0; } buttonWasUp1 = digitalRead(BUTTON_PIN1); if (buttonWasUp2 && !digitalRead(BUTTON_PIN2)) { delay(10); if (!digitalRead(BUTTON_PIN2)) digits[1] ++; if (digits[1] > 9) digits[1] = 0; } buttonWasUp2 = digitalRead(BUTTON_PIN2); if (buttonWasUp3 && !digitalRead(BUTTON_PIN3)) { delay(10); if (!digitalRead(BUTTON_PIN3)) digits[2] ++; if (digits[2] > 9) digits[2] = 0; } buttonWasUp3 = digitalRead(BUTTON_PIN3); if (buttonWasUp4 && !digitalRead(BUTTON_PIN4)) { delay(10); if (!digitalRead(BUTTON_PIN4)) digits[3] ++; if (digits[3] > 9) digits[3] = 0; } buttonWasUp4 = digitalRead(BUTTON_PIN4); number = digits[3] + digits[2]*10 + digits[1]*100 + digits[0]*1000; if (number == 5555) digitalWrite(led, HIGH); } void break_number(int num) { // деление на разряды digits[0] = num/1000; digits[1] = (num%1000)/100; digits[2] = (num%100)/10; digits[3] = num%10; } void display_number() { cathode_high(); // Выключаем индикатор digitalWrite(latch, LOW); shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //передаем данные digitalWrite(CAS[count], LOW); digitalWrite(latch, HIGH); count++; if (count == 4) count = 0; } void cathode_high() { digitalWrite(OK_1, HIGH); digitalWrite(OK_2, HIGH); digitalWrite(OK_3, HIGH); digitalWrite(OK_4, HIGH); }