Обработчик матричной клавиатуры

typedef struct
{
unsigned int key_pressed;
unsigned int key_holded;
unsigned int holdtime[16];
}key_struct_t;
key_pressed содержит флаги нажатых кнопок, key_holded — флаги кнопок которые удерживаются. Обработчик работает итерационно. Кнопка считается нажатой только если она находится в нажатом состоянии несколько опросов подряд. При этом количество срабатываний фиксируется в holdtime для соответствующей кнопки. Если кнопка была нажата в течение времени меньшего чем KBD_STAB_TIME, счетчик обнуляется. Таким образом выполняется защита от дребезга.Если величина в holdtime для данной кнопки достигло KBD_STAB_TIME то после отпускания тип нажатия будет зависеть от времени удержания. Если holdtime не достигло KBD_HOLD_TIME то установится бит переменной key_pressed структуры key_struct_t. Если же кнопка удерживается дольше и переменная счетчик holdtime успеет натикать до KBD_HOLD_TIME, то после отпускания кнопки установится бит в переменной key_holded. Функция опроса возвращает 0 если нажатий не было, и 1 если нажатия были. В последнем случае необходимо считать key_pressed и key_holded для того чтобы узнать какая именно кнопка была нажата и какой тип нажатия. При следующем опросе клавиатуры флаги будут сброшены. Код обвешан макросами для повышения портируемости и настраиваемости. К статье приложен проектик для теста клавиатуры в составе mRTOS. Клавиатура опрашивается с интервалом 10мс, удержанием считается нажатие в течение 1сек и более. Можно выбрать размер клавиатуры 3*4 или 4*4. Я проводил манипуляции с режимом 3*4. Обработку клавиатуры сопровождает простенький код с двумя светодиодиками, дублирующими длинное и короткое срабатывание клавиатуры, есть видос, попробую прицепить. В случае если отбросить универсальность, код станет проворнее, я так думаю. С другой стороны, не всегда нужно опрашивать клавиатуру так часто. Кто захочет — улучшит. На портах не хватает защитных диодов на случай конфликта сканирующего уровня ноги с остальными, я не стал ставить их в макет, просто испытывал осторожнее.
видос:
- -1
- 07 декабря 2013, 20:23
- XOR
- 1
Файлы в топике:
Atmega328_GPIO.zip
Не знаю что делать. Редактирование не работает. Не могу ничего исправить.
Видео тут www.youtube.com/watch?v=_g_AVONZlss
Видео тут www.youtube.com/watch?v=_g_AVONZlss
Нужно переписать, чтобы клавиатуре не опрашивалась каждый раз, а брались последние измеренные значения. Типа кэширование.
1. Одна функция вызывается с интервалом, например, 5 мс, опрашивает всю клавиатуру (считает длительность нажатия и т.п.) и записывает всё в массив.
2. Вторая функция по запросу выдаёт состояние из массива.
Ну и говнокод, конечно!
Не надо инклудить *.c в хидере.
if (unsigned int x != 0) можно заменить просто if (unsigned int x)
Не знаю, как в твоём компиляторе, но (unsigned) int на AVR может иметь размер и два байта. В функции, где у тебя возвращается 1 или 0 его лучше заменить unsigned char.
Дальше лень разбираться.
1. Одна функция вызывается с интервалом, например, 5 мс, опрашивает всю клавиатуру (считает длительность нажатия и т.п.) и записывает всё в массив.
2. Вторая функция по запросу выдаёт состояние из массива.
Ну и говнокод, конечно!
Не надо инклудить *.c в хидере.
if (unsigned int x != 0) можно заменить просто if (unsigned int x)
Не знаю, как в твоём компиляторе, но (unsigned) int на AVR может иметь размер и два байта. В функции, где у тебя возвращается 1 или 0 его лучше заменить unsigned char.
Дальше лень разбираться.
Не знаю, как в твоём компиляторе, но (unsigned) int на AVR может иметь размер и два байта. В функции, где у тебя возвращается 1 или 0 его лучше заменить unsigned char.В эмбеде с такими типами лучше вообще не связываться. Размер char, int, etc при портировании малопредсказуем, лучше пользоваться uint8_t, uint16_t и подобными.
#if (defined KBD_3_4)
уж слишком часто мельтешит по коду=) Не проще ли всего один дефайн на количество столбцов?#define KBD_COL_NUM 4
unsigned char columns[KBD_COL_NUM];
#if (defined KBD_3_4)
for(column=0;column<3;column++)//для каждого столбца
#else
for(column=0;column<4;column++)
#endif
{
станет
for(column=0;column<KBD_COL_NUM;column++)
Комментарии (20)
RSS свернуть / развернуть