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

 
 
> Подключение клавиатуры, Не получается
SergeyM
сообщение Jun 15 2005, 17:09
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654



Всем привет wink.gif
Решил усовершенствовать свой проект и добавить клаву 4х4. Прочел AVR240 вроде так называлась статья, но реализовывал используя ЖК а не светодиодный индикатор. К тому же клаву подключил к одному порту, ЖК к другому и програмно отправляю символ нажатой клавиши. Все вроде работает но не доконца smile.gif символы выводятся но только по первому столбцу т.е. 7, 4, 1, С (это символы первого столбца в моей клаве). Пробовал по разному делать задержку для антидребезга, но чето никак. Вообще реализую так:
на порт выдаю 0xF0 и с помощью прерываний проверяю число на PIN если не равно 240, то значит нажали на кнопку и отправляюсь в функцию обработки нажатия:
Код
KeyPress(void){
//delay_ms(20); пробовал ее везде пихать :)
switch (PINB) {
   case 224: key = 0;
       delay_ms(10);
       break;
   case 208: key = 4;
       delay_ms(10);
       break;
   case 176: key = 8;
       delay_ms(10);
       break;
   case 112: key = 12;
       delay_ms(10);
       break;  
   };
PORTB = 0x0F;
DDRB = 0xF0;
delay_us(10);
switch (PINB) {
   case 7: key += 0;
       delay_ms(10);
       break;
   case 11: key += 1;
       delay_ms(10);
       break;
   case 13: key += 2;
       delay_ms(10);
       break;
   case 14: key += 3;
       delay_ms(10);
       break;  
   };
PORTB = 0xF0;
DDRB = 0x0F;
PORTA.2 = 1; типа флаг нажати ниче более мудрого сразу не пришло :)

}


Далее в бесконечном цикле проверяю флаг нажатия и отправляю на экран символ из "таблицы" в качестве которой использовал массив символов, а key это номер символа в массиве. Разумеется после отправки флаг сбрасываю.

PS Сильно не ругайте, а вот за дельный совет всегда благодарен буду.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jun 15 2005, 17:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Немного не так это делается. По крайней мере я не так делаю.
Сделайте буфер нажатых клавиш. Реализуйте функции типа put_key, check_key и get_key.
put_key это функция сканирования клавиатуры, устранения дребезга и размещения в буфере клавиатуры скан-кода нажатой клавиши (проще всего по табличному принципу). Она же может реализовывать автоповтор нажатой клавиши и обработку нажатия нескольких клавиш (типа ALT + key, CTRL + key и т.п). Количество клавиш ограничено только аппартной реализацией клавиатуры. Буфер клавитуры может иметь любой размер. Буфер циклический. Для помещения и извлечения кодов клавиш используется счетчик скан-кодов и указатель на текущий скан-код. Естественно указатели ограничиваются сверху размером буфера. При равенстве счетчика и указателя (все коды из буфера извлечены) их значения устанавливаются на начало буфера.
Вызывается putkey желательно не менее 6 раз/сек, но не чаще длительности дребезга клавиш (обычно не чаще 100 раз/сек, т.к. чаще ни одна даже профессиональная машинистка не сможет нажимать ИМХО smile.gif). Вызов ее на какое-нибудь прерывание с подходящим периодом подвешивают.
check_key возвращает NULL если в буфере нет ни одного кода клавиши или текущий код клавиши. Указатель на текущий скан-код в буфере и счетчик кодов при этом не изменяется.
get_key возвращает NULL если в буфере нет ни одного кода клавиши или текущий код клавиши. Указатель на текущий скан-код в буфере и счетчик кодов при этом изменяются.
Я не привожу здесь какого-либо программного кода по двум причинам. Во-первых, нет под рукой. Во-вторых, считаю, что лучше уяснить принцип и хотя бы один раз написать самому для полного понимания wink.gif
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 16 2005, 05:01
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654



Цитата(rezident @ Jun 15 2005, 20:57)
Немного не так это делается. По крайней мере я не так делаю.
Сделайте буфер нажатых клавиш. Реализуйте функции типа put_key, check_key и get_key.
*


