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

 
 
> обработка повторных нажатий клавиатуры, atmega32+4x4 kbd
GoodNews
сообщение Feb 21 2010, 18:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259



Драйвер клавиатуры построен на базе атмеловского апноута AVR245. Есть одно но - повторные нажатия клавиш не могу реализовать. Т.е. теоретически представляю как это должно выглядеть, но на практике не получается. Я думал вначале использовать сравнение состояний порта клавиатуры. Т.е. при инициализации драйвера берём объявляем некоторую статическую переменную, в которую загружаем значение порта (все клавиши отпущены), затем в функции обработки клавиш считываем текущее состояние порта и сравниваем со значением по-умолчанию. Если не совпадает, то выводим значение, если совпадает - пропускаем. Также по идее должно проверяться была ли физически отпущена клавиша. Посоветуйте плиз как можно выйти из данного положения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Feb 22 2010, 02:15
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Алгоритм устранения дребезга выглядит так.
Язык описания - около Си.

CODE
unsigned char time;
void Some_timer_interrupt(void) // every 1 ms
{
time++;
}

unsigned char KEY_EVENT=0;

unsigned char key_state=0,Prev_key;
void Keyboard_task(void)
{
unsigned char key;
switch (key_state)
{
//state 0 -- wait for key press
case 0:
if (PIN()==xFF) break;
key_state=1; Prev_key=PIN();time=0;
break;
//state 1 - Убираем дребезг
case 1:
key=PIN();if (key<>Prev_key) {time=0;Prev_key=key;break;}//значение клавиатуры изменилось....
if (time>40) {if (key==0xFF) key_state=0; // ни фига - помеха проскочила....
else
{KEY_EVENT=key|0x80;key_state=2;} // ага, 40 миллисекунд клава стоит как вкопанная
};
break;
//ждем отжатия
case 2:
if (PIN()!=0xFF) {time=0;break;}// клава все еще не отжата
if (time>40) {key_state=0;KEY_EVENT=0x40};//40 миллисекунд как стабильно отжата. Можем послать сообщение //
//отжатии, а можем и не посылать. Обычно этого не требуется.
break;

}

}


Ну эта процедура вызывается время от времени. В фоновом цикле. Времени она не отъедает нисколько.

Сообщение отредактировал Omen_13 - Feb 22 2010, 05:13
Причина редактирования: Оформление кодбокса


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post



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

 


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


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