Страница 1 из 2

Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 14:29:47
unalex
Имеется матрица клавиш(64шт), соединенная к контроллеру(PIC)

Задача: опросить динамически клавиши и выдать при нажатии клавиши код b'1xxxxxxx', при отпускании - b'0xxxxxxx', где xxxxxxx - код самой клавиши

например, нажали клавишу №3 - получили b'10000011'
далее(не отпуская кнопку №3) нажали кнопку №1 - получили b'10000001'
отпускаем кнопку №3 - получаем b'00000011'
отпускаем кнопку №1 - b'00000001'

покажите пример на С, как такое можно осуществить

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 14:59:21
vovik15
ну напримае,если на линии присутствует уровень,значет конопка нажата,или отпущена,
а дальше сравниваем,если нажата,присваиваем нужный код,а если не нажата,присваиваем другой нужный код

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 15:21:52
Yftul
Я это делал следующим образом.

Заводил матрицу X на Y элементов. При сканировании инкрементировал ячейки матрицы, соответствующую нажатым клавишам и обнулял остальные. При превышении некоторого лимита значения ячейки(зависит от аппаратной реализации, важно чтобы кнопка к тому моменту была непрерывно нажата в течении 20-30 мс для устранения дребезга) выдавался код нажатия клавиши. При превышении некоторого другого, большего лимита значения выдавался код повтора. При сбросе значения элемента матрицы после значения, превышающего первый лимит выдается код отпускания. Сканирование должно проводиться в прерывании например таймера, чтобы обработка клавиатуры была прозрачна для системы.

Код на С не привожу по некоторым причинам, однако алгоритм приведенный выше весьма несложно реализовать самому.

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 22:13:21
Negor
А вы взяли во внимание, что при нажати двух определённых клавиш(которые на одной строке или одном столбце) МК не различит повторного нажатия.

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 22:39:01
vovik15
а может быть и не требуется раздичать 2 одновременно нажатых кнопки

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 22:56:07
Negor
далее(не отпуская кнопку №3) нажали кнопку №1 - получили b'10000001'
судя из этой фразы - требуется

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 23:02:20
vovik15
тогда придется применять более сложный алгоритм опроса клавиатуры

Re: Код клавиши при нажатии и отпускании

Добавлено: Пн июл 05, 2010 23:57:32
Yftul
Negor писал(а):А вы взяли во внимание, что при нажати двух определённых клавиш(которые на одной строке или одном столбце) МК не различит повторного нажатия.
Ммм) я понимаю, что вопрос не к предложенному мною алгоритму относится) ему фиолетово сколько кнопок нажато, хоть все сразу :tea:
Естесственно при корректном построении аппаратной части.

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 17:54:24
unalex
пока я вижу такой вариант
держим в памяти массив из 64 нулей(0 отпущена, 1 нажата), контроллер циклически опрашивает клавиатуру и сравнивает состояние текущей клавиши с тем что находится в массиве, если не совпадают, выдать индекс массива и изменить значение переменной на текущее, если совпадают, значит состояние клавиши не изменилось

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 18:31:06
Yftul
Гм) В Вашем варианте не будет защиты от дребезга, да и выдавать Вам нужно не просто индекс массива(код клавиши), а с соответствующей маской нажатия либо отпускания.

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 18:32:25
zhu4er
unalex писал(а):пока я вижу такой вариант
держим в памяти массив из 64 нулей(0 отпущена, 1 нажата), контроллер циклически опрашивает клавиатуру и сравнивает состояние текущей клавиши с тем что находится в массиве, если не совпадают, выдать индекс массива и изменить значение переменной на текущее, если совпадают, значит состояние клавиши не изменилось
Это слишком долго в программном варианте! Делать нужно не так... Берём расширители портов 4шт по 16 выводов = 64 клавиши... улавливаете мысль?

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 18:43:51
Yftul
Вариант не подходит под условие задачи, так как при одновременном нажатии двух и более клавиш "расширитель" перестанет выполнять свои функции.

Если конечно под "расширителем" вы понимали шифратор)

Если же мультиплексор, то все равно при таком количестве входов слишком сложно в аппаратном смысле. Программное сканирование куда проще и дешевле. Можно даже поставить отдельный процессор на клавиатуру и завязать его например по SPI для упрощения отладки.

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 19:14:54
zhu4er
Yftul писал(а):Вариант не подходит под условие задачи, так как при одновременном нажатии двух и более клавиш "расширитель" перестанет выполнять свои функции.

