подскажите пожалуйста в чем ошибка при работе с семисигментным индикатором. имеется две кнопки (увеличение и уменьшение) и семисигментный индикатор на 4 цифры. мне необходимо при нажатии кнопки регулировать сотые доли и если больше 9 то увеличиваются десятые и т.д. как счетчик. у меня получается сотые от первый раз работают от 1 до 9, потом при каждом нажатии увеличиваются десятые доли. Код (C++): #include <Bounce.h> #define BUTTON 12 #define BUTTON1 11 #define BUTTON2 10 #define SCLK 7 // пины ардуины #define RCLK 6 #define DIO 5 Bounce bouncer = Bounce(BUTTON,5); Bounce bouncer1 = Bounce(BUTTON1,5); Bounce bouncer2 = Bounce(BUTTON2,5); byte digitBuffer[4]; int oldvrem = 0; int nanv = 0; // сотые int minv = 0; // десятые int cekv = 0; // целые void setup(){ pinMode(BUTTON,INPUT); pinMode(BUTTON1,INPUT); pinMode(BUTTON2,INPUT); pinMode(RCLK, OUTPUT); pinMode(SCLK, OUTPUT); pinMode(DIO, OUTPUT); Serial.begin(9600); } void loop(){ if ( bouncer1.update() ) { //если считано значение 1 if ( bouncer1.read() == HIGH) { oldvrem = oldvrem + 100; nanv = oldvrem / 100; } if (nanv > 9){ nanv = 0; minv = minv + 1; } if (minv > 9){ minv = 0; cekv = cekv + 1; } } if ( bouncer2.update() ) { //если считано значение 1 if ( bouncer2.read() == HIGH) { oldvrem = oldvrem - 100; nanv = oldvrem / 100; if (nanv > 9){ nanv = 0; minv = minv + 1; } if (minv > 9){ minv = 0; cekv = cekv + 1; } } } // заполняем массив digitBuffer[0] = cekv; digitBuffer[1] = minv; digitBuffer[2] = nanv; digitBuffer[3] = 0; // однократно выводим данные из массива на 7сигмент // тоесть функция должна постоянно крутится. showDisplay(); } void showDisplay(){ const byte digit[10] = { // маска для 7 сигментного индикатора 0b11000000, // 0 0b11111001, // 1 0b10100100, // 2 0b10110000, // 3 0b10011001, // 4 0b10010010, // 5 0b10000010, // 6 0b11111000, // 7 0b10000000, // 8 0b10010000, // 9 }; const byte chr[4] = { // маска для разряда 0b00001000, 0b00000100, 0b00000010, 0b00000001 }; // отправляем в цикле по два байта в сдвиговые регистры for(byte i = 0; i <= 3; i++){ digitalWrite(RCLK, LOW); // открываем защелку shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]); // отправляем байт с "числом" shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд digitalWrite(RCLK, HIGH); // защелкиваем регистры delay(1); // ждем немного перед отправкой следующего "числа" } }
Допустим, после десятого нажатия кнопки1: oldvrem = 1000, nanv = 10. Срабатывает условие nanv > 9, в результате: nanv = 0, minv = 1. Дальше, нажимаем кнопку1 еще раз, имеем: oldvrem = 1100, nanv = 11. Опять срабатывает условие nanv > 9, в результате: nanv = 0, minv = 2. Надеюсь, суть понятна?