-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeyboard.cpp
80 lines (65 loc) · 2.88 KB
/
keyboard.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//----------------------------------------------------------------------------
//Модуль поддержки клавиатуры
//----------------------- Используемые ресурсы: ------------------------------
//Кнопки "SET V", "SET I", "OUT ON/OFF", "FINE" и кнопка энкодера
//подключены к портам Pin_KeyV, Pin_KeyC, Pin_KeyO, Pin_KeyF и Pin_KeyE
//соответственно. При нажатии кнопки на порту появляется НИЗКИЙ уровень.
//----------------------------------------------------------------------------
#include "main.h"
#include "keyboard.h"
//--------------------------- Константы: -------------------------------------
#define DEBOUNCE_TM 50 //интервал подавления дребезга, ms
#define HOLD_DELAY 1000 //задержка удержания кнопки, ms
//----------------------------------------------------------------------------
//--------------------------- Класс TKeyboard: -------------------------------
//----------------------------------------------------------------------------
//----------------------------- Конструктор: ---------------------------------
TKeyboard::TKeyboard(void)
{
Pin_KeyV.Init(IN_PULL, PULL_UP);
Pin_KeyC.Init(IN_PULL, PULL_UP);
Pin_KeyO.Init(IN_PULL, PULL_UP);
Pin_KeyF.Init(IN_PULL, PULL_UP);
Pin_KeyE.Init(IN_PULL, PULL_UP);
Message = KBD_NOP;
Prev_Key = KBD_NOP;
DebounceTimer = new TSoftTimer();
DebounceTimer->Oneshot = 1;
HoldTimer = new TSoftTimer();
HoldTimer->Oneshot = 1;
}
//----------------------- Сканирование клавиатуры: ---------------------------
KeyMsg_t TKeyboard::Scan(void)
{
char s = KBD_NOP;
if(!Pin_KeyV) s |= KBD_SETV; //кнопка SET V
if(!Pin_KeyC) s |= KBD_SETI; //кнопка SET I
if(!Pin_KeyO) s |= KBD_OUT; //кнопка OUT ON/OFF
if(!Pin_KeyF) s |= KBD_FINE; //кнопка FINE
if(!Pin_KeyE) s |= KBD_ENC; //кнопка энкодера
return((KeyMsg_t)s);
}
//------------------------- Обработка клавиатуры: ----------------------------
void TKeyboard::Execute(void)
{
if(TSysTimer::Tick) //каждый системный тик (чаще не нужно)
{
KeyMsg_t Key = Scan(); //сканирование клавиатуры
if(Key != Prev_Key) //код отличается
{
DebounceTimer->Start(DEBOUNCE_TM); //запуск таймера подавления дребезга
HoldTimer->Start(HOLD_DELAY); //запуск таймера удержания кнопки
Prev_Key = Key; //сохранение нового кода
}
else if(Key != KBD_NOP) //код совпадает и не равен KBD_NOP
{
if(DebounceTimer->Over()) //если дребезга нет,
Message = Key; //генерация сообщения нажатия
if(HoldTimer->Over()) //если интервал истек,
Message = (KeyMsg_t)(Key + KBD_HOLD); //генерация сообщения удержания
}
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------