[an error occurred while processing this directive]
Пример функции сканирования клавы до 16 кнопок с функцией автоповтором для клавиш со стрелками.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено rezident 11 апреля 2006 г. 10:34
В ответ на: Дык XOR-те состояния. Если XOR дает нуль, то состояние кнопок не изменилось и его детектирвать необязательно. В противном случае определяйте нажата кнопка или отжата. отправлено rezident 11 апреля 2006 г. 10:27


//===============================================
// обработка матричной клавиатуры до 16 кнопок
// содержит функции:
// -инициализации
// -сканирования
//===============================================
// Автор - rezident (rezident@rbcmail.ru)
// сopyright (c) февраль, 2005 год
//===============================================

#include "..\_INC\drvKBDdef.h"
#include "..\..\_xCOMMON\_LIB\KBD\xKBD_Buf.c"


//===============================================
// Функция инициализации клавиатуры
//-----------------------------------------------
//аргументы: указатель на структуру переменных
// клавиатуры
//возвращает:ошибку, если нет клавиатуры
//===============================================
xByte drvKbdInit(xVT_KBD_Data *pd, st_drvKBD_Loc *pc, st_drvKBD_Data *drv)
{ if (drvKbdHardInit()!=0) //нет железа или клав-ры?
{ return(1); //возвращ. ошибку (нет клав-ы)
}
drv->matrix=0; //сбросим состояние матрицы
drv->status=0; //сбросим устойчивое состояние
drv->autoKey=KB_NULL; //предуст.код автоповтора
drv->autoDly=pc->dly; //предустановим счетчик за-
//держки автоповтора
drv->autoRpt=0; //сбросим счетчик паузы
//автоповтора
if (pc->time==0) drv->ctrl=drvKBD_AUTORPTBLOCK; //блокируем автоповтор
else drv->ctrl=0;
drv->cData=pc; //указатель на сегмент констант
pd->drvData=(xByte *)drv; //установим указатель на стру-
//ктуру драйвера клавиатуры
pd->flags=drvKBTYPE; //здесь установим типа клав-ры
pd->NumKey=0; //сбросим число кодов в буфере
pd->IdKey=0; //сбросим индекс кода в буфере
pd->LastKey=KB_NULL; //код последней извлеч.клавиши
pd->pBuf=(xByte *)&drv->kbBuf; //указатель на буфер клав-ры
pd->SzBuf=drvKB_MAXBUFSIZE; //уст. размер буфера клавитуры
return(0);
}
//================================================
// Функция сканирования виртуальной клавиатуры
//------------------------------------------------
//аргументы: указатель на структуру клавитауры
//возвращает:нет
//================================================
void drvKbdPutKey(xVT_KBD_Data *dbuf)
{ st_drvKBD_Data *pd=(st_drvKBD_Data *)(dbuf->drvData);
st_drvKBD_Loc *pc=(st_drvKBD_Loc *)(pd->cData);
xWord tmp1=0, tmp2=0;
tmp1=drvKbdHardScan(); //сканирование клав-ры
if ((pd->matrix^tmp1)==0) //предыд. и текущ. состояния
//матрицы совпадают?
{ //да, состояние ее устойчивое
tmp2=pd->status^tmp1; //проверим изменения
if (tmp2!=0) //есть изменения?
{ //да,требуется обработка
pd->autoKey=KB_NULL; //предустановим кодом
//ненажатой клавиши
xWord mask=1; //маска для идентификации
for (xWord i=0; i<(pc->maxKeyNum); i++) //цикл для идентиф. нажатия
{ if ((tmp2&mask)!=0) //сост. этой клав. изменилось?
{ if ((tmp1&mask)!=0) //да, а она нажата?
{ //да, надо писать код в буфер
if ((dbuf->flags&VT_FKBD_M_H_LOCK)==0)//клавиатура не заблокирована?
{ xByte key=pc->Tab[i]; //код клавиши из таблицы
if (key!=KB_NULL)
{ _xKbdBuf((xVT_KBD_Data *)dbuf, VT_KBD_FN_PUT, key, 0);//нет, по-
//местим код клавиши
pd->autoKey=pc->Tab[i]; //запомним как последний код
pd->autoRpt=0; //сбросим счетчик паузы
//автоповтора
pd->autoDly=pc->dly; //предустановим счетчик
//задержки автоповтора
if ((pd->ctrl&drvKBD_SIGNALBLOCK)==0)//блокировка сигнала есть?
{ pd->ctrl|=drvKBD_SIGNALON; //нету, поморгаем или побикаем
}
}
i=pc->maxKeyNum; //закончим цикл
}
} //нет, кнопка была отжата
}
mask<<=1; //модифицируем маску бита
}
}
else //нет, устойчивое сост. не
//изменилось, но клавиша-то
//нажата!
if (((pd->ctrl&drvKBD_AUTORPTBLOCK)==0)&&
((dbuf->flags&VT_FKBD_M_H_LOCKAUTO)==0)) //автоповтор в программе разрешен?
{ xByte autoKey=pd->autoKey;
if (((autoKey==KB_UP) ||
(autoKey==KB_DOWN)||
(autoKey==KB_LEFT)||
(autoKey==KB_RIGHT))) //код клавиши со стрелками?
{ //нет, будем повторять его
if (pd->autoDly>0) //задержка автоповтора уже
//закончилась?
{ pd->autoDly-=1; //еще нет, уменьшим счетчик
}
else //да, задержка закончилась
if (pd->autoRpt>0) //пауза между автоповторами
//закончилась?
{ //нет, не окончилась
pd->autoRpt-=1; //уменьшим счетчик
}
else //да, пауза закончилась
{ if ((dbuf->flags&VT_FKBD_M_H_LOCK)==0) //клавиатура не заблокирована?
{ _xKbdBuf(dbuf, VT_KBD_FN_PUT, pd->autoKey, 0);// нет, поместим код
if ((pd->ctrl&drvKBD_SIGNALBLOCK)==0) //блокировка сигнала есть?
{ pd->ctrl|=drvKBD_SIGNALON; //нету, поморгаем или побикаем
}
}
pd->autoRpt=pc->time; //установим счетчик паузы
} //автоповтора
}
}
pd->status=tmp1; //обновим устойчивое состояние
} //матрицы клавиатуры
pd->matrix=tmp1; //запомним текущ. состояние
} //матрицы


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru