summaryrefslogtreecommitdiff
path: root/frontends/calculator/CEdev/include/keypadc.h
blob: db77bf342b5a8aa095e9319aa92f8615590f5a9e (plain)
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/**
 * @file
 * @authors Matt "MateoConLechuga" Waltz
 * @authors Shaun "Methsoft" McFall
 * @brief Simple direct input keypad library
 */

#ifndef H_KEYPADC
#define H_KEYPADC

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef uint8_t kb_key_t;   ///< Normal key type
typedef uint16_t kb_lkey_t; ///< Long key type

/**
 * Scans the keyboard to update data values
 * @note Disables interrupts
 */
void kb_Scan(void);

/**
 * Scans the given keyboard row and returns the row value
 * @param row Row to scan
 * @note Disables interrupts
 */
kb_key_t kb_ScanGroup(uint8_t row);

/**
 * Scans the keyboard quickly to tell if any key was pressed
 * @note Disables interrupts
 */
uint8_t kb_AnyKey(void);

/**
 * Resets the keyboard
 * @note Only use if you modify keyboard timers or number of rows
 */
void kb_Reset(void);

/**
 * @brief Sets the keypad scanning mode
 * @see kb_scan_mode_t
 */
#define kb_SetMode(mode) \
(kb_Config = ((kb_Config & ~3)|(mode)))

/**
 * @brief Gets the keypad scanning mode
 * @see kb_scan_mode_t
 */
#define kb_GetMode() \
(kb_Config & 3)

/**
 * Different available scanning modes
 */
typedef enum {
    MODE_0_IDLE = 0,       /**< Keypad scanning is idle */
    MODE_1_INDISCRIMINATE, /**< Indiscriminate key detection. Data registers are invalid, but whenever any key is pressed, interrupt KB_MODE_1_PRESS is set (and cannot be cleared until the key is released). */
    MODE_2_SINGLE,         /**< Single scan. The keypad is scanned once, and then the mode returns to MODE_0_IDLE. */
    MODE_3_CONTINUOUS      /**< Continuous scan. When scanning completes, it just starts over again after a delay. */
} kb_scan_mode_t;

#define kb_EnableInt \
(*(uint8_t*)0xF5000C)          /**< Enabled keypad interrupt signals */
#define kb_IntAcknowledge \
(*(volatile uint8_t*)0xF50008) /**< Acknowledege keypad interrupt signals */
#define kb_IntStatus \
(*(volatile uint8_t*)0xF50008) /**< Status of keypad interrupt signals */
#define kb_Config \
(*(uint8_t*)0xF50000)          /**< Configuration of keypad controller */

/**
 * Keypad Data registers
 *
 * | Offset | Bit 0      | Bit 1      | Bit 2      | Bit 3      |  Bit 4     |  Bit 5     |  Bit 6     | Bit 7      |
 * | -------| ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- |
 * | 1      | kb_Graph   | kb_Trace   | kb_Zoom    | kb_Window  | kb_Yequ    | kb_2nd     | kb_Mode    | kb_Del     |
 * | 2      |            | kb_Sto     | kb_Ln      | kb_Log     | kb_Square  | kb_Recip   | kb_Math    | kb_Alpha   |
 * | 3      | kb_0       | kb_1       | kb_4       | kb_7       | kb_Comma   | kb_Sin     | kb_Apps    | kb_GraphVar|
 * | 4      | kb_DecPnt  | kb_2       | kb_5       | kb_8       | kb_LParen  | kb_Cos     | kb_Prgm    | kb_Stat    |
 * | 5      | kb_Chs     | kb_3       | kb_6       | kb_9       | kb_RParen  | kb_Tan     | kb_Vars    |            |
 * | 6      | kb_Enter   | kb_Add     | kb_Sub     | kb_Mul     | kb_Div     | kb_Power   | kb_Clear   |            |
 * | 7      | kb_Down    | kb_Left    | kb_Right   | kb_Up      |            |            |            |            |
 * 
 * These data registers can be indexed just like an array. For example, if you want to check the status of the '2nd' key:
 * @code
 *  if (kb_Data[1] & kb_2nd) {
 *      ...
 *  }
 * @endcode
 */
