Доброго дня суток , у меня есть переборщик цифр на восьмисегментном индикаторе и пищалка на определенной цифре .Не получается сделать так что- бы перебор цифр останавливался при нажатии кнопки и запускался с той цифры на которой был остановлен . Код (C++): //указываем переменные const int FIRST_SEGMENT_PIN = 2; const int SEGMENT_COUNT = 7; const int BUZZER = 13; const int inPin = 10; //const int bt = 0; //const int val = 0; //volatile int x = 0; byte numberSegments[10] = { 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010, 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110, }; void setup(){ for (int i = 0; i < SEGMENT_COUNT; ++i){ pinMode(i + FIRST_SEGMENT_PIN, OUTPUT); } pinMode(BUZZER, OUTPUT); pinMode(inPin, INPUT); //attachInterrupt(bt, lol, RISING); } //void lol(){ //x = millis()/1000+10; //} void loop() { byte number = (millis() / 1000) % 10; static byte old_number; if (number != old_number) { old_number = number; byte mask = numberSegments[number]; for (byte i = 0; i < SEGMENT_COUNT; ++i) { boolean enableSegment = bitRead(mask, i); digitalWrite((byte)i + FIRST_SEGMENT_PIN, enableSegment); } /*{ val = digitalRead(inPin); digitalWrite(BUZZER, val); }*/ if (number==5) {tone(9,400,100) ; } if (number==9) {{ tone(9,1218,150); delay(150); tone(9,1218,300); delay(300); tone(9,1218,150); delay(300); tone(9,1046,150); delay(150); tone(9,1318,300); delay(300); tone(9,1568,600); delay(600); tone(9,784,600); delay(600); }}}}
Что конкретно за восьмисегментный индикатор? Я так понимаю, с собственным драйвером? Покажите его. А вообще проблема в том, что номер берется в зависимости от millis(), который считать продолжает независимо от того нажата кнопка или нет. Вам нужно сделать счетчик который бы пополнялся при отжатой кнопке и не изменялся при нажатой. Общая идея такая: Код (C++): unsigned long timCount; unsigned long timset; void setup() { timset = millis()+100; } void loop() { if (!digitalRead(inPin) and (millis() + 100) >= timset) { // это вместо: byte number =(millis()/1000)%10; timset = millis + 100; timCount++; } number = timCount / 10 % 10; } Не совсем понятно зачем старый номер сверяется с новым, чтобы не обновлять цифры в случае если они не изменились?
http://amperka.ru/product/7-segment-led .Вот индикатор ,проблема в том что он без драйвера . Будет ли индикатор без драйвера корректно работать без этой строки Код (C++): byte numberSegments[10] = { 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010, 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110, }; ? За подсказку большое спасибо ,буду отталкиваться от этого.