Применение матричной клавиатуры 4x4. Раздел: Начинающим.

Eugene's MCU

Воскресенье, 13.07.2014, 19:15

Главная | | Мой профиль | Выход | RSS
Меню сайта
Категории каталога
Рекламный блок





Рекомендовать этот сайт:

Главная » Статьи » » Начинающим


Применение матричной клавиатуры 4x4
     Наиболее распространённое средство ввода данных для микропроцессорных устройств – плёночная или кнопочная клавиатура матричного типа.
 
     Для этого типа клавиатур характерно:  
     - разделение выводов на две группы. На одну из них подаются тестовые сигналы, с другой считывается комбинация сигналов, соответствующая нажатой клавише. Эти группы принято называть столбцами и строками клавиатуры и обозначать цифрами и буквами соответственно. Назначение конкретных групп выводов условно,
любая из них может выполнять роль столбцов или строк;
     - кнопки подключены таким образом, что каждая из них при нажатии соединяет один из столбцов с одной из строк клавиатуры. Отсюда их удобное условное обозначение, например 1A – кнопка, расположенная на пересечении столбца 1 и стоки A.
  
     Таким образом, количество клавиш клавиатуры равно числу столбцов умноженному на число строк.
     Клавиатура на фото, судя по числу выводов, могла бы иметь 16 кнопок, однако имеет 12, видимо один из её выводов не имеет внутренних соединений:
  
Матричная клавиатура 4x4
      
     Для подключения клавиатуры формата 4x4 достаточно одного порта микроконтроллера.
     В приведённом примере столбцы клавиатуры подключены к младшей тетраде порта A микроконтроллера AVR - выводы PA0...PA1, которые должны быть настроены на выход (см. рисунок).
     Старшая тетрада порта - строки матрицы, настраиваются как входы и притягиваются к питанию внутренними pull-up резисторами AVR или внешними номиналом 10 кОм.
     Для того чтобы избежать конфликта логических уровней при случайном нажатии двух кнопок, принадлежащих разным столбцам матрицы, цепи 1, 2, 3 и 4 небходимо подключить к порту через резисторы номиналом 270 Ом.