#define kb_Data \
(uint8_t)((uint16_t*)0xF50010)

/**
 * Different available interrupt signals
 */
typedef enum {
    KB_SCAN_COMPLETE = 1, /**< Interrupt set when keypad is done scanning */
    KB_DATA_CHANGED = 2,  /**< Interrupt set when data is changed on a press or a release */
    KB_MODE_1_PRESS = 4   /**< Interrupt set when a key is pressed in MODE_1_INDISCRIMINATE */
} kb_int_signal_t;

/* Keyboard group 1 */
#define kb_Graph      1<<0
#define kb_Trace      1<<1
#define kb_Zoom       1<<2
#define kb_Window     1<<3
#define kb_Yequ       1<<4
#define kb_2nd        1<<5
#define kb_Mode       1<<6
#define kb_Del        1<<7

/* Keyboard group 2 */
#define kb_Sto        1<<1
#define kb_Ln         1<<2
#define kb_Log        1<<3
#define kb_Square     1<<4
#define kb_Recip      1<<5
#define kb_Math       1<<6
#define kb_Alpha      1<<7

/* Keyboard group 3 */
#define kb_0          1<<0
#define kb_1          1<<1
#define kb_4          1<<2
#define kb_7          1<<3
#define kb_Comma      1<<4
#define kb_Sin        1<<5
#define kb_Apps       1<<6
#define kb_GraphVar   1<<7

/* Keyboard group 4 */
#define kb_DecPnt     1<<0
#define kb_2          1<<1
#define kb_5          1<<2
#define kb_8          1<<3
#define kb_LParen     1<<4
#define kb_Cos        1<<5
#define kb_Prgm       1<<6
#define kb_Stat       1<<7

/* Keyboard group 5 */
#define kb_Chs        1<<0
#define kb_3          1<<1
#define kb_6          1<<2
#define kb_9          1<<3
#define kb_RParen     1<<4
#define kb_Tan        1<<5
#define kb_Vars       1<<6

/* Keyboard group 6 */
#define kb_Enter      1<<0
#define kb_Add        1<<1
#define kb_Sub        1<<2
#define kb_Mul        1<<3
#define kb_Div        1<<4
#define kb_Power      1<<5
#define kb_Clear      1<<6

/* Keyboard group 7 */
#define kb_Down       1<<0
#define kb_Left       1<<1
#define kb_Right      1<<2
#define kb_Up         1<<3

/* Keyboard group 1 */
#define kb_KeyGraph           (kb_lkey_t)(1 << 8 | 1<<0)
#define kb_KeyTrace           (kb_lkey_t)(1 << 8 | 1<<1)
#define kb_KeyZoom            (kb_lkey_t)(1 << 8 | 1<<2)
#define kb_KeyWindow          (kb_lkey_t)(1 << 8 | 1<<3)
#define kb_KeyYequ            (kb_lkey_t)(1 << 8 | 1<<4)
#define kb_Key2nd             (kb_lkey_t)(1 << 8 | 1<<5)
#define kb_KeyMode            (kb_lkey_t)(1 << 8 | 1<<6)
#define kb_KeyDel             (kb_lkey_t)(1 << 8 | 1<<7)

/* Keyboard group 2 */
#define kb_KeyStore           (kb_lkey_t)(2 << 8 | 1<<1)
#define kb_KeyLn              (kb_lkey_t)(2 << 8 | 1<<2)
#define kb_KeyLog             (kb_lkey_t)(2 << 8 | 1<<3)
#define kb_KeySquare          (kb_lkey_t)(2 << 8 | 1<<4)
#define kb_KeyRecip           (kb_lkey_t)(2 << 8 | 1<<5)
#define kb_KeyMath            (kb_lkey_t)(2 << 8 | 1<<6)
#define kb_KeyAlpha           (kb_lkey_t)(2 << 8 | 1<<7)

