Но теперь получается, когда find=0, срабатывает одинарное нажание всех кнопок. А когда find=1, то при одинарном нажатии на любую кнопку, все переменные Key постоянно срабатывают. Не пойму, как можно разделить так, чтобы find относился только к Key=3 и Key=4 и не затрагивал остальные кнопки?
Enigm писал(а):
Но и не вижу смысла этого делать, когда используется всего в одном месте.
Смысл есть. Все настройки проекта (вернее модуля) в виде констант с осмысленными названиями и комментариями удобно править в хидере в одном месте. А не лазать по всему коду в поисках константы. Это сейчас там она одна. А когда их 50? Даже пусть по одному разу встречаться будут. Незадефайненная константа в тексте может быть только одна - это 0.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Барсик писал(а):.....как отличить короткое нажатие от длинного.
Интересный пример, буду пробовать! Что будет не ясно-напишу.
С кодом разобрался, приспособил под себя. Отрабатывает и одиночное нажатие, и повтор, но только если удерживаешь кнопку. Я, так думаю, что и с АЦП получится. Но есть один нюанс. Как сделать, чтобы при одиночном нажатии на кнопку и включенной переменной find=1, кнопка отрабатывалась постоянно до изменения find (find=0)? Пробовал цикл while, но потом, почему то, не могу из него выйти. И вставлял его в разные участки кода. Фрагмент переделанного кода:
void Tuner (void)
{
work=Key;
switch(work){
case 3:{ // увеличение частоты
//-------- Это для двух диапазонного
if(FFreq<=7400)StepFreq=3;
if(FFreq>=8750)StepFreq=5;
if(FFreq==7400){FFreq=8750;StepFreq=5;}
if(FFreq>=10800)FFreq=6576;// некрасиво, но КОРОТКО
FFreq=FFreq+StepFreq;
DLL_Freq(FFreq,StepFreq);
ShowFreq(FFreq);
work=0;
break;}
Остальное не менял.
И, попутно, вопрос: с точки зрения загрузки контроллера и быстродействия что предпочтительней, обработка кнопок через АЦП, или через порты?
И еще, на какой тактовой частоте лучше работать, 8 или 16мГц? Просто в Протеусе при большей частоте загрузка ЦП увеличивается в 2 раза.
Может, вопросы и глупые, но на них меня "заело".
akulov писал(а):Как сделать, чтобы при одиночном нажатии на кнопку и включенной переменной find=1, кнопка отрабатывалась постоянно до изменения find (find=0)? Пробовал цикл while, но потом, почему то, не могу из него выйти.
Ну и проверяйте значение этой переменной в цикле. В чём проблема то? Кто (или что) изменяет значение этой переменной?
akulov писал(а):с точки зрения загрузки контроллера и быстродействия что предпочтительней, обработка кнопок через АЦП, или через порты?
АЦП для кнопок используют не из-за быстродействия, а когда портов не хватает. А с точки зрения быстродействия, один хрен, что ждать окончания преобразования АЦП, что ждать когда кнопки устаканятся.
while(find)
{
keyExecute(); // обработали кнопку
// тут возможно надо вставить задержку - интервал повтора обработки кнопки
// ........
// проверяем, что там с нашей переменной
if(PINA.5==0) find = 1;
else find = 0;
// пока find не ноль, будем крутиться в цикле.
// как только find = 0, то выходим из цикла.
}
Все еще воюете ?
Вот глянте проэкт в протэусе, Работает как нужно ?
Выключатель имитирует ваш сигнал find.
В архиве схема в протэусе и прошивка.
Если это то что вам нужно, то попробую вам обьяснить как это сделать.
Вобщем попробую обьяснить.
В СИ я не силен так как не воспринимаю его визуально.
А опишу логику.
Ведем новую переменную и назавем ее например ADC_off и присваиваем ей 0
создаем условие
Если ADC_off =0 то мы переходим на обработку ваших кнопок, если нет то мы обработку кнопок пропускаем.
после условия
сразу пишем чтение с порта (на который будет приходить сигнал find) в переменную find (допустим активный уровень 1)
(теперь допустим значение Key = 1 это +сканирования, а значение key=2 это - сканирования )
После чтения порта делаем условие.
Если find=1 and key=1 or find=1 and key=2 то ADC_off=1 если нет то ADC_off=0
Вот и все.
Логика такова
Как только прийдет сигнал find и будет нажата одна из двух клавиш +или - ваше ADC отключится, и перменная key зафиксируется. что будет равнятся нажатием и удерживанием кнопки.
Как только сигнал find пропадет, включится ADC считает кнопки, определит что кнопки не нажаты, и остановит счет.
Вот как то так.
Надеюсь понятно обьяяснил.
В моем примере именно так и сделанно.
Естественно это будет работать только в том случае, если переменая Key больше ни где кроме ADC не изменяется.
Где вы бесконечный цыкл увидели ?
У меня ведь работает.
У меня вобше все на лету.
Бесконечный цикл всего один, это тот в котором вся программа вертится , дополнительных нету.
вы переменную AdC_off=0 надеюсь до цыкла поставили ?
Наконец то разобрался со всеми примерами. Работают оба предложенных варианта. Узнал для себя много нового.
За помощь всем большое СПАСИБО!
Тему можно считать закрытой.