Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Клавиатура 8x8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
BlauTood
Собственно subj:
KRS
А что собственно нужно?
Я реализую клаву так - обработчик по таймеру которые в очередь кидает коды нажатых клавишь (так и в PC сделано очередь проще всего и сделать как она в биосе была реализована еще под ДОСОМ)

Антидребезг проще всего делать не на каждую кнопку а целиком на байт (8 кнопок)

я делаю примерно так

typedef struct {
BYTE Current;
BYTE Count;
BYTE Prev;
} KbdRow;

static KbdRow KbdData[KBD_ROW_COUNT];

void KbdRowCheck(KbdRow* Row, BYTE RowVal, BYTE Code)
{
BYTE Prev;

Prev=Row->Prev;
if (RowVal==Prev) goto Skip;

if (Row->Current!=RowVal) {
Row->Count=KBD_SAME_COUNT;
Skip:
Row->Current=RowVal;
return;
}

if (!--Row->Count) {
Row->Prev=RowVal;
Prev^=RowVal;
do {
if (Prev & 1) {
FifoPut(KBD, (RowVal & 1) ? Code : Code | 0x80 );
}
Code++;
RowVal>>=1;
} while(Prev>>=1);
}
}

осталсь только вызвать KbdRowCheck на каждую строку матрицы
примерно так

static void KbdHandler(void)
{
BYTE Code;
KbdRow* Row;
Row_PORT=0xFE;
Row=KbdData;
Code=0;
do {
BYTE Tmp;
KbdRowCheck(Row,Key_PORT,Code);
Tmp=(Row1_PORT<<1)|1;
Row1_PORT=Tmp;
Row++;
Code+=8;
} while(Tmp!=0xFF);
}
-Tумблер-
Цитата(BlauTood @ Mar 16 2005, 11:30)
Собственно subj:
*


На AVR ? Возьмем два порта по 8. Порт входов и порт выходов.
Внешние подтяжки поставим. Кнопки поставим тоже. <_<
Будем сканировать порт входов, перепрограммируя поочередно биты
порта выходов в состояние "OUT 0". для этого предварительно
в регистр данных порта выходов нужно записать 0x00.
Таким образом, на битах порта выходов программно
смастерим "опын коллектор".

Такова идея. Способ подавления дребезга и вообще реализация
дело вкуса.
smile.gif
SPS
Мне попадалась клавиатура которая при нажатии на кнопку замыкала выводы не только между собой но и на землю. Подключались подтягивающие резисторы. Т.о., просто необходимо прочитать значения из 2-х 8-битных портов и если ни одна клавиша не нажата - при чтении будет (0xFFFF).
Иначе - код соответствующий данной клавише.
Если же замыкаются только 2 вывода (таких клавиатур большинство) то я солидарен с предыдущими советами.
BlauTood
мне нужно сделать анализ нажатия двух кнопок одновременно. Это обязательное условие. А еще я писать на с не умею, тока на ASME sad.gif
Alexandr
Цитата(-Tумблер- @ Mar 16 2005, 13:41)
На AVR ? Возьмем два порта по 8. Порт входов и порт выходов.
Внешние подтяжки  поставим. Кнопки поставим тоже. <_<
Будем сканировать порт входов, перепрограммируя поочередно биты
порта выходов в состояние "OUT 0". для этого предварительно
в регистр данных порта выходов нужно записать 0x00.
Таким образом, на битах порта выходов программно
смастерим "опын коллектор".
*


Алгоритм определения двух нажатых кнопок тот же, что привел -Tумблер-. Только после сканирования состояния порта входов, проводим ту же операцию, но меняем местами порт входов и порт выходов.
arttab
Может чего не понял, но все просто: матрица 8 на 8. в узлы вкл. кнопки с диодами. см. аплекейшен AVR240.pdf. там 4 на 4, но идея та же. а если помудрить, то можно еще увеличить. Одновремено понятие растижимое. можно опросить последовательно 8 рядов и считать, что опросил одновременно. для чкловека это не заметно будет.
-Tумблер-
Цитата(Alexandr @ Mar 16 2005, 14:04)
проводим ту же операцию, но меняем местами порт входов и порт выходов.
*


Не понял - всегда я был уверен, что приведенный мной пример
прзволяет диагностировать ЛЮБОЕ количество нажатых
одновременно кнопок в любых комбинациях
(за полный цикл опроса). Который (цикл опроса)
гораздо быстрее чем "нажатие-удержание-отжатие".
Полный цикл опроса, очевидно, это 8 комбинаций кодов (плавающий 0)
на регистре "выходов".
smile.gif
Цитата(arttab)
Может чего не понял...



Речь идет о том, что диоды не нужны. Попросту бессмысленны.
<_<
Alex_St
Цитата(-Tумблер- @ Mar 18 2005, 15:40)
Речь идет о том, что диоды не нужны. Попросту бессмысленны.
<_<
*



Диоды ставить ОБЯЗАТЕЛЬНО, иначе рискуешь получить КЗ выходов, а это чревато выходом из строя проца...
-Tумблер-
Цитата(Alex_St @ Mar 18 2005, 19:38)
Диоды ставить ОБЯЗАТЕЛЬНО, иначе рискуешь получить КЗ выходов..
*


Цитата(-Tумблер-Mar 16 2005 @ 12:41 )
Таким образом, на битах порта "выходов" программно
смастерим "опын коллектор".


".. Ничего то ты не понял, Иван..."
Монтажное "ИЛИ" для "опын коллектора" это нормальный режим работы.
tongue.gif
Георгий
Цитата
".. Ничего то ты не понял, Иван..."
Монтажное "ИЛИ" для "опын коллектора" это нормальный режим работы.

Попробуйте без диодов нажать несколько кнопок сразу и получите нули даже там, где их быть не должно. Диоды нужны всегда, если требуется одновременное удержание нескольких кнопок.

Это так, вдогонку.
А вопрос такой, какой комбинацией или скан-кодом включается комп с клавиатуры? В некоторых статьях упоминается CTRL + ESC, но у меня не срабатывает.
Rash
Код возбми как советовали из AVR240.pdf. Только переделай для клавы 8*8. Апликейшен путёмый. Подьяжку внутреними pull-up. Клаву которую отлавливаетвсё кнопки прилагаю в файле, там без диодов не обойтись.
andrvisht
Если еще нужно могу предложить свой вариант 4x4, вот только я его недавно на С перевел и в железе не проверял. Но на AlgBuilder работало. На всякий случай в архиве и то и другое...

Имеется возможность реакции как на нажатие "ReleaseKey" так и на отпускание "PressKey"
Клавиатура не поддерживает одновременного нажатие двух и более кнопок, код при этом
не изменяется. При нажатии конпок последовательно, первая из них выполняет роль
регистра (Shift), что позволяет расширить диапазон клавиатуры. также возможно
Shift "PressDuble" или отжатия с Shift "ReleaseDuble"
Подпрограмма может вызываться в рабочем цикле или в прерывании.
Георгий
Я уточняю вопрос: каким кодом клавиатура включает компьютер?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.