AVR. Опрос матричной клавиатуры 4x4
     Обнаружение нажатой кнопки проводится по следующему простому алгоритму:
 
     - исходное положение - все столбцы матрицы (PA0...PA3) в состоянии лог. 1;
     - выбор столбца 1 установкой низкого уровня PA0=0;
     - считывание старшей тетрады порта (строк клавиатуры) для обнаружения нажатых кнопок столбца 1 (1A, 1B, 1C или 1D). В случае замыкания одной из указанных клавиш нулевой уровень столбца появиться на соответствующей строке матрицы.
     - возврат в исходное положение - все столбцы в высоком состоянии;
     - далее происходит аналогичная выборка оставшихся столбцов с последующим чтением строк матрицы.
 
     Пример: при нажатии кнопки с адресом 3B, после выборки столбца 3 (PA2=0) на строке B будет считан низкий уровень (PA5=0).
     Простейшая функция "AskKey" на Си, реализующая этот алгоритм, может выглядеть таким образом:
 
     void AskKey (void)
     {
          Key=0;
          PORTA&=~(1<<0); // Выбрать столбец 1.
          asm ("nop");
          switch (PINA) {
          case 0b11101110: {Key=1; break;} // Кнопка 1A.
          case 0b11011110: {Key=2; break;} // Кнопка 1B.
          case 0b10111110: {Key=3; break;} // Кнопка 1C.
          case 0b01111110: {Key=4; break;} // Кнопка 1D.}
          PORTA=0xFF; // Исходное состояние.

          PORTA&=~(1<<1); // Выбрать столбец 2.
          asm ("nop");
          switch (PINA) {
          case 0b11101101: {Key=5; break;} // Кнопка 2A.
          case 0b11011101: {Key=6; break;} // Кнопка 2B.
          case 0b10111101: {Key=7; break;} // Кнопка 2C.
          case 0b01111101: {Key=8; break;} // Кнопка 2D.}
          PORTA=0xFF; // Исходное состояние.

          PORTA&=~(1<<2); // Выбрать столбец 3.
          asm ("nop");
          switch (PINA) {
          case 0b11101011: {Key= 9; break;} // Кнопка 3A.
          case 0b11011011: {Key=10; break;} // Кнопка 3B.
          case 0b10111011: {Key=11; break;} // Кнопка 3C.
          case 0b01111011: {Key=12; break;} // Кнопка 3D.}
          PORTA=0xFF; // Исходное состояние.

          PORTA&=~(1<<3); // Выбрать столбец 4.
          asm ("nop");
          switch (PINA) {
          case 0b11100111: {Key=13; break;} // Кнопка 4A.
          case 0b11010111: {Key=14; break;} // Кнопка 4B.
          case 0b10110111: {Key=15; break;} // Кнопка 4C.
          case 0b01110111: {Key=16; break;} // Кнопка 4D.}
          PORTA=0xFF; // Исходное состояние.
     }
 
     Данная функция присваивает переменной Key номер нажатой кнопки от 1 до 16 или 0, если ни одна из кнопок не нажималась.


При использовании материалов сайта ссылка на данный источник обязательна.

Категория: Начинающим | Добавил: eugenemcu (28.08.2009) | Автор:

Просмотров: 16293 | Комментарии: 14 | Рейтинг: 5.0/1 |
Всего комментариев: 14
0 Спам
* 1 (10.06.2010 00:58) [Материал]
А если окажется нажато более одной кнопки в столбце?

0 Спам
* 2 eugenemcu (10.06.2010 08:40) [Материал]
Это решение не предназначено для одновременного нажатия нескольких кнопок. Даже в таком функционально сложном устройстве как мобильный телефон в этом не возникает никакой необходимости. Если же это произойдёт случайно, то не будет зафиксировано нажатие ни одной из кнопок или той, которая была отжата позже.

0 Спам
* 3 (10.06.2010 14:12) [Материал]
"Если неприятность может случиться - она случится". Бывает придавливание клавы каким-то предметом. Бывают юзеры с толстыми пальцами. Бывает попадание пальцем между кнопок. Бывает стучание по клаве кулаком...

Правда, отсутствие фиксации - это даже не неприятность (тем более, что абсолютно одновременное нажатие маловероятно). Вопрос-то касается схемотехники.
Но я извиняюсь, текст невнимательно читал, смотрел только на схему и код. Не заметил сразу рекомендацию про резисторы. Хотел как раз указать на возможность замыкания выходов с разным уровнем. Осталось одно замечание - эта мера (резисторы или диоды) не рекомендуемая, а обязательная.


0 Спам
* 4 eugenemcu (10.06.2010 14:18) [Материал]
Спасибо за замечание. Исправлю “рекомендуется” на “необходимо”.

0 Спам
* 5 (15.06.2010 22:50) [Материал]
Если СТОЛБЦЫ вне времени опроса находятся в высокоомном состоянии. то не требуются ни развязывающие диоды ни резисторы, так же достаточно подтягивающих PULL UP, только время между перебором столбцов должно быть достаточным для заряда ёмкости монтажа и входов через PULL UP.. Так что без навесных компонентов всё прекрасно реализуемо.

0 Спам
* 6 eugenemcu (16.06.2010 09:11) [Материал]
Если не ошибаюсь, в вашем варианте задержка нужна только на восстановление исходного единичного уровня на столбце после его опроса (зарядкой ёмкости через pull-up). По-моему, для этих целей можно на пару тактов опрошенный столбик установить в единицу и переключить на выход для принудительного восстановления единицы, а потом снова на вход… и дальше уже сразу выбирать следующий столбец.

0 Спам
* 7 eugenemcu (16.06.2010 12:26) [Материал]
Отмакетировал на Mega16 c 9-и кнопочной клавиатурой (PC0...PC5). Всё работает. Обвязки нет, опасности замкнуть выходы тоже нет.
Функция опроса:
Code

void AskKey (void)
{     
     Key=0;
     DDRC|=(1<<0);  // Столбец 1 на выход.
     PORTC&=~(1<<0); // Выбрать столбец 1.     
     asm ("nop");     
     switch (PINC|((1<<6)|(1<<7)))     
     {
     case 0xF6: {Key=1; break;} // Кнопка 1A (11110110).
     case 0xEE: {Key=2; break;} // Кнопка 1B (11101110).
     case 0xDE: {Key=3; break;} // Кнопка 1C (11011110).
     }
     PORTC|=(1<<0);  // Восстановить единичный уровень на столбце 1.
     DDRC=0;  // Все разряды на вход.     

     DDRC|=(1<<1);  // Столбец 2 на выход.
     PORTC&=~(1<<1); // Выбрать столбец 2.
     asm ("nop");
     switch (PINC|((1<<6)|(1<<7)))     
     {
     case 0xF5: {Key=4; break;} // Кнопка 2A (11110101).
     case 0xED: {Key=5; break;} // Кнопка 2B (11101101).
     case 0xDD: {Key=6; break;} // Кнопка 2C (11011101).
     }
     PORTC|=(1<<1);  // Восстановить единичный уровень на столбце 2.
     DDRC=0;  // Все разряды на вход.     

     DDRC|=(1<<2);  // Столбец 3 на выход.
     PORTC&=~(1<<2); // Выбрать столбец 3.
     asm ("nop");
     switch (PINC|((1<<6)|(1<<7)))     
     {
     case 0xF3: {Key=7; break;} // Кнопка 3A (11110011).
     case 0xEB: {Key=8; break;} // Кнопка 3B (11101011).
     case 0xDB: {Key=9; break;} // Кнопка 3C (11011011).
     }
     PORTC|=(1<<2);  // Восстановить единичный уровень на столбце 3.
     DDRC=0;  // Все разряды на вход.     
}

Проект для IAR 4.21A >> http://eugenemcu.ru/common/3x3_OK.rar
(При нажатии на кнопку отправляет значение Key в UART на 115,2 кбит/с.)

0 Спам
* 8 us4ilq (17.12.2010 20:56) [Материал]
Здравствуйте Евгений!
В предидущем Вашем коментарии приведен код .
Поясните чайнику, в строке switch (PINC|((1<<6)|(1<<7))) указаны неиспользуемые биты 6и7.
Это что , для запрета их чтения?

Я попробовал , но почемуто у меня работает только если эту строку написать так:
switch (PINC&=~((1<<0)|(1<<1)|(1<<2))) , у меня неиспользуются биты 0,1и 2.

Как у меня так могло получиться?


0 Спам
* 9 eugenemcu (17.12.2010 23:02) [Материал]
Да. Таким образом в считанном значении PINC неиспользуемые биты устанавливаются в заведомо известное (единичное) состояние, ведь на них может оказаться всё что угодно. Можно их не устанавливать, а сбрасывать, но это нужно учесть в константах по которым ходит switch. У меня в них как видите bit 6 = bit 7 =1.
Если у вас работает со сброшенными неиспользуемыми битами, значит они у вас сброшены в константах которые перечислены по “case”, т.е. case в формате XXXXX000.

0 Спам
* 10 us4ilq (18.12.2010 17:00) [Материал]
.
.
Евгений!
У меня возник еще вопрос.
А как быть в том случае если я начну использовать биты 0, 1 и 2 ? Пока они не при деле.
Я в дальнейшем собираюсь разместить клавиатуру на старшие биты порта"А" ,
а младшие будут обрабатывать аналоговый сигнал. Ну по крайней мере биты 0 и 1.
Ведь тогда на них будет присутствовать случайный (для клавиатуры) уровень ?
Как быть в этом случае ?

0 Спам
* 11 eugenemcu (18.12.2010 19:10) [Материал]
Как быть в таком случае при чтении мы разобрали, а при записи для установки и сброса выводов клавиатуры нужно будет использовать операции типа чтение-модификация-запись:
PORTA&=~(1<<N); // Выбрать столбец N.
PORTA|= (1<< N); // Снять выбор столбца N.

Такая операция не действует ни на какие биты кроме N –ого.
Подробнее читайте здесь >> http://eugenemcu.ru/publ/2-1-0-53
А если у Вас на незадействованных выводах будет включен АЦП, то при любых манипуляциях в них записываться ничего не будет, потому что они перестанут работать как порты общего назначения.


0 Спам
* 12 us4ilq (18.12.2010 20:52) [Материал]
.
.
Quote
потому что они перестанут работать как порты общего назначения.

То есть эти биты переключатся на альтернативное использование ? Об этом я и забыл совсем.
Спасибо.

0 Спам
* 13 (09.03.2011 00:30) [Материал]
А где схема то?

0 Спам
* 14 eugenemcu (09.03.2011 08:48) [Материал]
Схема для примера в коментах примитивная:
столбцы 1,2,3 на PC0, PC1, PC2, строки A,B,C на PC3, PC4, PC5.

Статистика

Наш магазин




Какую среду разработки Вы используете?

[ Результаты · Архив опросов ]
Всего ответов: 1556



Им нужна Ваша помощь: