#include <EEPROM.h>
int lock = 0;
const int8_t segPin[7] = {3, 4, 5, 6, 7, 8, 9};
const int8_t digPin[3] = {10, 11, 12};
int8_t disCode[3] = {64, 64, 127};
const int8_t btnPin[7] = {3, 4, 7, 5, 6, 8, 9};
const int8_t output[4] = {A0, A1, A2, A3};
bool buttonPressed, segOn, digOn, pass = false;
const uint8_t segCode[15] = {
  0b01000000, // "0"
  0b01111001, // "1"
  0b00100100, // "2"
  0b00110000, // "3"
  0b00011001, // "4"
  0b00010010, // "5"
  0b00000010, // "6"
  0b01111000, // "7"
  0b00000000, // "8"
  0b00010000, // "9"
  0b00001100, // "P"
  0b00000110, // "E"
  0b00111111, // "12" "-"
  0b01111111, // "13" "off"
  0b01000001, // "13" "U"

};
int _B = -1;
int _cd[4] = {0};
int che[4] = {0};
int apass[4] = {0};
int capass[4] = {0};
int spass[4] = {0};
int cspass[4] = {0};
bool isEqual = true;

const uint8_t ledCode[] = {
  0b01111111, // "0" "off"
  0b01111100, //"A" "1" "PRER" Wating 2,6
  0b01111101, //"B" "2" "RUN"
  0b01111011, //"C" "3" "SHOR" "cycle"
  0b01110111, //"D" "4" "Over loed"
  0b01011101, //"F" "5" "FALL" "Material" DN 0,1
  0b00111101, //"G" "6" "SUCT" "Auto Loader" UP 4,5
  0b00111111, // "0" "off"
  0b01111111, //
};
enum Loop { NONE, RUN, SETUP, SAVEPARA, ALARM, ADMIN, SAVELIMIT,};
int code, led;
Loop current = NONE;
int8_t counter = 0;
int8_t pp, ll, oo, ada, adb = 0;
const int8_t original[8] = {2, 15, 30, 3, 20, 15, 30, 3};
int8_t para[8] = {0};
const int8_t limit[8] = {10, 50, 99, 5, 60, 60, 99, 5};
#define wrong 2
#define SPEAKER 13
#define upsen A5
#define downsen A4
void setCode (int8_t one, int8_t ten, int8_t led)
{
  if (led < 0 || led > 8)led = 0;
  disCode[0] = segCode[one];
  disCode[1] = segCode[ten];
  disCode[2] = ledCode[led];
}
unsigned long _last_tone_time;
uint8_t _tone_index;
bool _playing, _F, aada = false;
#define TONE_TIME 150 /* ms on timer */
#define TONE_SPACING 25 /* ms off timer*/
static const uint16_t TONES[] = {750, 900,};
const uint16_t NUM_TONES = sizeof(TONES) / sizeof(TONES[0]);
void play() {
  if (!_playing || _last_tone_time + TONE_TIME + TONE_SPACING < millis()) {
    tone(SPEAKER, TONES[_tone_index], TONE_TIME);
    _tone_index = (_tone_index + 1) % NUM_TONES;
    _last_tone_time = millis();
  }
  _playing = true;
}

void stop() {
  noTone(SPEAKER);
  _tone_index = 0;
  _playing = false;
}
unsigned long lastPressedTime = 200;
int8_t btnRead, btn = -1;
int checkbtn() {
  for (int i = 0; i < 7; i++) {
    pinMode(btnPin[i], INPUT_PULLUP);
    delayMicroseconds(1);
    if (digitalRead(btnPin[i]) == LOW && millis() - lastPressedTime >= 200) {
      pinMode(btnPin[i], OUTPUT);
      digitalWrite(btnPin[i], !segOn);
      btnRead = btnPin[i];
      lastPressedTime = millis();
      return btnRead;
    }
    delayMicroseconds(1);
    pinMode(btnPin[i], OUTPUT);
    digitalWrite(btnPin[i], !segOn);
  }
  return -1;
}

