Как сделать счетчик

Тема в разделе "Arduino & Shields", создана пользователем MihaSerb, 3 июл 2016.

  1. MihaSerb

    MihaSerb Нуб

    подскажите пожалуйста в чем ошибка при работе с семисигментным индикатором.
    имеется две кнопки (увеличение и уменьшение) и семисигментный индикатор на 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); // ждем немного перед отправкой следующего "числа"
      }
    }
     
  2. ostrov

    ostrov Гуру

    Вообще логика странная у счетчика. Сами написали или нашли где?
     
  3. fogary

    fogary Гик

    Допустим, после десятого нажатия кнопки1: oldvrem = 1000, nanv = 10. Срабатывает условие nanv > 9, в результате: nanv = 0, minv = 1.
    Дальше, нажимаем кнопку1 еще раз, имеем: oldvrem = 1100, nanv = 11. Опять срабатывает условие nanv > 9, в результате: nanv = 0, minv = 2.

    Надеюсь, суть понятна?