/* Keyboard group 3 */
#define kb_Key0               (kb_lkey_t)(3 << 8 | 1<<0)
#define kb_Key1               (kb_lkey_t)(3 << 8 | 1<<1)
#define kb_Key4               (kb_lkey_t)(3 << 8 | 1<<2)
#define kb_Key7               (kb_lkey_t)(3 << 8 | 1<<3)
#define kb_KeyComma           (kb_lkey_t)(3 << 8 | 1<<4)
#define kb_KeySin             (kb_lkey_t)(3 << 8 | 1<<5)
#define kb_KeyApps            (kb_lkey_t)(3 << 8 | 1<<6)
#define kb_KeyGraphVar        (kb_lkey_t)(3 << 8 | 1<<7)

/* Keyboard group 4 */
#define kb_KeyDecPnt          (kb_lkey_t)(4 << 8 | 1<<0)
#define kb_Key2               (kb_lkey_t)(4 << 8 | 1<<1)
#define kb_Key5               (kb_lkey_t)(4 << 8 | 1<<2)
#define kb_Key8               (kb_lkey_t)(4 << 8 | 1<<3)
#define kb_KeyLParen          (kb_lkey_t)(4 << 8 | 1<<4)
#define kb_KeyCos             (kb_lkey_t)(4 << 8 | 1<<5)
#define kb_KeyPrgm            (kb_lkey_t)(4 << 8 | 1<<6)
#define kb_KeyStat            (kb_lkey_t)(4 << 8 | 1<<7)

/* Keyboard group 5 */
#define kb_KeyChs            (kb_lkey_t)(5 << 8 | 1<<0)
#define kb_Key3              (kb_lkey_t)(5 << 8 | 1<<1)
#define kb_Key6              (kb_lkey_t)(5 << 8 | 1<<2)
#define kb_Key9              (kb_lkey_t)(5 << 8 | 1<<3)
#define kb_KeyRParen         (kb_lkey_t)(5 << 8 | 1<<4)
#define kb_KeyTan            (kb_lkey_t)(5 << 8 | 1<<5)
#define kb_KeyVars           (kb_lkey_t)(5 << 8 | 1<<6)

/* Keyboard group 6 */
#define kb_KeyEnter          (kb_lkey_t)(6 << 8 | 1<<0)
#define kb_KeyAdd            (kb_lkey_t)(6 << 8 | 1<<1)
#define kb_KeySub            (kb_lkey_t)(6 << 8 | 1<<2)
#define kb_KeyMul            (kb_lkey_t)(6 << 8 | 1<<3)
#define kb_KeyDiv            (kb_lkey_t)(6 << 8 | 1<<4)
#define kb_KeyPower          (kb_lkey_t)(6 << 8 | 1<<5)
#define kb_KeyClear          (kb_lkey_t)(6 << 8 | 1<<6)

/* Keyboard group 7 */
#define kb_KeyDown           (kb_lkey_t)(7 << 8 | 1<<0)
#define kb_KeyLeft           (kb_lkey_t)(7 << 8 | 1<<1)
#define kb_KeyRight          (kb_lkey_t)(7 << 8 | 1<<2)
#define kb_KeyUp             (kb_lkey_t)(7 << 8 | 1<<3)

/* Compatibility defines */
#define kb_DataArray ((uint16_t*)0xF50010)
#define kb_dataArray ((uint16_t*)0xF50010)
#define kb_Store 1<<1
#define kb_KeyPgrm kb_KeyPrgm
#define kb_group_0 0
#define kb_group_1 1
#define kb_group_2 2
#define kb_group_3 3
#define kb_group_4 4
#define kb_group_5 5
#define kb_group_6 6
#define kb_group_7 7

#ifdef __cplusplus
}
#endif

#endif