void refresh()
{ bool _q = 0;
  int _qdata = 0;
  for (int8_t d = 0; d < sizeof(digPin); d++) {
    if (d == 2 && disCode[2] == 127)break;
    digitalWrite(digPin[d], digOn);
    for (int8_t s = 0; s < sizeof(segPin); s++) {
      _qdata = disCode[d];
      _q = ((_qdata >> s) & 0x01) == 0x01 ;
      if ((s == 1 || s == 2 || s == 3) && d == 2 && !_q) {
        if (millis() % 800 < 400)_q = !_q;
      }
      digitalWrite(segPin[s], _q ? !segOn : segOn);
    }
    delay(4);
    digitalWrite(digPin[d], !digOn); // বর্তমান digit OFF
    for ( int8_t i = 0; i < sizeof(segPin); i++) digitalWrite(segPin[i], segOn);
    delay(1);
    if (checkbtn() != -1) btn = btnRead;
    delay(1);
    for ( int8_t i = 0; i < sizeof(segPin); i++) digitalWrite(segPin[i], !segOn);
    if ((btn == 3 || btn == 4 || btn == 7) && buttonPressed == false)asm volatile ("jmp 0");
  }
}
void over()
{
  if (!buttonPressed) {
    asm volatile ("jmp 0");
    while (1);
  }
}
void countdown(int8_t signal)
{
  int out;
  led = (signal == 0 || signal == 1) ? 5 : (signal == 4 || signal == 5) ? 6 : (signal == 2 || signal == 6) ? 1 : 2;
  out = (signal == 0) ? 0 : (signal == 1) ? 1 : (signal == 4) ? 2 : (signal == 5) ? 3 : -1;
  setCode(10, signal, led);
  unsigned long p = millis() / 1000;
  int c = para[signal] ;
  while (c >= -1) {
    refresh();
    unsigned long t = millis() / 1000;
    if (t - p >= 1)
    { p = t;
      if (c > 0 && out != -1) {
        digitalWrite(output[out], LOW);
      }
      else {
        digitalWrite(output[out], HIGH);
      }
      setCode(c / 10, c % 10, led);
      c--;
    }
  }
}
void setup() {
  pinMode(wrong, INPUT_PULLUP);
  pinMode(upsen, INPUT_PULLUP);
  pinMode(downsen, INPUT_PULLUP);
  pinMode(SPEAKER, OUTPUT);
  for (int8_t d = 0; d < sizeof(output); d++) {
    pinMode(output[d], OUTPUT);
    digitalWrite(output[d], HIGH);
  }
  for (int8_t d = 0; d < sizeof(digPin); d++) {
    pinMode(digPin[d], OUTPUT);
    digitalWrite(digPin[d], !digOn);
  }
  for (int8_t s = 0; s < sizeof(segPin); s++) {
    pinMode(segPin[s], OUTPUT);
    digitalWrite(segPin[s], !segOn);
  }
  for (int i = 0; i < 8; i++) {
    if (para[i] != EEPROM.read(i))para[i] = EEPROM.read(i);
  }
  EEPROM.update(5, 1);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(wrong), over, FALLING);
}

