Обработка нажатия кнопки в AVR...
Потому что я не могу понять, как можно добавить тикающий таймер в обработчик нажатия кнопки... 
- Реклама
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
http://asis-kbr.ru/forum/viewtopic.php?f=13&t=173tantrum писал(а):Как сделать так, чтобы, например, при удерживании кнопки в течении 3х секунд, выполнялся иной участок кода, чем просто при кратковременном нажатии?
Кнопка ведь опрашивается по таймеру? тогда просто считаем нужное количество опросов когда кнопка нажата непрерывно и достигнув некоторого значения считаем что кнопка нажата более 3-х секунд.
Простой рассчет: если кнопку опрашиваем каждые 10мс, то для 3 секунд надо чтобы она была нажата на протяжении 3000мс/10мс = 300 опросов.
Простой рассчет: если кнопку опрашиваем каждые 10мс, то для 3 секунд надо чтобы она была нажата на протяжении 3000мс/10мс = 300 опросов.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
А мне вот такой вариант больше понравился.
Авто повтор это и есть длительное нажатие.
http://www.kit-e.ru/articles/circuit/2007_08_170.php
Авто повтор это и есть длительное нажатие.
http://www.kit-e.ru/articles/circuit/2007_08_170.php
- Реклама
А если так, заводим переменную trig как только кнопка нажата if (!trig) {TCNT=0;count=0;trig=1;} и все в обработчике таймера скажем по совпадению увеличиваем count на 1 итак как только count=6 значит кнопка удерживается 3 сек. Как только кнопка отпущена trig=0;
Причём тут язык ? Вам уже всё разжевали (описали алгоритм), осталось только "в рот положить". Что ещё нужно ?
Если уж Вы так хорошо знаете Си, что просите конкретно для него, то перевести на него с человеческого не составит Вам никакого труда.
Если уж Вы так хорошо знаете Си, что просите конкретно для него, то перевести на него с человеческого не составит Вам никакого труда.
Алгоритм ясен и так...
Я не знаю, как это программно реализуется
Я не знаю, как это программно реализуется
вот тут на си и короткое и длинное нажатие есть в отдельной функции....
архивчик ну и как это выглядит видео работы
архивчик ну и как это выглядит видео работы
Господа Коты!
С добрым Мяу!
Я тут мимо пробегал (ну так за рыбой
), дай думаю зайду, увидел обсуждение по поводу кнопок, дребезга, нажатий.
Скажите ка, тема еще открыта?
Если еще нужно, могу выложить свой алгоритм.
С добрым Мяу!
Я тут мимо пробегал (ну так за рыбой
Скажите ка, тема еще открыта?
Если еще нужно, могу выложить свой алгоритм.
Вот тема по кнопкам - http://radiokot.ru/forum/viewtopic.php?f=61&t=79801 Можете туда выкладывать.
- Сообщения: 164
- Зарегистрирован: Чт янв 17, 2013 20:28:05
Друзья, только начинаю осваивать Си, так что не судите строго
Помогите разобрать следующий код обрабатывающий кнопки:
Конкретно для чего там else. Если я правильно понимаю, если кнопка PIND.4 нажата то устанавливаем REQUIRED_TEMP = d, u = t_max, далее если PIND.2 нажата - прибавляем температуру, если PIND.3 то уменьшаем
Спойлер
Код: Выделить всё
void getkey(void)
{
if(PIND.4 == 0)
{
REQUIRED_TEMP = d;
u = t_max;
if (PIND.2 == 0)
{
delay_ms(20);
if(PIND.2 ==0)
REQUIRED_TEMP++;
d = REQUIRED_TEMP;
}
if (PIND.3 == 0)
{delay_ms(20);
if(PIND.3 ==0)
REQUIRED_TEMP--;
d = REQUIRED_TEMP;
}
}
else
{
REQUIRED_TEMP = u;
d = t_min;
if (PIND.2 == 0)
{
delay_ms(20);
if(PIND.2 ==0)
REQUIRED_TEMP++ ;
u = REQUIRED_TEMP;
}
if (PIND.3 == 0)
{delay_ms(20);
if(PIND.3 ==0)
REQUIRED_TEMP-- ;
u = REQUIRED_TEMP;
}
}
return;
}
unsigned char fSelButton()
{
unsigned char selbut;
selbut=PIND;
selbut&=(0b00001100);
//цикл антидребезга контактов
while((PIND&0b00000000)==0b00000100 || (PIND&0b00000000)==0b00001000 || (PIND&0b00000000)==0b00010000 || (PIND&0b00000000)==0b00100000);
return selbut;
}
ужас ужас ужас. Да оно у тебя при нажатии на кнопку вжииик за 1 секунду 50 пунктов уйдёт.
раз уж использовать задержку, то я бы просто опрашивал бы кнопки каждые 100мс запоминал бы эти биты а потом строил бы условия с этими сохранёнными битами без опаски их изменения из-за дребезга. А каждый пятый или второй опрос выполнял бы действие соответствующее функции кнопки.
На каждую кнопку заведи циклический счётчик с периодом счёта 5 к примеру. Кнопка не нажата - сответствующий счётчик принудительно устанавливается в ноль. Иначе - считает в "+" в цикле самого опроса, когда он равен "1" -делаем соответствующее действие, иначе прокручиваемся дальше.
И никаких дополнитеьных действий по устранению дребезга не нужно - сам опрос с сохранением значения с интервалом 100мс гарантирует отсутствие влияния дребезга на результат.
Можно опрашивать с интервалом в 50мс и считать до 10...
раз уж использовать задержку, то я бы просто опрашивал бы кнопки каждые 100мс запоминал бы эти биты а потом строил бы условия с этими сохранёнными битами без опаски их изменения из-за дребезга. А каждый пятый или второй опрос выполнял бы действие соответствующее функции кнопки.
На каждую кнопку заведи циклический счётчик с периодом счёта 5 к примеру. Кнопка не нажата - сответствующий счётчик принудительно устанавливается в ноль. Иначе - считает в "+" в цикле самого опроса, когда он равен "1" -делаем соответствующее действие, иначе прокручиваемся дальше.
И никаких дополнитеьных действий по устранению дребезга не нужно - сам опрос с сохранением значения с интервалом 100мс гарантирует отсутствие влияния дребезга на результат.
Можно опрашивать с интервалом в 50мс и считать до 10...
Всем привет. Такой вопрос: пишу программу для устройства в AVR Studio 4, на Си. Нужно сделать так, чтобы после включения можно было включить один из 4-х режимов работы отдельной кнопкой, при этом 5-я кнопка должна останавливать работу в этом режиме и возвращать устройство в исходное состояние. И вот проблема: как реализовать это программно? Помогите кто может... Исходники прикрепляю.
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
Так кнопок 5 или 2?infinity19891 писал(а):Всем привет. Такой вопрос: пишу программу для устройства в AVR Studio 4, на Си. Нужно сделать так, чтобы после включения можно было включить один из 4-х режимов работы отдельной кнопкой, при этом 5-я кнопка должна останавливать работу в этом режиме и возвращать устройство в исходное состояние. И вот проблема: как реализовать это программно? Помогите кто может... Исходники прикрепляю.
5 кнопок. 1 - режим 1, 2 - режим 2, 3 - режим 3, 4 - режим 4, 5 - отмена и сброс. Вообще, думал сначала сделать это в виде меню на 4 кнопках, но 3 года не писал ничего, многое подзабыл.Так кнопок 5 или 2?
При наличии индикации можно вообще на одной кнопке сделать.
Короткое нажатие перебирает режимы по одному, удержание в нажатом состоянии (>1c) возвращает в начальное состояние.
Короткое нажатие перебирает режимы по одному, удержание в нажатом состоянии (>1c) возвращает в начальное состояние.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
infinity19891, а в чём, собссна, проблема то ?
Такую программищу написали, а обычный опрос вывода не можем сделать ? Бред какой-то...
Такую программищу написали, а обычный опрос вывода не можем сделать ? Бред какой-то...


