keypadc.h
#include <keypadc.h>
The keypadc library is used for quickly polling the status of the keys in the keypad.
It supports multi-key presses, and can be used for extremely responsive input compared to OS routines such as os_GetCSC()
.
Helpful key dection
Handling key detection properly is a major requirement for a lot of programs. Detecting a hold can be rather straightforward, but things like a press, release, can sometimes be rather confusing at first.
Detecting a single press
When a key is first pressed, we only want to trigger on that event. The following code sets up a simple rising edge detector to catch this.
bool key, prevkey;
key = kb_Data[1] == kb_2nd;
if (key && !prevkey) {
// ...
}
prevkey = key;
Detecting a single release
When a key is released we only want to trigger on that event. The following code sets up a simple falling edge detector to catch this.
bool key, prevkey;
key = kb_Data[1] == kb_2nd;
if (!key && prevkey) {
// ...
}
prevkey = key;
API Documentation
keypadc is a simple direct-input keypad library.
- Author
Matt “MateoConLechuga” Waltz
- Author
Shaun “Merthsoft” McFall
Defines
-
kb_SetMode(mode)
Sets the keypad scanning mode.
See also
-
kb_GetMode()
Gets the keypad scanning mode.
See also
-
kb_EnableInt
Enabled keypad interrupt signals.
-
kb_IntAcknowledge
Acknowledege keypad interrupt signals.
-
kb_IntStatus
Status of keypad interrupt signals.
-
kb_Config
Configuration of keypad controller.
-
kb_IsDown(lkey)
Checks if a key is pressed. This uses the long key type, which includes the group as well. It can be used in place of reading directly from
kb_Data
.Long key types have the same name as the normal key types, but are prefixed with kb_Key* rather than kb_*.
-
kb_Data
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 as a normal array. For example, to check the status of the ‘2nd’ key:
if (kb_Data[1] & kb_2nd) { ... }
See also
-
kb_On
ON key signal.
Note
Scanning mode does not matter.
Note
The ON key is not wired as part of the normal key matrix. The ON key must be checked separately from the other keys with kb_On:
int main(void) { kb_DisableOnLatch(); ... if (kb_On) { ... } }
-
kb_EnableOnLatch()
Causes kb_On to latch when the ON is key pressed: once the ON key is pressed, kb_On will remain true until reset with kb_ClearOnLatch(). This may be useful if you want to check the ON key occasionally, for example as a break signal.
See also
Warning
This defaults to whatever the last program set this to, so be sure to set it explicitly.
-
kb_DisableOnLatch()
Disables ON key latching behavior.
See also
Warning
This defaults to whatever the last program set this to, so be sure to set it explicitly.
-
kb_ClearOnLatch()
When ON key latching has been enabled with kb_EnableOnLatch(), this will reset kb_On back to false (assuming the user is no longer pressing ON).
See also
Note
This may persist between program runs, so be to sure to disable as needed.
Enums
-
enum kb_scan_mode_t
Different available scanning modes.
Values:
-
enumerator MODE_0_IDLE = 0
Keypad scanning is idle.
-
enumerator MODE_1_INDISCRIMINATE
Indiscriminate key detection. Data registers are invalid, but when any key is pressed, interrupt KB_MODE_1_PRESS is set (and cannot be cleared until the key is released).
-
enumerator MODE_2_SINGLE
Single scan. The keypad is scanned once, and then the mode returns to MODE_0_IDLE.
-
enumerator MODE_3_CONTINUOUS
Continuous scan. When scanning completes, it just starts over again after a delay.
-
enumerator MODE_0_IDLE = 0
-
enum kb_int_signal_t
Different available interrupt signals
Values:
-
enumerator KB_SCAN_COMPLETE = 1
Interrupt set when keypad is done scanning
-
enumerator KB_DATA_CHANGED = 2
Interrupt set when data is changed on a press or a release
-
enumerator KB_MODE_1_PRESS = 4
Interrupt set when a key is pressed in MODE_1_INDISCRIMINATE
-
enumerator KB_SCAN_COMPLETE = 1
Functions
-
void kb_Scan(void)
Scans the keyboard to update data values.
Note
Disables interrupts.
-
kb_key_t kb_ScanGroup(uint8_t row)
Scans the given keyboard row and returns the row value.
Note
Disables interrupts.
- Parameters
row – Row to scan.
-
uint8_t kb_AnyKey(void)
Scans the keyboard quickly to tell if any key was pressed.
Note
Disables interrupts.
-
void kb_Reset(void)
Resets the keyboard before returning to the OS.
Note
Only use if the keyboard timers or number of rows have been modified.