Добрый день гуру микроконтроллеров, суть в том что адаптировал под себя небольшой скетч по управлению резистивными клавишами, но потребовалось внести смену режимов кнопок. Имеем 9 клавиш, ардуино их считывает через ацп и соответственно клавишам включает цифровые выходы. Необходимо при длительном нажатии одной клавиши "сменить раскладку", тоесть задействовать другие цифровые выходы теми же кнопками. Если по считыванию длительного нажатия более менее понятно, то как при этом организовать два устойчивых режима не очень... код которым пользуюсь: Код (C++): } }
Код (C++): byte key = 0; byte mode = 1; // режим работы const byte pin[] = {3, 2, 4, 10, 9, 8, 7, 6, 5}; //прописать используемые порты(дефолт 14,12,11,10,9,8,7,6,5) const byte keys_pin = 5; #define LONG_INTERVAL 2000 // длинное нажатие кнопки #define BUTTON_NONE (analogRead (pin) > 900) #define BUTTON_9 (analogRead (pin) > 898 && analogRead (pin) < 938) #define BUTTON_8 (analogRead (pin) > 796 && analogRead (pin) < 836) #define BUTTON_7 (analogRead (pin) > 694 && analogRead (pin) < 734) #define BUTTON_6 (analogRead (pin) > 560 && analogRead (pin) < 630) #define BUTTON_5 (analogRead (pin) > 470 && analogRead (pin) < 530) #define BUTTON_4 (analogRead (pin) > 370 && analogRead (pin) < 430) #define BUTTON_3 (analogRead (pin) > 250 && analogRead (pin) < 340) #define BUTTON_2 (analogRead (pin) > 150 && analogRead (pin) < 220) #define BUTTON_1 (analogRead (pin) > 50 && analogRead (pin) < 120) void setup () { //для установки круиза на нужные кнопки поменять номера пинов на 2-set 3-res 4-on\off pinMode (A5, INPUT); // входной анализатор pinMode(3, OUTPUT); // выход 14 "Трек вперед" pinMode(2, OUTPUT); // выход 12 "Трек назад" pinMode(4, OUTPUT); // выход 11 "SRC" pinMode(10, OUTPUT); // выход 10 "Mute" pinMode(9, OUTPUT); // выход 9 "Vol+" pinMode(8, OUTPUT); // выход 8 "Vol-" pinMode(7, OUTPUT); // выход 7 "Voice" pinMode(6, OUTPUT); // выход 6 "BT off" pinMode(5, OUTPUT); // выход 5 "BT on" } byte readButtons (byte pin) { // returns the button number pressed, or zero for none pressed // int pin is the analog pin number to read int b = 0; unsigned long timestamp = millis(); // засекаем время if (BUTTON_NONE) b = 0; // buttons have not been pressed else if (BUTTON_9) b = 9; // button 9 pressed "BT on" else if (BUTTON_8) b = 8; // button 8 pressed "BT off" else if (BUTTON_7) b = 7; // button 7 pressed "Voice" else if (BUTTON_6) b = 6; // button 6 pressed "Vol-" else if (BUTTON_5) b = 5; // button 5 pressed "Vol+" else if (BUTTON_4) b = 4; // button 4 pressed "Mute" else if (BUTTON_3) b = 3; // button 3 pressed "SRC" else if (BUTTON_2) b = 2; // button 2 pressed "Трек назад" else if (BUTTON_1) b = 1; // button 1 pressed "Трек вперед" while (BUTTON_3); // проверка длинного нажатия кнопки SRC if (b == 3 && (millis() - timestamp >= LONG_INTERVAL)) { mode++; // переключаемся на следующий режим if (mode > 2) mode = 1; } return b; } void loop() { key = readButtons (keys_pin); switch (mode) // обработка режимов { case 1: switch (key) // обработка кнопок в режиме 1 { case 0://выполняется, когда var равно 0 //Тоже заменить номера пинов на нужные digitalWrite(3, LOW); //14 digitalWrite(2, LOW); //12 digitalWrite(4, LOW); //11 digitalWrite(10, LOW); //10 digitalWrite(9, LOW); //9 digitalWrite(8, LOW); //8 digitalWrite(7, LOW); //7 digitalWrite(6, LOW); //6 digitalWrite(5, LOW); //5 break; case 1://выполняется когда var равно 1 "трек вперед" digitalWrite(pin[key - 1], HIGH); break; case 2://выполняется когда var равно 2 "трек назад" digitalWrite(pin[key - 1], HIGH); break; case 3://выполняется когда var равно 3 "SRC" digitalWrite(pin[key - 1], HIGH); break; case 4://выполняется когда var равно 4 "Mute" digitalWrite(pin[key - 1], HIGH); break; case 5://выполняется когда var равно 5 "Vol+" digitalWrite(pin[key - 1], HIGH); break; case 6://выполняется когда var равно 6 "Vol-" digitalWrite(pin[key - 1], HIGH); break; case 7://выполняется когда var равно 7 "Voice" digitalWrite(pin[key - 1], HIGH); break; case 8://выполняется когда var равно 8 "BT off" digitalWrite(pin[key - 1], HIGH); break; case 9://выполняется когда var равно 9 "BT on" digitalWrite(pin[key - 1], HIGH); break; default: // выполняется, если не выбрана ни одна альтернатива // default необязателен Serial.println ("X3"); // пишет в сериал порт } // конец switch (key) для режима 1 break; // конец case 1 case 2: switch (key) // обработка кнопок в режиме 2 { case 0: break; case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; default: // выполняется, если не выбрана ни одна альтернатива // default необязателен Serial.println ("X3"); // пишет в сериал порт } // конец switch (key) для режима 1 // конец case 2 } // конец switch(mode) } // конец loop
Спасибо за участие! Данный способ блокирует исполнение этой кнопки коротким нажатием, по крайней мере протеус так думает. Если ретурн поставить до проверки длительности нажатий отрабатывает нормально, но не переключает режимы. И при переключении режима почему то нажатие на измененную кнопку залипает(тоесть раскладка первая залипает в режиме второй в high, хотя вовсе срабатывать не должно)