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

 
 
> Подключение клавиатуры, Не получается
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
yung
сообщение Jun 16 2005, 05:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Обычно делается так. Строки определяются как выходы, столбцы как входы (или наоборот, но рассмотрим этот вариант). Столбцы неплохо бы внешними резисторами к + подтянуть (внутренний pull-up не всегда помогает). В исходном состоянии строки установлены в 1. По таймеру каждые, к примеру, 30 мс переводим очередную строку в 0, возвращая предыдующую в 1. Читаем состояние столбцов. Когда столбец равен 0, то нажата клавиша на пересечении столбца и строки. Для верности дожидаемся следующего прохода через эту строку, и в случае, когда там опять 0, считаем клавишу нажатой. Это простейший путь защиты от дребезга, но обычно его достаточно.
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
|- - rezident   Цитата(SergeyM @ Jun 16 2005, 11:01)А какое у...   Jun 16 2005, 15:52
|- - 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 Текстовая версия Сейчас: 18th July 2025 - 22:58
Рейтинг@Mail.ru


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