Помогите обработать долгое нажатие кнопки
- Войдите на сайт для отправки комментариев
Пт, 15/04/2016 - 12:41
ВСем привет! пытаюсь обработать матрицу клавиатуры, с кнопками разобрался по поводу длительного нажатия не могу! что не так делаю...
///////////////////////////////////////////////////////////////// // джойстик #define rows 3 #define cols 2 // номера кнопок в соответствии со схемой const byte keys[rows][cols] = { {1,4}, {2,5}, {6,3} }; const byte rowPins[rows] = {10, 9, 8}; // строки (желтый10, зеленый9, голубой8) const byte colPins[cols] = {7, 5}; // столбцы (черный7, красный5) // маски для клавиш #define MaskMediaButton 1 #define MaskRadioButton 2 #define MaskVolumeUpButton 4 #define MaskVolumeDownButton 8 #define MaskOkButton 16 #define MaskMuteButton 32 #define MaskScrollDown 64 #define MaskScrollUp 128 #define MaskFastPress 256 #define MaskLongPress 512 unsigned long startlongpresstime; bool oldpressed; ///////////////////////////////////////////////////////////////// void setup() { int i; // строки - на выход for (i = 0; i < rows; ++i) { pinMode(rowPins[i], OUTPUT); } // столбцы - на вход for (i = 0; i < cols; ++i) { pinMode(colPins[i], INPUT); digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор } // столбец для енкодера pinMode(encoderPin, INPUT); digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор oldpressed = false; } // сканирование джойстика unsigned int scan(void) { int i, j; unsigned int code = 0; bool pressed = false; for (i = 0; i < rows; ++i) { digitalWrite(rowPins[i], LOW); for (j = 0; j < cols; ++j) { if(digitalRead(colPins[j]) == false) { code |= 1 << (keys[i][j] - 1); pressed = true; } } }//конец циклов /////////////////////////////////////////////////////////////// if (pressed == true) { if (oldpressed == false) { startlongpresstime = millis(); } else { if (millis() - startlongpresstime > 1000 && (code & MaskOkButton)) // значение временного промежутка в мс { startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса code |= 512; } if (millis() - startlongpresstime < 1000 && (code & MaskOkButton) ) // значение временного промежутка в мс { startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса code |= 256; } } } oldpressed = pressed; ///////////////////////////////////////////////////////////// return code; } // цикл программы void loop() { unsigned int code; code = scan(); if (code & MaskMediaButton){ Serial.print("Source>"); Serial.println(); } if (code & MaskRadioButton){ Serial.print("Source<"); Serial.println(); } if (code & MaskVolumeUpButton){ Serial.print("VolumeUp"); Serial.println(); } if (code & MaskVolumeDownButton){ Serial.print("volumeDown"); Serial.println(); } if (code & MaskFastPress){ Serial.print("TRFast"); Serial.println(); } if (code & MaskLongPress){ Serial.print("TRLong"); Serial.println(); } if (code & MaskMuteButton){ Serial.print("Mute"); Serial.println(); } if (code & MaskScrollDown){ Serial.print("RotateDown"); Serial.println(); } if (code & MaskScrollUp){ Serial.print("RotateUp"); Serial.println(); } }
Похоже помочь не кому!(
Можно использовать прерывания в режиме CHANGE. Вызов прерывания при нажатии и отпускании кнопки. Правда при этом другими кнопками пользоваться нельзя.
Здесь есть готовый класс для работы с кнопками. Длтнное короткое нажатие, автоповтор, подваление дребезка контактов
http://samopal.pro/arduino-button-2/