void loop()
{

  if (checkbtn() != -1)btn = btnRead;
  if (digitalRead(wrong) == LOW || btn == 3 || btn == 4 || btn == 7)buttonPressed = true, current = ALARM, code = (btn == 3 ? 4 : btn == 4 ? 5 : btn == 7 ? 6 : 3), led = 4, btn = -1;
  for (int i = 0; i < 8; i++) {
    if (para[i] < 0 || para[i] > limit[i])para[i] = original[i];
  }
  switch (current) {

    case NONE:
      // ক্লিয়ার সেটিং পাসওয়ার্ড
      for (int i = 0; i < 4; i++) cspass[i] = 0;
      // /////////
      if (para[0] != EEPROM.read(0))EEPROM.update(0, para[0]);
      if (btn == 9 || btn == 6) current = (btn == 9) ? SETUP : RUN, btn = -1, pp = 0;
      setCode(0, 0, 0);
      break;
    case RUN:
      if (btn == 6)current = NONE, btn = -1;
      if (digitalRead(downsen) == LOW)
      { countdown(0);
        countdown(1);
        countdown(2);
        if (digitalRead(downsen) == LOW) {
          counter++;
        }
        else {
          counter = 0;
        }
        if (counter >= para[3]) current = ALARM, code = 1, led = 3;
      }
      else if (digitalRead(upsen) == LOW)
      {
        countdown(4);
        countdown(5);
        countdown(6);
        if (digitalRead(upsen) == LOW) {
          counter++;
        } else {
          counter = 0;
        }
        if (counter >= para[7]) current = ALARM, code = 2, led = 3; // 1 mean marital short
      }
      setCode(0, 0, 2);
      break;
    case SETUP:
      isEqual = true;
      for (int i = 0; i < 4; i++) {
        if (cspass[i] != spass[i]) {
          isEqual = false;
        }
      }
      if (isEqual) {
        //ক্লিয়ার এডমিন প্যানেল পাসওয়ার্ড
        for (int i = 0; i < 4; i++) capass[i] = 0;
        if (btn == 9)current = NONE, btn = -1;
        if (btn == 6)oo = para[pp], ll = limit[pp], current = (pp == 8 ? ADMIN : SAVEPARA ), btn = -1, _B = -1, ada = 0, aada = 0;
        pp = (btn == 8) ? (pp == 8 ? (btn = -1, 0) : (btn = -1, pp + 1)) : (btn == 5) ? (pp == 0 ? (btn = -1, 8) : (btn = -1, pp - 1)) : pp;
        setCode(10, pp, 0);
      }
      else {
        passcode();
      }
      break ;
    case SAVEPARA :
      if (btn == 9)current = SETUP, btn = -1;
      oo = (btn == 8) ? (oo >= ll ? (btn = -1, 0) : (btn = -1, oo + 1)) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, oo - 1)) : oo;
      if (btn == 6) para[pp] = oo, current = SETUP, btn = -1;
      setCode(oo / 10, oo % 10, 9);
      break;
    case ADMIN:
      isEqual = true;
      for (int i = 0; i < 4; i++) {
        if (capass[i] != apass[i]) {
          isEqual = false;
        }
      }
      if (isEqual) {
        // পজিশন  0 , Set "setting password"
        if (ada == 0 && aada)
        { //// Set setting password process ///
          passcode();
        }
        else   if (ada == 1 && aada)
        {
          ///// Set parameters limited /////
          if (btn == 9)aada  = false, btn = -1, pp = 8;
          if (btn == 6)oo = limit[pp], ll = limit[pp], current = SAVELIMIT, btn = -1, _B = -1;
          pp = (btn == 8) ? (pp == 7 ? (btn = -1, 0) : (btn = -1, pp + 1)) : (btn == 5) ? (pp == 0 ? (btn = -1, 7) : (btn = -1, pp - 1)) : pp;
          setCode(10, pp, 0);
        }
        else {
          //after unlock Admin panel running
          lock = 0;
          if (btn == 9)current = SETUP, btn = -1;
          if (btn == 6)aada = true, btn = -1, pp = 0;
          ada = (btn == 8) ? (ada == 1 ? (btn = -1, 0) : (btn = -1, ada + 1)) : (btn == 5) ? (ada == 0 ? (btn = -1, 1) : (btn = -1, ada - 1)) : ada;
          setCode(14, ada, 0);
        }

        ////////    unlock process   /////////
      }
      else {
        passcode();
      }
      break;
    case SAVELIMIT:
      _B = (btn == 9) ? (_B == -1 ? (current = ADMIN, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 2 ? (btn = -1, current = ADMIN) : (btn = -1, _B + 1)) : _B;
      oo = (btn == 8) ? (oo >=ll ? (btn = -1, 0) : (btn = -1, ((_B ==1) ?((oo>=ll-10)?(ll-oo):oo+10): oo+1 ))) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, ((_B == 1&&oo>9) ? oo - 10 : oo - 1))) : oo;
      _F = millis() % 800 < 400;
      setCode((_F ? oo / 10 : (_B==0?oo/10:13)), (_F ? oo % 10 : (_B==1?oo%10:13)), 0);
     // _B = _B > 1 ? -1 : _B;

