Пт янв 11, 2019 11:21:24
так же, как и у пчёлокBOB51 писал(а):Как под Си...
Пт янв 11, 2019 15:19:39
ARV писал(а):по-моему, надо просто убрать все флаги и тупо выполнять в switch-е нужное действие по коду нажатой кнопки. в этом случае надо учитывать и комбинации нажатых кнопок. при необходимости после switch-а дожидаться отпускания кнопок.
void buttons (void)
{
btns=~PIND; //читаем PIND в переменную и инвертируем прочитанное
btns=btns&((1<<BTN1)|(1<<BTN2)|(1<<BTN3)); //отсекаем лишние разряды, оставляем только кнопки
switch(btns)
{
case (1<<BTN1): //если нажата кнопка 1
if(~flags&(1<<BTN1)) //если флаг первой кнопки не установлен, то
{
flags|=(1<<BTN1); //устанавливаем флаг
toggle(RED); //что-то делаем
}
break; //и на выход
case (1<<BTN2): //если нажата кнопка 2
if(~flags&(1<<BTN2)) //если флаг второй кнопки не установлен, то
{
flags|=(1<<BTN2); //устанавливаем флаг
toggle(YELLOW); //что-то делаем
}
break; //и на выход
case (1<<BTN3): //если нажата кнопка 3
if (~flags&(1<<BTN3)) //если флаг третьей кнопки не установлен, то
{
flags|=(1<<BTN3); //устанавливаем флаг
toggle(GREEN); //что-то делаем
}
break; //и на выход
default: //если не нажата ни одна кнопка или любая другая комбинация
if (btns==0)
{
flags=0; //сбрасываем все флаги
}
else
{
flags=(1<<BTN1)|(1<<BTN2)|(1<<BTN3); //выставляем все флаги
}
break; //и на выход
}
keys=0; //сбрасываем флаг разрешения опроса кнопок
}
Пт янв 11, 2019 18:19:15
Пт янв 11, 2019 18:41:28
Пт янв 11, 2019 23:47:23
Пн фев 18, 2019 08:45:05
Пн фев 18, 2019 10:17:55
Пн фев 18, 2019 11:28:30
Чт мар 14, 2019 16:32:35
Чт мар 14, 2019 18:11:37
Чт мар 14, 2019 19:11:27
Чт мар 14, 2019 20:50:58
Чт мар 14, 2019 21:00:36
Alexeyslav писал(а):Сам опрос каждые 10мс и есть защита от дребезга
Чт мар 14, 2019 22:04:25
Пт мар 15, 2019 08:53:22
Пт мар 15, 2019 09:00:38
static void key_repeater(char kk){
MAKE_TIMER(TR, 0, 0);
static char old_kk;
if(kk == 0){
timer_stop(&TR);
} else {
if(old_kk != kk){
timer_start(&TR, 1000, 0);
put_message(QUEUE, MSG_KEY, kk, 0);
} else {
if(timeout(&TR)){
timer_start(&TR, 300, 0);
put_message(QUEUE, MSG_KEY, kk, 0);
}
}
}
old_kk = kk;
}
Сб мар 30, 2019 07:34:15
Сб мар 30, 2019 08:55:11
Сб мар 30, 2019 19:27:52
Вообще-то этот алгоритм я сочинил для обработки номеронабирателей дисковых телефонов, где-то в начале 90-х. Реализовано это было на ДВК (наша микро-ЭВМ по мотивам PDP-11). Там это была необходимость, а для энкодеров на АВР я его применил, как говорит молодежь, по приколу: увидел осциллограммы того убитого энкодера и вспомнил, что нечто подобное я видел на тех телефонах. Ну, и принял вызов.ARV писал(а):Возможно, для каких-то особо ужасных кнопок это и имеет смысл,
Да не особенно - программа, в общем-то, не сильно большая, расход оперативки - по байту на кнопку. Вот процессорное время оно таки да, кушает с аппетитом. Но, в большинстве случаев, это некритично, если не заниматься на этом же процессоре большими объемами сложных математических вычислений.ARV писал(а):но выглядит как-то уж слишком ресурсоемко.
Вообще-то эти китайские контактные энкодеры при более-менее интенсивной эксплуатации выходят из строя довольно быстро. И, если использовать этот алгоритм, менять их придется намного реже.ARV писал(а):И кто принуждает применять убитые энкодеры?!
Ср апр 10, 2019 21:56:18