Цитата(vet)
на мой взгляд, какая-то неочевидная реализация, я бы сделал проще: единожды настроенный порт далее не трогал бы, а в процедуре опроса клавиш гасил бы столбцы поодиночке и сканировал бы строки на лог.ноль.


А какое у вас начальное значение выводов или по какому принципу вы определяете что клавиша нажата? Или у вас всегда опрашиваются все клавиши?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 16 2005, 15:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SergeyM @ Jun 16 2005, 11:01)
А какое у вас начальное значение выводов или по какому принципу вы определяете что клавиша нажата? Или у вас всегда опрашиваются все клавиши?
*

Обычно используем матрицу 4х4 или 2х4. Соответственно четыре сканирующие линии (выходы с ОК или обычные выходы с диодами) и четыре считывающие линии (входы с pull-up резисторами). В памяти хранится предыдущее состояние матрицы кнопок. 16 кнопок - одно слово. Установленному биту соответствует нажатая клавиша. Если предыдущее состояние равно 0x0000, то перед полным сканированием достаточно проверить нажата ли хоть одна клавиша. Для этого все сканирующие линии можно враз активировать. Если хоть одна кнопка нажата, но начинается полноценная процедура сканирования каждой линии. В результате получаем матрицу текущего состояния кнопок. XORим две матрицы и получаем изменение между двумя состояниями. Если результат XORения равен нулю, то состояние устойчивое и можно определять код нажатой клавиши. Затем запоминаем текущее состояние для использования в следующем цикле сканирования как предыдущее состояние. В цикле накладываем маску вида (1<<i) на маску состояния клавиш и при совпадении получаем смещение (i) в таблице скан-кодов. Вот и все в общих чертах. Далее идут всякие усовершенствования с автоповтором нажатой клавиши, с определением нескольких нажатых клавиш и т.д и т.п.
P.S. Забыл уточнить, что меня обычно интересует только нажатая клавиша, хотя никто не мешает в этом алгоритме сделать и скан-коды отпускания.
P.P.S. Иногда бывает важным, чтобы не все кнопки имели функцию автоповтора. У меня обычно SET и ESC не имеют этой функции, все остальные для удобства навигации в меню и редактирования имеют автоповтор с программируемой паузой и частотой автоповтора.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SergeyM   Подключение клавиатуры   Jun 15 2005, 17:09
|- - Make_Pic   Цитата(rezident @ Jun 15 2005, 20:57)Немного ...   Jun 15 2005, 18:11
|- - yung   Обычно делается так. Строки определяются как выход...   Jun 16 2005, 05:21
|- - SergeyM   Цитата(rezident @ Jun 16 2005, 18:52)Обычно и...   Jun 16 2005, 16:07
|- - SergeyM   Цитата(rezident @ Jun 16 2005, 18:52)Вот вам ...   Jun 17 2005, 14:09
- - vet   Цитата(SergeyM @ Jun 15 2005, 21:09) на мой в...   Jun 15 2005, 18:24
|- - yung   а в процедуре опроса клавиш гасил бы столбцы поо...   Jun 16 2005, 04:41
|- - SergeyM   Цитата(vet @ Jun 15 2005, 21:24)Код//коды кла...   Jun 16 2005, 16:17
|- - rezident   Цитата(SergeyM @ Jun 16 2005, 22:17)Цитата(ve...   Jun 16 2005, 16:29
|- - vet   Цитата(rezident @ Jun 16 2005, 20:29)Цитата(S...   Jun 16 2005, 16:35
|- - SergeyM   Цитата(rezident) Ниче страшного самое главное сут...   Jun 16 2005, 16:43
|- - rezident   Цитата(SergeyM @ Jun 16 2005, 22:43)Цитата(re...   Jun 16 2005, 18:29
- - AndyBig   Я делаю по тому же принципу, что описал vet: Цитат...   Jun 16 2005, 20:00
- - rezident   Вот вам мой модуль для обслуживания клавиатуры 2х3...   Jun 17 2005, 10:08


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

 


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


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