реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как отловить событие "клавиша отпущена"?
Zamuhrishka
сообщение Mar 26 2011, 18:26
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 22-07-10
Пользователь №: 58 546



Есть матричная клавиатура. Процесс определения события "клавиша нажата" прост и понятен. А вот как отловить обратное событие "клавиша отпущена"? Причем еще и определить какая именно клавиша отпущена.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 26 2011, 18:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Есть такая логическая операция XOR - "исключающее ИЛИ". Результат операции лог.0, если аргументы одинаковы и лог.1, если аргументы разные. Применив побитовое XOR к переменным, отражающим предыдущее и текущее состояние матрицы клавиш, можно получить изменение в их состоянии. Ну, а уж проверка нажата или отпущена была клавиша это еще одна операция наложения маски по AND с текущими или предыдущим состоянием матрицы.
Пример.
Допустим имеем матрицу из 4-х клавиш.
Код
unsigned char preMatrix; // переменная состояния матрицы ПРЕДЫДУЩЕГО опроса
unsigned char curMatrix; // переменная состояния матрицы ТЕКУЩЕГО опроса
unsigned char press, release; //переменные результата, содержащие биты соответствующие нажатым и отжатым клавишам в матрице
press=(preMatrix^curMatrix)&curMatrix; //получение состояния клавиш, которые в предыдущем цикле опроса были НЕнажаты, а в текущем нажаты
release=(preMatrix^curMatrix)&preMatrix; //получение состояния клавиш, которые в предыдущем цикле опроса были нажаты, а в текущем отпущены

Естественно, что при этом переменные preMatrix и curMatrix должны содержать состояние матрицы уже отфильтрованное от дребезга клавиш. Ну и дальше обычный цикл с побитовым сравнением переменных press и/или release для определения какие именно клавиши были нажаты или отпущены с формированием соответствующих скан-кодов.
Код
unsigned int cntr,
unsigned char mask=0x01;
for (cntr=0; cntr<4; cntr++)
{ if ((press&mask)!=0)
  { //здесь функция формирования скан-кода НАЖАТОЙ клавиши
  }
  if ((release&mask)!=0)
  { //здесь функция формирования скан-кода ОТЖАТОЙ клавиши
  }
  mask<<=1;
}
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 26 2011, 18:43
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Zamuhrishka @ Mar 26 2011, 21:26) *
Есть матричная клавиатура. Процесс определения события "клавиша нажата" прост и понятен. А вот как отловить обратное событие "клавиша отпущена"? Причем еще и определить какая именно клавиша отпущена.

Если не знать (забыть), какая была нажата, то никак нельзя определить.
Go to the top of the page
 
+Quote Post
Zamuhrishka
сообщение Mar 26 2011, 18:53
Сообщение #4





Группа: Участник
Сообщений: 9
Регистрация: 22-07-10
Пользователь №: 58 546



rezident
Спасибо большое. Вы меня честно говоря очень просветили.) Осталось только переосмыслить все для ассемблера.)

Tanya
Да, я догадывался об этом.))) Без иронии.

Сообщение отредактировал Zamuhrishka - Mar 26 2011, 18:54
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 00:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016