Если конечно под "расширителем" вы понимали шифратор)

Если же мультиплексор, то все равно при таком количестве входов слишком сложно в аппаратном смысле. Программное сканирование куда проще и дешевле. Можно даже поставить отдельный процессор на клавиатуру и завязать его например по SPI для упрощения отладки.
А вот последнее будет намного лучше :))

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 19:19:34
unalex
пытаюсь проанализировать ваши ответы

1 расширители
что имеется ввиду? дешифратор, мультиплексор, сдвиговый регистр или спец. микросхемы)

честно говоря хотелось обойтись простой матрицей клавиатуры 8х8(16 ног контроллера) без лишнего железа

2 насчет дребезга контактов
я так понимаю при динамическом опросе клавиш, программно реализовать защиту от дребезга не получится?

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 20:45:08
Yftul
Почему же не получится? Всего лишь необходимо нажатие фиксировать после некоторой выдержки. У меня это время составляет обычно 20-30 мс.

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 21:29:15
neon-f
выдать при нажатии клавиши код b'1xxxxxxx', при отпускании - b'0xxxxxxx', где xxxxxxx - код самой клавиши
а как вы собрались семью битами закодировать 64 варианта??

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 22:33:10
Yftul
2^7 = 128, или у Вас другая арифметика? :shock:

Re: Код клавиши при нажатии и отпускании

Добавлено: Вт июл 06, 2010 23:27:07
neon-f
компиляторы и то глючит, что же вы от живого человека хотите :)) сори.

вот как то так тогда. дребезг и прочее сам добавишь. главное принцип надеюсь ясен. кнопки на порт В И С.
переменная byt содержит то что вам нужно.

Код: Выделить всё

 unsigned char x=0b10000000;
unsigned char byt;
 while(1)
{
 PORTB=x;

switch (x)
        {
        case  0b00000001: 
                        switch (PINC);  
                        case  0b11111110: byt=128;break;
                        case  0b11111101: byt=129;break;       
                        case  0b11111011: byt=130;break;       
                        case  0b11110111: byt=131;break;
                        case  0b11101111: byt=132;break;
                        case  0b11011111: byt=133;break;       
                        case  0b10111111: byt=134;break;       
                        case  0b01111111: byt=135;break;
                        default byt=byt-127;
                        break;
        case  0b00000010: 
                        switch (PINC);  
                        case  0b11111110: byt=136;break;
                        case  0b11111101: byt=137;break;       
                        case  0b11111011: byt=138;break;       
                        case  0b11110111: byt=139;break;
                        case  0b11101111: byt=140;break;
                        case  0b11011111: byt=141;break;       
                        case  0b10111111: byt=142;break;       
                        case  0b01111111: byt=143;break;
                        default byt=byt-127;
                        break;
        case  0b00000010: 
        case  0b00000100: 
        case  0b00001000: 
        case  0b00010000: 
        case  0b00100000: 
        case  0b01000000: 
        case  0b10000000:
                        switch (PINC);  
                        case  0b11111110: byt=248;break;
                        case  0b11111101: byt=249;break;       
                        case  0b11111011: byt=250;break;       
                        case  0b11110111: byt=251;break;
                        case  0b11101111: byt=252;break;
                        case  0b11011111: byt=253;break;       
                        case  0b10111111: byt=254;break;       
                        case  0b01111111: byt=255;break;
                        default byt=byt-127;
                        break;
        }
        
        x=>>;   if (x==0)  x=0b10000000; 
}

Re: Код клавиши при нажатии и отпускании

Добавлено: Ср июл 07, 2010 01:08:15
unalex
neon-f писал(а):главное принцип надеюсь ясен
пытаюсь проанализировать данный код в уме, я так понял такой метод не может опознать нажатие нескольких клавиш(хочу играть аккордами))? или я не до конца разобрался?

Re: Код клавиши при нажатии и отпускании

Добавлено: Ср июл 07, 2010 01:11:30
unalex
пока отвлекусь от программирования, учеба-зараза мешает
в пятницу сдам последний экзамен и снова вернусь к этому интересному занятию