/*

_B = (btn == 9) ? (_B == -1 ? (current = ADMIN, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 2 ? (btn = -1, current = ADMIN) : (btn = -1, _B + 1)) : _B;
oo = (btn == 8) ? (oo >= ll ? (btn = -1, 0) : (btn = -1, ((_B == 1 && oo > 9) ? oo + 10 : oo + 1))) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, ((_B == 1) ? oo - 10 : oo - 1))) : oo;
_F = millis() % 800 < 400;
if (_B == 0) setCode(_F ? oo / 10 : oo / 10, _F ? oo % 10 : 13, 0);
else if (_B == 1) setCode(_F ? oo / 10 : 13, _F ? oo % 10 : oo % 10, 0);
else _B = -1, setCode(_F ? oo / 10 : 13, _F ? oo % 10 : 13, 0);

*/

      break;
    case ALARM:
      if (btn == 6)current = NONE, btn = -1, buttonPressed = false, stop();
      play();
      setCode(11, code, led);
      break;
  }
  refresh();
}
void passcode()
{ //১
  _F = (millis() % 800 < 400) ? 1 : 0;
  if (_B < 4) {
    _B = (btn == 9) ? (_B == -1 ? (current = ((current == SETUP) ? NONE : ((aada == 1) ? ADMIN : SETUP)), _B = -1, aada = 0, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 4 ? (btn = -1) : (btn = -1, _B + 1)) : _B;
    _cd[_B] = (btn == 8) ? (_cd[_B] >= 9 ? (btn = -1, 0) : (btn = -1, _cd[_B] + 1)) : (btn == 5) ? (_cd[_B] <= 0 ? (btn = -1, 9) : (btn = -1, _cd[_B] - 1)) : _cd[_B];
  }
  if (_B == 0) {
    setCode(_F ? 12 : 12, _F ? _cd[0] : 13, 0);
  }
  else if (_B == 1) {
    setCode(_F ? _cd[1] : 13, _F ? _cd[0] : _cd[0], 0);
  }
  else if (_B == 2) {
    setCode(_F ? 12 : 12, _F ? _cd[2] : 13, 0);
  }
  else if (_B == 3) {
    setCode(_F ? _cd[3] : 13, _F ? _cd[2] : _cd[2], 0);
  }

  else if (_B == 4)
  { //৪
    if (current == SETUP)
    { //setup
      isEqual = true;
      for (int i = 0; i < 4; i++) {
        if (_cd[i] != spass[i])isEqual = false;
      }
      if (isEqual) {
        _B = -1;
        for (int i = 0; i < 4; i++) cspass[i] = _cd[i];
      }
      else {
        if (_F && ++counter > 50) _B = -1, counter = 0;
        setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
      }
    } //setup

    else if (current == ADMIN)
    { //admin
      if (ada == 0 && aada)
      { //ada
        if (lock)
        { //৯
          isEqual = true;
          for (int i = 0; i < 4; i++) {
            if (che[i] != _cd[i]) isEqual = false;
          }
          if (isEqual)
          {
            setCode(_F ? 0 : 13, _F ? 0 : 13, 0);
            if (_F && ++counter > 50) {
              _B = -1, counter = 0, aada = 0, lock = 0;
              for (int i = 0; i < 4; i++)spass[i] = che[i], che[i] = 0;
              return;
            }
          }
          else  { //else ২
            setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
            if (_F && ++counter > 50) {
              _B = -1, counter = 0;
              for (int i = 0; i < 4; i++) che[i] = 0, _cd[i] = 0, _B = -1, lock = 0;
            }
          } //else ২
        }

        ///
        else {
          for (int i = 0; i < 4; i++) {
            che[i] = _cd[i];
            lock = true;
            _B = -1;
          }
        }

      } //ada
      else
      { //else

        isEqual = true;
        for (int i = 0; i < 4; i++) {
          if (_cd[i] != apass[i])isEqual = false;
        }
        if (isEqual)
        { _B = -1;
          for (int i = 0; i < 4; i++) capass[i] = _cd[i];
        }
        else {
          if (_F && ++counter > 50) _B = -1, counter = 0;
          setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
        }
      } //else

    }//admin

  } //৪
  else
  {
    _B = -1;
    counter = 0;
    for (int i = 0; i < 4; i++) _cd[i] = 0;
    setCode(_F ? 12 : 13, _F ? 12 : 13, 0);
  }
} //১

Analog ButtonBreakout
opendrainBreakout
74HC595