/* Пин подключения клавиатурного модуля */
#define KEYPAD_PIN A0

/* Переопределение косвенных кодов кнопок аналоговой клавиатуры */
#define KEY0       0
#define KEY1_F1    1
#define KEY2_UP    2
#define KEY3_F2    3
#define KEY4_LEFT  4
#define KEY5_OK    5
#define KEY6_RIGHT 6
#define KEY7_F3    7
#define KEY8_DOWN  8
#define KEY9_F4    9
#define KEY_ENT    10
#define KEY_ESC    11
#define KEY_NONE   12 //Когда ни одна кнопка не нажата

/* Объявляем прототип объекта класса */
class Keypad3x4
{
        /* Пин подключения */
        int Pin;
        /* Контроль состояния кнопок, подавляем дребезг */
        int currentButtonState, previousButtonState;
        /* Маркер нажатия */
        bool KeyIsPressed = false;
        /* Подавление дребезга контактов */
        int DebounceKey(int Code, int _last);
    public:
        /* Конструктор класса */
        Keypad3x4(int _pin);
        /* Обработчик события нажатия */
        bool KeyPressed();
        /* Возвращаем код нажатой кнопки */
        int getKeyCode();
};

/* Создаём объект myKeypad класса Keypad3x4 */
/* Передаём в конструктор номер пина подключения */
Keypad3x4 myKeypad(KEYPAD_PIN);

void setup()
{
    /* Открываем соединение для монитора порта */
    Serial.begin(9600);
}

void loop()
{
    /* Если было событие нажатия - вызываем обработчик, передаём код нажатой кнопки */
    if(myKeypad.KeyPressed())
        myKeypadPressEvent(myKeypad.getKeyCode());
}

/* Функция обработчик событий нажатия */
void myKeypadPressEvent(uint8_t KeyCode)
{
    switch(KeyCode)
    {
        case KEY0:
            Serial.println("Была нажата кнопка 0");
            break;
        case KEY1_F1:
            Serial.println("Была нажата кнопка 1 или F1");
            break;
        case KEY2_UP:
            Serial.println("Была нажата кнопка 2 или UP");
            break;
        case KEY3_F2:
            Serial.println("Была нажата кнопка 3 или F2");
            break;
        case KEY4_LEFT:
            Serial.println("Была нажата кнопка 4 или LEFT");
            break;
        case KEY5_OK:
            Serial.println("Была нажата кнопка 5 или OK");
            break;
        case KEY6_RIGHT:
            Serial.println("Была нажата кнопка 6 или RIGHT");
            break;
        case KEY7_F3:
            Serial.println("Была нажата кнопка 7 или F3");
            break;
        case KEY8_DOWN:
            Serial.println("Была нажата кнопка 8 или DOWN");
            break;
        case KEY9_F4:
            Serial.println("Была нажата кнопка 9 или F4");
            break;
        case KEY_ENT:
            Serial.println("Была нажата кнопка ENT");
            break;
        case KEY_ESC:
            Serial.println("Была нажата кнопка ESC");
            break;
    }
}

/* Здесь и далее - функции класса Keypad3x4 */
/* Конструктор класса */
Keypad3x4::Keypad3x4(int _pin){ Pin = _pin; }

/* Подавление дребезга контактов при нажатии кнопок */
int Keypad3x4::DebounceKey(int Code, int _lastValue)
{
    int _nextValue = getKeyCode();
    if(_nextValue != _lastValue)
    {
        delay(15);
        _nextValue = getKeyCode();
    }
return _nextValue;
}

/* Обработчик событий нажатия - возвращаем состояние маркера KeyIsPressed */
bool Keypad3x4::KeyPressed()
{
    currentButtonState = DebounceKey(getKeyCode(), previousButtonState);
    if(currentButtonState != KEY_NONE)
    {
        if(currentButtonState != previousButtonState)
            KeyIsPressed = true;
        else
            KeyIsPressed = false;
    }
    previousButtonState = currentButtonState;
    return KeyIsPressed;
}

/* Получение кода нажатой кнопки */
int Keypad3x4::getKeyCode()
{
    int buttonValue = analogRead(Pin);

    if(buttonValue < 480)
        return KEY_NONE;
    else if(buttonValue < 500 && buttonValue > 480)
        return KEY_ESC;
    else if(buttonValue < 520 && buttonValue > 500)
        return KEY0;
    else if(buttonValue < 550 && buttonValue > 530)
        return KEY_ENT;
    else if(buttonValue < 580 && buttonValue > 560)
        return KEY3_F2;
    else if(buttonValue < 610 && buttonValue > 590)
        return KEY6_RIGHT;
    else if(buttonValue < 650 && buttonValue > 630)
        return KEY9_F4;
    else if(buttonValue < 690 && buttonValue > 670)
        return KEY2_UP; 
    else if(buttonValue < 740 && buttonValue > 720)
        return KEY5_OK; 
    else if(buttonValue < 800 && buttonValue > 780)
        return KEY8_DOWN; 
    else if(buttonValue < 860 && buttonValue > 840)
        return KEY1_F1; 
    else if(buttonValue < 940 && buttonValue > 920)
        return KEY4_LEFT; 
    else if(buttonValue < 1024 && buttonValue > 1015)
        return KEY7_F3;
}