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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

Имеется матрица клавиш(64шт), соединенная к контроллеру(PIC)

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

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

покажите пример на С, как такое можно осуществить
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

ну напримае,если на линии присутствует уровень,значет конопка нажата,или отпущена,
а дальше сравниваем,если нажата,присваиваем нужный код,а если не нажата,присваиваем другой нужный код
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

Я это делал следующим образом.

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

Код на С не привожу по некоторым причинам, однако алгоритм приведенный выше весьма несложно реализовать самому.
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

А вы взяли во внимание, что при нажати двух определённых клавиш(которые на одной строке или одном столбце) МК не различит повторного нажатия.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

а может быть и не требуется раздичать 2 одновременно нажатых кнопки
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

далее(не отпуская кнопку №3) нажали кнопку №1 - получили b'10000001'
судя из этой фразы - требуется
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Реклама
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

тогда придется применять более сложный алгоритм опроса клавиатуры
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

Negor писал(а):А вы взяли во внимание, что при нажати двух определённых клавиш(которые на одной строке или одном столбце) МК не различит повторного нажатия.
Ммм) я понимаю, что вопрос не к предложенному мною алгоритму относится) ему фиолетово сколько кнопок нажато, хоть все сразу :tea:
Естесственно при корректном построении аппаратной части.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

пока я вижу такой вариант
держим в памяти массив из 64 нулей(0 отпущена, 1 нажата), контроллер циклически опрашивает клавиатуру и сравнивает состояние текущей клавиши с тем что находится в массиве, если не совпадают, выдать индекс массива и изменить значение переменной на текущее, если совпадают, значит состояние клавиши не изменилось
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

Гм) В Вашем варианте не будет защиты от дребезга, да и выдавать Вам нужно не просто индекс массива(код клавиши), а с соответствующей маской нажатия либо отпускания.
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

unalex писал(а):пока я вижу такой вариант
держим в памяти массив из 64 нулей(0 отпущена, 1 нажата), контроллер циклически опрашивает клавиатуру и сравнивает состояние текущей клавиши с тем что находится в массиве, если не совпадают, выдать индекс массива и изменить значение переменной на текущее, если совпадают, значит состояние клавиши не изменилось
Это слишком долго в программном варианте! Делать нужно не так... Берём расширители портов 4шт по 16 выводов = 64 клавиши... улавливаете мысль?
Даже у стен есть уши...
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

Вариант не подходит под условие задачи, так как при одновременном нажатии двух и более клавиш "расширитель" перестанет выполнять свои функции.

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

Если же мультиплексор, то все равно при таком количестве входов слишком сложно в аппаратном смысле. Программное сканирование куда проще и дешевле. Можно даже поставить отдельный процессор на клавиатуру и завязать его например по SPI для упрощения отладки.
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

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

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

Если же мультиплексор, то все равно при таком количестве входов слишком сложно в аппаратном смысле. Программное сканирование куда проще и дешевле. Можно даже поставить отдельный процессор на клавиатуру и завязать его например по SPI для упрощения отладки.
А вот последнее будет намного лучше :))
Даже у стен есть уши...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

пытаюсь проанализировать ваши ответы

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

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

2 насчет дребезга контактов
я так понимаю при динамическом опросе клавиш, программно реализовать защиту от дребезга не получится?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

Почему же не получится? Всего лишь необходимо нажатие фиксировать после некоторой выдержки. У меня это время составляет обычно 20-30 мс.
Потрогал лапой паяльник
Сообщения: 392
Зарегистрирован: Сб дек 12, 2009 02:15:45

Сообщение neon-f »

выдать при нажатии клавиши код b'1xxxxxxx', при отпускании - b'0xxxxxxx', где xxxxxxx - код самой клавиши
а как вы собрались семью битами закодировать 64 варианта??
Вымогатель припоя
Аватара пользователя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Сообщение Yftul »

2^7 = 128, или у Вас другая арифметика? :shock:
Потрогал лапой паяльник
Сообщения: 392
Зарегистрирован: Сб дек 12, 2009 02:15:45

Сообщение 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; 
}
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

neon-f писал(а):главное принцип надеюсь ясен
пытаюсь проанализировать данный код в уме, я так понял такой метод не может опознать нажатие нескольких клавиш(хочу играть аккордами))? или я не до конца разобрался?
Последний раз редактировалось unalex Ср июл 07, 2010 01:13:21, всего редактировалось 1 раз.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

пока отвлекусь от программирования, учеба-зараза мешает
в пятницу сдам последний экзамен и снова вернусь к этому интересному занятию
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»