Сегментный дисплей - PullRequest
       9

Сегментный дисплей

0 голосов
/ 22 ноября 2018

Я надеюсь, что кто-то может помочь мне в этом, я в полной растерянности и не знаю, что мне нужно изменить.Я собрал этот код по частям из других примеров, которые я видел.Я пытаюсь заставить дисплей отображать слово «Конец», как только время обратного отсчета завершит свой цикл, я просто не понимаю код для внесения каких-либо дальнейших изменений в часть дисплея.

Это в основном то, чтокод делает.Я использую поворотный регулятор и вставляю время, нажимаю поворотный переключатель, и таймер начинает обратный отсчет во время отображения значения на 4-значном 7-сегментном дисплее трубки.В конце обратного отсчета пробирка становится пустой, вместо пустого я хочу отобразить слово «Конец», как я могу сделать это возможным?

Я знаю, что подвох находится в функции setDigit (), но яЯ ничего не знаю о работе с 7-сегментным дисплеем, это мой первый раз.

const int PinCLK = 3;  // Rotary CLK signal
const int PinDT = 2;   // Rotary DT signal
const int PinSW = 0;   // Rotary switch
int lastCount = 0;
volatile int virtualPosition = 0;
int timeCount = 0;  // count in tenths of seconds
int sequence_Num = 0;

char disp[4];
const int PinSCLK = 10;
const int PinRCLK = 11;
const int PinDIO = 12;
int Display[4];
unsigned long prev = 0;
unsigned long waitMS = 0;

void isr()
{
  static unsigned long lastInterruptTime = 0;
  unsigned long interruptTime = millis();

  // If interrupts come faster than 5
  if(interruptTime - lastInterruptTime > 5)
  {
    if(digitalRead(PinDT) == LOW)
    {
      virtualPosition = virtualPosition+10;
    }
    else
    {
      virtualPosition = virtualPosition-10;
    }

    virtualPosition = min(1000, max(0, virtualPosition));
  }

  lastInterruptTime = interruptTime;  // Keep track of when we were here last (no more than every 5ms)
}

void displayCount()
{
  showDisplay();
  for(int i = 0; i < 4; i++)
  {
    setDigit(i, Display[i]);
  }
}

void setDigit(int dig, int character)
{
  //  0   1  2  3 4 5 6 7    for 8 digit array
  int digits[] = {128, 64, 32, 16, 8, 4, 2, 1};

  // 21 items character set (0-9)0-9, (10-19)0.-9., (72)- (73) space
  int characters[] = {3, 159, 37, 13, 153, 73, 65, 31, 1, 9, 2, 158, 36, 12, 152, 72, 64, 30, 0, 8, 255};

  digitalWrite(PinRCLK, LOW);
  shiftOut(PinDIO, PinSCLK, LSBFIRST, characters[character]);
  shiftOut(PinDIO, PinSCLK, LSBFIRST, digits[dig]);
  digitalWrite(PinRCLK, HIGH);
}

void showDisplay()
{
  for(int i = 0; i < 4; i++)
  {
    int val = disp[i];
    if ((val >= 32) && (val <= 47))
    {
      switch(val)
      {
        case 45 : val = 20;
          break;
          default : val = 20;
          break;
      }
    }
    else if ((val >= 48) && (val <= 57))
    {
      val -= 48;
    }
    Display[i] = val;
  }
}

void wait(unsigned long milsec)
{
  prev = millis();
  waitMS = milsec;
}

void showText(char a, char b , char c, char d)
{
  disp[0] = d;
  disp[1] = c;
  disp[2] = b;
  disp[3] = a;
}

void setTimer(bool inc)
{
    displayCount();
    if(millis() > (prev + waitMS))
    {
      if(inc)
      {
        if(timeCount = virtualPosition)
        { // NOTE: This incrementer continues to count although the display 'int period' has occured
          showText(' ', virtualPosition / 1000 % 10, virtualPosition / 100 % 10 + 10, virtualPosition / 10 % 10);
          if(timeCount < virtualPosition)
          {
            timeCount++;
          }
          wait(9); // Delay to compensates for lag to count in increments of 9 milliseconds
        }
      }
      else
      {
        if(timeCount <= virtualPosition) 
        { 
          showText(' ', (timeCount / 1000) % 10, (timeCount / 100) % 10 + 10, (timeCount / 10) % 10);
          timeCount--;
        }
        wait(9);
        if(timeCount == 0) 
        {
          timeCount = virtualPosition;
          sequence_Num = 1;
          delay(2000);
        }
      }
    }
}

void setup() 
{
  Serial.begin(9600);             // Just whilst we debug, view output on serial monitor
  pinMode(PinCLK, INPUT);        // Rotary pulses are INPUTs
  pinMode(PinDT, INPUT);         // Rotary pulses are INPUTs
  pinMode(PinSW, INPUT_PULLUP);  // use the in-built PULLUP so we don't need a resistor

  attachInterrupt(digitalPinToInterrupt(PinCLK), isr, LOW);     // Attach the routine to service the interrupts
  pinMode(PinRCLK, OUTPUT);  // latch
  pinMode(PinDIO, OUTPUT);
  pinMode(PinSCLK, OUTPUT);

  lastCount = virtualPosition;
  sequence_Num = 1;
}

void loop() 
{
  // Is someone pressing the rotary switch?
  if((!digitalRead(PinSW)))
  {
    while(!digitalRead(PinSW))
    delay(9);
    sequence_Num = 2;
  }

  switch(sequence_Num)
  {
    case 1:  
      setTimer(true);
      break;
    case 2:
      setTimer(false);
      break;
  }
}

Спасибо за любую помощь и объяснения, чтобы я мог понять для дальнейшего использования.

Спасибо

...