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

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


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Я делаю по тому же принципу, что описал vet:
Цитата
единожды настроенный порт далее не трогал бы, а в процедуре опроса клавиш гасил бы столбцы поодиночке и сканировал бы строки на лог.ноль

Но хранение состояний клавиш немного более разветвленное.
У меня хранятся:
1. Текущее состояние (Не нажата, Преднажата, Нажата, Долго нажата, Отпущена) state
2. Значение сантисекунд, когда было выставлено последнее состояние time
3. Флаг ее обработки worked
4. Счетчик повторений count

Упрощенный алгоритм опроса клавиш таков:
Код
- С клавиатуры считывается состояние кнопки.
- Если она не нажата, то:
{
   - если state не равно "Отпущена" или "Не нажата", то установить state в "Отпущена" и worked в "ложь"
}
- Иначе:
{
   switch()
   {
     - Если state равно "Преднажата", установить state в "Нажата", worked в "ложь" и time в текущие сантисекунды
     - Если ее состояние равно "Нажата" и разница между текущими сантисекундами и time больше 50 (пол-секунды), установить state в "Долго нажата", worked в "ложь", time в текущие сантисекунды, count в 1
     - Если ее состояние равно "Долго нажата" и разница между текущими сантисекундами и time больше 10, установить worked в "ложь", инкрементировать count
   }
}
Повторить для всех клавиш



Вот... А в главном цикле просто проверяются флаги worked, и если у какой-то клавиши он установлен в "ложь", то в зависимости от state производятся каки-либо действия, после чего флаг worked сбрасывается в "истина" (а если клавиша была в состоянии "Отпущена", то и состояние сбрасывается в "Не нажата").

Довольно простой алгоритм, позволяющий обрабатывать нажатия кнопок как угодно - одиночные нажатия, долгие нажатия с периодом автонажатия, отпускания...

Да, кстати... период опроса клавиш у меня обычно 10 милисекунд (1 сантисекунда), с одной стороны для антидребезга этого вполне достаточно, с другой стороны - позволяет реагировать на довольно краткие нажатия клавиш.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SergeyM   Подключение клавиатуры   Jun 15 2005, 17:09
- - rezident   Немного не так это делается. По крайней мере я не ...   Jun 15 2005, 17:57
|- - Make_Pic   Цитата(rezident @ Jun 15 2005, 20:57)Немного ...   Jun 15 2005, 18:11
|- - SergeyM   Цитата(rezident @ Jun 15 2005, 20:57)Немного ...   Jun 16 2005, 05:01
|- - yung   Обычно делается так. Строки определяются как выход...   Jun 16 2005, 05:21
|- - 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
- - rezident   Вот вам мой модуль для обслуживания клавиатуры 2х3...   Jun 17 2005, 10:08


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:53
Рейтинг@Mail.ru


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