Прошу помощи.
- Войдите на сайт для отправки комментариев
Сб, 14/10/2017 - 18:00
Здравствуйте. Помогите начинающему программисту.
Есть вот такой кусок кода
void loop()
{
/* Переход меню №2 */
if(digitalRead(vvod) == HIGH && drebezg_vvod == 0)
{
millis_vvod = millis();
drebezg_vvod = 1;
}
if(digitalRead(vvod) == HIGH && millis() - millis_vvod >= 10 && button_vvod == 0)
{
button_vvod = 1;
millis_vvod = 0;
}
if(digitalRead(vvod) == HIGH && button_vvod == 1 && stop_vvod == 0)
{
vremya_vvod = millis();
stop_vvod = 1;
}
if(digitalRead(vvod) == HIGH && millis() - vremya_vvod >= 5000 && stop_vvod == 1)
{
drebezg_vvod = 0;
button_vvod = 0;
stop_vvod = 0;
menu_2();
}
/* Конец переход в меню №2 */
/* Обнуление переменных кнопки "НАЗАД" */
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
{
millis_kn_nazad = millis();
drebezg_kn_nazad = 0;
}
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 10)
{
millis_kn_nazad = 0;
button_kn_nazad = 0;
}
/* Конец обнуления переменных кнопки "НАЗАД" */
}
void menu_2()
{
menu_2:
/* Переход в меню "КАЛИБРОВКИ" */
if(digitalRead(vvod) == HIGH && lcd_blink == 4 && drebezg_vvod == 0)
{
millis_vvod = millis();
drebezg_vvod = 1;
}
if(digitalRead(vvod) == HIGH && lcd_blink == 4 && drebezg_vvod == 1 && millis() - millis_vvod >= 10)
{
drebezg_vvod = 0;
millis_vvod = 0;
lcd_ = 0;
kalibrovki();
}
/* Конец перехода в меню "КАЛИБРОВКИ" */
/* Переход в "МЕНЮ №1" */
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 0 && button_kn_nazad == 0)
{
millis_kn_nazad = millis();
drebezg_kn_nazad = 1;
}
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 0 && millis() - millis_kn_nazad >= 10)
{
millis_kn_nazad = 0;
button_kn_nazad = 1;
}
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
{
lcd_ = 0;
return;
}
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
{
millis_kn_nazad = millis();
drebezg_kn_nazad = 0;
}
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 10)
{
millis_kn_nazad = 0;
button_kn_nazad = 0;
}
/* Конец перехода в "МЕНЮ №1" */
goto menu_2;
}
/* Конец Меню №2 */
void kalibrovki()
{
kalibrovki:
/* Переход в "МЕНЮ №2" */
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 0 && button_kn_nazad == 0)
{
millis_kn_nazad = millis();
drebezg_kn_nazad = 1;
}
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 0 && millis() - millis_kn_nazad >= 10)
{
millis_kn_nazad = 0;
button_kn_nazad = 1;
}
if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
{
lcd_ = 0;
return menu_2();
}
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
{
millis_kn_nazad = millis();
drebezg_kn_nazad = 0;
}
if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 50)
{
millis_kn_nazad = 0;
button_kn_nazad = 0;
}
/* Конец перехода в "МЕНЮ №2" */
goto kalibrovki;
}
Проблемы у меня возникли с возвратом из МЕНЮ КАЛИБРОВКИ (void kalibrovki() ) в МЕНЮ №2 (menu_2). Меня выкидывает в начало программы ( void loop() ), и что мне делать я незнаю.
Меня выкидывает в начало программы ( void loop() ), и что мне делать я незнаю.
ничего не делать - так и должно быть.
Да... Но как-бы хочется возвращаться в предедущее меню а не вначало. Ведь для того чтоб перейти из меню №1 в меню №2 мне приходится держать кнопку ВВОД 5 сек.
Ведь для того чтоб перейти из меню №1 в меню №2 мне приходится держать кнопку ВВОД 5 сек.
а, кто обещал, что будет легко? - держи кнопку.
Клапауций 112, я знаю что Вы на этом форуме ДИНОЗАВР. Неужели нет решения моей проблемы?
Клапауций 112, я знаю что Вы на этом форуме ДИНОЗАВР. Неужели нет решения моей проблемы?
нет - ты обречён попадать в главный цикл всегда.
Пипец. Жаль.
А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))
enum Menu_t {UNO = 1, DUE, TRE, QUATTRO}; Menu_t Men_stat = UNO; void Menu1() { Serial.println(); Serial.print("UNO"); } void Menu2() { Serial.println(); Serial.print("DUE"); } void Menu3() { Serial.println(); Serial.print("TRE"); } void Menu4() { Serial.println(); Serial.print("QUATTRO"); } void setup() { Serial.begin(9600); } void loop() { delay (1000); if (Men_stat == UNO) { Menu1(); } if (Men_stat == DUE) { Menu2(); } if (Men_stat == TRE) { Menu3(); } if (Men_stat == QUATTRO) { Menu4(); } }А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))
enum Menu_t {UNO = 1, DUE, TRE, QUATTRO}; Menu_t Men_stat = UNO; void Menu1() { Serial.println(); Serial.print("UNO"); } void Menu2() { Serial.println(); Serial.print("DUE"); } void Menu3() { Serial.println(); Serial.print("TRE"); } void Menu4() { Serial.println(); Serial.print("QUATTRO"); } void setup() { Serial.begin(9600); } void loop() { delay (1000); if (Men_stat == UNO) { Menu1(); } if (Men_stat == DUE) { Menu2(); } if (Men_stat == TRE) { Menu3(); } if (Men_stat == QUATTRO) { Menu4(); } }Попробую поколдую. Но как я заметил у меня обнуляются переменные, которые должны обнуляться при отпускании кнопки НАЗАД. Получается я попадаю сначала в меню№2, а затем в меню№1.
А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))
enum Menu_t {UNO = 1, DUE, TRE, QUATTRO}; Menu_t Men_stat = UNO; void Menu1() { Serial.println(); Serial.print("UNO"); } void Menu2() { Serial.println(); Serial.print("DUE"); } void Menu3() { Serial.println(); Serial.print("TRE"); } void Menu4() { Serial.println(); Serial.print("QUATTRO"); } void setup() { Serial.begin(9600); } void loop() { delay (1000); if (Men_stat == UNO) { Menu1(); } if (Men_stat == DUE) { Menu2(); } if (Men_stat == TRE) { Menu3(); } if (Men_stat == QUATTRO) { Menu4(); } }Всё равно выкидывает в начало кода. Хоть бери и ставь для каждого меню свою кнопку.
Неужели нет решения моей проблемы?
Есть. Изучить язык на котором Вы пытаетеьс писать.
Например, в строке 45 у Вас написано "
voidmenu_2()", а в строке 115 написано "returnmenu_2();". Вы понимаете что это означает? Если понимаете, что, что по-Вашему? А если не понимаете, то нафига писали?Вы вваливаетесь в бесконечный рекурсию и рано или поздно всё кончается плохо.
И выбрасывает Вас вовсе в начало loop, Вас выбрасывает в setup (вернее, в перезагрузку). Поставьте там какую-нибудь печать в Сериал и убедитесь.
Неужели нет решения моей проблемы?
Есть. Изучить язык на котором Вы пытаетеьс писать.
Например, в строке 45 у Вас написано "
voidmenu_2()", а в строке 115 написано "returnmenu_2();". Вы понимаете что это означает? Если понимаете, что, что по-Вашему? А если не понимаете, то нафига писали?Вы вваливаетесь в бесконечный рекурсию и рано или поздно всё кончается плохо.
И выбрасывает Вас вовсе в начало loop, Вас выбрасывает в setup (вернее, в перезагрузку). Поставьте там какую-нибудь печать в Сериал и убедитесь.
Я в самом начале писал.
Ни фига себе!
Я Вам сказал в какой строке у Вас ошибка (прямо номер назвал) и в чём она состоит, сказал к чему это приводит ("программа вваливается в бесконечную рекурсию"), посоветовал почитать про язык и Вы считаете. что я Вам не помогаю?
Стесняюсь спросить, а какой именно помощи Вы тогда ждёте, если указание на строку с ошибкой для Вас не помощь? Чего Вы ждёте? Как Вам можно помочь?
Как Вам можно помочь?
его можно сбросить в пропасть с голодными тиграми. ¯\_(ツ)_/¯
Я Вам сказал в какой строке у Вас ошибка (прямо номер назвал) и в чём она состоит, сказал к чему это приводит ("программа вваливается в бесконечную рекурсию"), посоветовал почитать про язык
И чо? Благодарности ждал? А хто будет
минет делатьготовый код писать?Ну, да, разве что
минет делатьготовый код писать. Тут у меня действительно недоработка.В военных училищах, которые лейтенантиков выпускают, и тех - сразу в войска, есть поговорка: "Куда солдата ни целуй - у него везде жопа!". О том, что якобы"доброе" отношение к солдатне - никогда не будет оценено адекватно.
Вот и с новичками тоже самое....
Тут у меня действительно недоработка.
Ну, хорошо, хоть признал, а то некоторые как упрутся рогом.
Какое доброе отношение к новичкам. Вы что забыли "методику". Новичка сначало надо утопить. А вот те кто всплывут с тем и работать. Программирование и схемотехника это нервные дисциплины. И те кто не выдерживают наброс говен, с этой отрасли не смогут работать , даже если это хобби.
Уважаемый ЕвгенийП, я конечно извиняюсь за свои слова и благодарен вам за то что Вы указали на мои ошибки, но дело в том что у меня, тупо, нет времени читать о языке и ждал что мне не только укажут на мои ошибки и объяснят почему неправельно, а и покажут как правильно ну и повозможности объяснят что при этом происходит. Ну или указали где можно почи тать о языке.
Почитать о языке, пожалуйста:
1. Совсем для чайников
2. Для нормального освоения - 1
3. Для нормального освоения - 2
Т.е. сделают за Вас и объяснят почему сделано так, а не иначе. Нет проблем, но только Вы братились не в томт раздел форума. Делают правильно и объясняют в другом разделе. Запостите свой запрос там и сразу укажите, что нужно сделать и подробно объяснить. Вам предложат вполне бюджетную цену и сделают. Здесь, в этом разделе, показывают ошибки, объясняют смысл ошибок, но за человека не пишут - здесь помогают тому, кто пишет сам и у кого есть время учиться свмому. У Вас ведь такого времени нет, как я понял
Собственно, понятно, что у Вас нет времени решить СВОЮ проблему. Непонятно только почему Вы считаете, что у кого-то другого есть время решать ВАШУ проблему.
А вот в том разделе у людей время есть, ибо там помогают на коммерческой основе. Не пугайтесь, судя по отдельным разговорам, которые я там читаю, цены вполне бюджетные.
Почитать о языке, пожалуйста:
1. Совсем для чайников
2. Для нормального освоения - 1
3. Для нормального освоения - 2
Большое спасибо. Буду, повозможности, штудировать предоставленное вами чтиво, потому как дюже хочется всё сделать самому.