/* scan all key states on matrix */ | /* scan all key states on matrix */ | ||||
uint8_t matrix_scan(void); | uint8_t matrix_scan(void); | ||||
/* whether modified from previous scan. used after matrix_scan. */ | /* whether modified from previous scan. used after matrix_scan. */ | ||||
bool matrix_is_modified(void); | |||||
bool matrix_is_modified(void) __attribute__ ((deprecated)); | |||||
/* whether a swtich is on */ | /* whether a swtich is on */ | ||||
bool matrix_is_on(uint8_t row, uint8_t col); | bool matrix_is_on(uint8_t row, uint8_t col); | ||||
/* matrix state on row */ | /* matrix state on row */ |
static uint8_t debouncing = DEBOUNCE; | static uint8_t debouncing = DEBOUNCE; | ||||
/* matrix state(1:on, 0:off) */ | /* matrix state(1:on, 0:off) */ | ||||
static uint16_t *matrix; | |||||
static uint16_t *matrix_debouncing; | |||||
static uint16_t matrix0[MATRIX_ROWS]; | |||||
static uint16_t matrix1[MATRIX_ROWS]; | |||||
static bool is_modified; | |||||
static matrix_row_t *matrix; | |||||
static matrix_row_t *matrix_debouncing; | |||||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||||
static uint16_t read_cols(void); | |||||
static matrix_row_t read_cols(void); | |||||
static void init_cols(void); | static void init_cols(void); | ||||
static void unselect_rows(void); | static void unselect_rows(void); | ||||
static void select_row(uint8_t row); | static void select_row(uint8_t row); | ||||
matrix[i] = 0; | matrix[i] = 0; | ||||
matrix_debouncing[i] = 0; | matrix_debouncing[i] = 0; | ||||
} | } | ||||
is_modified = false; | |||||
} | } | ||||
uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||
{ | { | ||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
//unselect_rows(); | |||||
select_row(i); | select_row(i); | ||||
_delay_us(30); // without this wait read unstable value. | _delay_us(30); // without this wait read unstable value. | ||||
uint16_t cols = read_cols(); | |||||
matrix_row_t cols = read_cols(); | |||||
if (matrix_debouncing[i] != cols) { | if (matrix_debouncing[i] != cols) { | ||||
matrix_debouncing[i] = cols; | matrix_debouncing[i] = cols; | ||||
if (debouncing) { | if (debouncing) { | ||||
debug("bounce!: "); debug_hex(debouncing); debug("\n"); | debug("bounce!: "); debug_hex(debouncing); debug("\n"); | ||||
} | } | ||||
debouncing = DEBOUNCE; | debouncing = DEBOUNCE; | ||||
is_modified = false; | |||||
} | } | ||||
unselect_rows(); | unselect_rows(); | ||||
} | } | ||||
//unselect_rows(); | |||||
if (debouncing) { | if (debouncing) { | ||||
debouncing--; | |||||
_delay_ms(1); | |||||
} else { | |||||
uint16_t *tmp = matrix; | |||||
matrix = matrix_debouncing; | |||||
matrix_debouncing = tmp; | |||||
is_modified = true; | |||||
if (--debouncing) { | |||||
_delay_ms(1); | |||||
} else { | |||||
matrix_row_t *tmp = matrix; | |||||
matrix = matrix_debouncing; | |||||
matrix_debouncing = tmp; | |||||
} | |||||
} | } | ||||
return 1; | return 1; | ||||
bool matrix_is_modified(void) | bool matrix_is_modified(void) | ||||
{ | { | ||||
return is_modified; | |||||
} | |||||
inline | |||||
bool matrix_has_ghost(void) | |||||
{ | |||||
return false; | |||||
if (debouncing) return false; | |||||
return true; | |||||
} | } | ||||
inline | inline | ||||
} | } | ||||
inline | inline | ||||
uint16_t matrix_get_row(uint8_t row) | |||||
matrix_row_t matrix_get_row(uint8_t row) | |||||
{ | { | ||||
return matrix[row]; | return matrix[row]; | ||||
} | } | ||||
PORTB |= (1<<6 | 1<< 5 | 1<<4 | 1<<3 | 1<<1 | 1<<0); | PORTB |= (1<<6 | 1<< 5 | 1<<4 | 1<<3 | 1<<1 | 1<<0); | ||||
} | } | ||||
static uint16_t read_cols(void) | |||||
static matrix_row_t read_cols(void) | |||||
{ | { | ||||
return (PINF&(1<<0) ? 0 : (1<<0)) | | return (PINF&(1<<0) ? 0 : (1<<0)) | | ||||
(PINF&(1<<1) ? 0 : (1<<1)) | | (PINF&(1<<1) ? 0 : (1<<1)) | |
#define DEVICE_VER 0x0100 | #define DEVICE_VER 0x0100 | ||||
#define PRODUCT Happy Buckling Keyboard | #define PRODUCT Happy Buckling Keyboard | ||||
#define DESCRIPTION mod version of IBM Model M keyboard | #define DESCRIPTION mod version of IBM Model M keyboard | ||||
/* matrix size */ | /* matrix size */ | ||||
#define MATRIX_ROWS 12 | #define MATRIX_ROWS 12 | ||||
#define MATRIX_COLS 8 | #define MATRIX_COLS 8 | ||||
/* define if matrix has ghost */ | /* define if matrix has ghost */ | ||||
#define MATRIX_HAS_GHOST | #define MATRIX_HAS_GHOST | ||||
/* Set 0 if need no debouncing */ | /* Set 0 if need no debouncing */ | ||||
#define DEBOUNCE 10 | #define DEBOUNCE 10 | ||||
/* legacy keymap support */ | |||||
#define USE_LEGACY_KEYMAP | |||||
/* key combination for command */ | /* key combination for command */ | ||||
#define IS_COMMAND() ( \ | #define IS_COMMAND() ( \ | ||||
keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ | keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ | ||||
) | ) | ||||
/* mouse keys */ | |||||
#ifdef MOUSEKEY_ENABLE | |||||
# define MOUSEKEY_DELAY_TIME 128 | |||||
#endif | |||||
/* Boot Section Size in *BYTEs* | |||||
* Teensy halfKay 512 | |||||
* Teensy++ halfKay 1024 | |||||
* Atmel DFU loader 4096 | |||||
* LUFA bootloader 4096 | |||||
* USBaspLoader 2048 | |||||
*/ | |||||
#define BOOTLOADER_SIZE 4096 | |||||
#endif | #endif |
* COL: PD0-7 | * COL: PD0-7 | ||||
* ROW: PB0-7, PF4-7 | * ROW: PB0-7, PF4-7 | ||||
*/ | */ | ||||
#if (MATRIX_COLS > 16) | |||||
# error "MATRIX_COLS must not exceed 16" | |||||
#endif | |||||
#if (MATRIX_ROWS > 255) | |||||
# error "MATRIX_ROWS must not exceed 255" | |||||
#endif | |||||
#ifndef DEBOUNCE | #ifndef DEBOUNCE | ||||
# define DEBOUNCE 0 | |||||
# define DEBOUNCE 10 | |||||
#endif | #endif | ||||
static uint8_t debouncing = DEBOUNCE; | static uint8_t debouncing = DEBOUNCE; | ||||
// matrix state buffer(1:on, 0:off) | // matrix state buffer(1:on, 0:off) | ||||
#if (MATRIX_COLS <= 8) | |||||
static uint8_t *matrix; | static uint8_t *matrix; | ||||
static uint8_t *matrix_prev; | |||||
static uint8_t _matrix0[MATRIX_ROWS]; | |||||
static uint8_t _matrix1[MATRIX_ROWS]; | |||||
#else | |||||
static uint16_t *matrix; | |||||
static uint16_t *matrix_prev; | |||||
static uint16_t _matrix0[MATRIX_ROWS]; | |||||
static uint16_t _matrix1[MATRIX_ROWS]; | |||||
#endif | |||||
static uint8_t *matrix_debouncing; | |||||
static uint8_t matrix0[MATRIX_ROWS]; | |||||
static uint8_t matrix1[MATRIX_ROWS]; | |||||
#ifdef MATRIX_HAS_GHOST | #ifdef MATRIX_HAS_GHOST | ||||
static bool matrix_has_ghost_in_row(uint8_t row); | static bool matrix_has_ghost_in_row(uint8_t row); | ||||
PORTD = 0xFF; | PORTD = 0xFF; | ||||
// initialize matrix state: all keys off | // initialize matrix state: all keys off | ||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||||
matrix = _matrix0; | |||||
matrix_prev = _matrix1; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix0[i] = 0x00; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix1[i] = 0x00; | |||||
matrix = matrix0; | |||||
matrix_debouncing = matrix1; | |||||
} | } | ||||
uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||
{ | { | ||||
if (!debouncing) { | |||||
uint8_t *tmp = matrix_prev; | |||||
matrix_prev = matrix; | |||||
matrix = tmp; | |||||
} | |||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
unselect_rows(); | |||||
select_row(i); | select_row(i); | ||||
_delay_us(30); // without this wait read unstable value. | _delay_us(30); // without this wait read unstable value. | ||||
if (matrix[i] != (uint8_t)~read_col()) { | |||||
matrix[i] = (uint8_t)~read_col(); | |||||
if (matrix_debouncing[i] != read_col()) { | |||||
matrix_debouncing[i] = read_col(); | |||||
if (debouncing) { | if (debouncing) { | ||||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | |||||
debug("bounce!: "); debug_hex(debouncing); debug("\n"); | |||||
} | } | ||||
_delay_ms(1); // TODO: work around. HAHAHAHAHAAHA | |||||
debouncing = DEBOUNCE; | debouncing = DEBOUNCE; | ||||
} | } | ||||
unselect_rows(); | |||||
} | } | ||||
unselect_rows(); | |||||
if (debouncing) { | if (debouncing) { | ||||
debouncing--; | |||||
if (--debouncing) { | |||||
_delay_ms(1); | |||||
} else { | |||||
uint8_t *tmp = matrix; | |||||
matrix = matrix_debouncing; | |||||
matrix_debouncing = tmp; | |||||
} | |||||
} | } | ||||
return 1; | return 1; | ||||
bool matrix_is_modified(void) | bool matrix_is_modified(void) | ||||
{ | { | ||||
if (debouncing) return false; | if (debouncing) return false; | ||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||||
if (matrix[i] != matrix_prev[i]) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
return true; | |||||
} | } | ||||
inline | inline | ||||
inline | inline | ||||
static uint8_t read_col(void) | static uint8_t read_col(void) | ||||
{ | { | ||||
return PIND; | |||||
return ~PIND; | |||||
} | } | ||||
inline | inline |
/* Set 0 if need no debouncing */ | /* Set 0 if need no debouncing */ | ||||
#define DEBOUNCE 8 | #define DEBOUNCE 8 | ||||
/* legacy keymap support */ | |||||
#define USE_LEGACY_KEYMAP | |||||
/* key combination for command */ | /* key combination for command */ | ||||
#define IS_COMMAND() ( \ | #define IS_COMMAND() ( \ | ||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | ||||
) | ) | ||||
/* Boot Section Size in *BYTEs* | |||||
* Teensy halfKay 512 | |||||
* Teensy++ halfKay 1024 | |||||
* Atmel DFU loader 4096 | |||||
* LUFA bootloader 4096 | |||||
* USBaspLoader 2048 | |||||
*/ | |||||
#define BOOTLOADER_SIZE 4096 | |||||
// TODO: configurable | // TODO: configurable | ||||
#define DEBUG_LED 0 | #define DEBUG_LED 0 | ||||
#define DEBUG_LED_CONFIG | #define DEBUG_LED_CONFIG |
if (debouncing) { | if (debouncing) { | ||||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | debug("bounce!: "); debug_hex(debouncing); print("\n"); | ||||
} | } | ||||
_delay_ms(1); // improved affect on bouncing | |||||
debouncing = DEBOUNCE; | debouncing = DEBOUNCE; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
if (debouncing) { | if (debouncing) { | ||||
_delay_ms(1); | |||||
debouncing--; | debouncing--; | ||||
} | } | ||||
#define MANUFACTURER t.m.k. | #define MANUFACTURER t.m.k. | ||||
#define PRODUCT Macway mod | #define PRODUCT Macway mod | ||||
/* message strings */ | /* message strings */ | ||||
#define DESCRIPTION t.m.k. keyboard firmware for Macway mod | #define DESCRIPTION t.m.k. keyboard firmware for Macway mod | ||||
/* matrix size */ | /* matrix size */ | ||||
#define MATRIX_ROWS 9 | #define MATRIX_ROWS 9 | ||||
#define MATRIX_COLS 8 | #define MATRIX_COLS 8 | ||||
/* define if matrix has ghost */ | /* define if matrix has ghost */ | ||||
#define MATRIX_HAS_GHOST | #define MATRIX_HAS_GHOST | ||||
/* Set 0 if need no debouncing */ | /* Set 0 if need no debouncing */ | ||||
#define DEBOUNCE 5 | #define DEBOUNCE 5 | ||||
/* legacy keymap support */ | |||||
#define USE_LEGACY_KEYMAP | |||||
/* key combination for command */ | /* key combination for command */ | ||||
#define IS_COMMAND() ( \ | #define IS_COMMAND() ( \ | ||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | ||||
) | ) | ||||
/* layer switching */ | |||||
#define LAYER_SWITCH_DELAY 100 | |||||
#define LAYER_SEND_FN_TERM 300 | |||||
/* mouse keys */ | |||||
#ifdef MOUSEKEY_ENABLE | |||||
# define MOUSEKEY_DELAY_TIME 192 | |||||
#endif | |||||
/* Boot Section Size in *BYTEs* | |||||
* Teensy halfKay 512 | |||||
* Teensy++ halfKay 1024 | |||||
* Atmel DFU loader 4096 | |||||
* LUFA bootloader 4096 | |||||
* USBaspLoader 2048 | |||||
*/ | |||||
#define BOOTLOADER_SIZE 4096 | |||||
/* PS/2 mouse */ | /* PS/2 mouse */ | ||||
#ifdef PS2_MOUSE_ENABLE | #ifdef PS2_MOUSE_ENABLE |
#ifndef DEBOUNCE | #ifndef DEBOUNCE | ||||
# define DEBOUNCE 0 | |||||
# define DEBOUNCE 5 | |||||
#endif | #endif | ||||
static uint8_t debouncing = DEBOUNCE; | static uint8_t debouncing = DEBOUNCE; | ||||
// matrix state buffer(1:on, 0:off) | // matrix state buffer(1:on, 0:off) | ||||
#if (MATRIX_COLS <= 8) | |||||
static uint8_t *matrix; | |||||
static uint8_t *matrix_prev; | |||||
static uint8_t _matrix0[MATRIX_ROWS]; | |||||
static uint8_t _matrix1[MATRIX_ROWS]; | |||||
#else | |||||
static uint16_t *matrix; | |||||
static uint16_t *matrix_prev; | |||||
static uint16_t _matrix0[MATRIX_ROWS]; | |||||
static uint16_t _matrix1[MATRIX_ROWS]; | |||||
#endif | |||||
static matrix_row_t *matrix; | |||||
static matrix_row_t *matrix_debouncing; | |||||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||||
#ifdef MATRIX_HAS_GHOST | #ifdef MATRIX_HAS_GHOST | ||||
static bool matrix_has_ghost_in_row(uint8_t row); | static bool matrix_has_ghost_in_row(uint8_t row); | ||||
#endif | #endif | ||||
static uint8_t read_col(void); | |||||
static matrix_row_t read_col(void); | |||||
static void unselect_rows(void); | static void unselect_rows(void); | ||||
static void select_row(uint8_t row); | static void select_row(uint8_t row); | ||||
PORTB = 0xFF; | PORTB = 0xFF; | ||||
// initialize matrix state: all keys off | // initialize matrix state: all keys off | ||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||||
matrix = _matrix0; | |||||
matrix_prev = _matrix1; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||||
matrix0[i] = 0; | |||||
matrix1[i] = 0; | |||||
} | |||||
matrix = matrix0; | |||||
matrix_debouncing = matrix1; | |||||
} | } | ||||
uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||
{ | { | ||||
if (!debouncing) { | |||||
uint8_t *tmp = matrix_prev; | |||||
matrix_prev = matrix; | |||||
matrix = tmp; | |||||
} | |||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
unselect_rows(); | unselect_rows(); | ||||
select_row(i); | select_row(i); | ||||
_delay_us(30); // without this wait read unstable value. | _delay_us(30); // without this wait read unstable value. | ||||
if (matrix[i] != (uint8_t)~read_col()) { | |||||
matrix[i] = (uint8_t)~read_col(); | |||||
if (matrix[i] != read_col()) { | |||||
matrix[i] = read_col(); | |||||
if (debouncing) { | if (debouncing) { | ||||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | debug("bounce!: "); debug_hex(debouncing); print("\n"); | ||||
} | } | ||||
unselect_rows(); | unselect_rows(); | ||||
if (debouncing) { | if (debouncing) { | ||||
debouncing--; | |||||
if (--debouncing) { | |||||
_delay_ms(1); | |||||
} else { | |||||
matrix_row_t *tmp = matrix; | |||||
matrix = matrix_debouncing; | |||||
matrix_debouncing = tmp; | |||||
} | |||||
} | } | ||||
return 1; | return 1; | ||||
bool matrix_is_modified(void) | bool matrix_is_modified(void) | ||||
{ | { | ||||
if (debouncing) return false; | if (debouncing) return false; | ||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||||
if (matrix[i] != matrix_prev[i]) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
inline | |||||
bool matrix_has_ghost(void) | |||||
{ | |||||
#ifdef MATRIX_HAS_GHOST | |||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||||
if (matrix_has_ghost_in_row(i)) | |||||
return true; | |||||
} | |||||
#endif | |||||
return false; | |||||
return true; | |||||
} | } | ||||
inline | inline | ||||
} | } | ||||
inline | inline | ||||
#if (MATRIX_COLS <= 8) | |||||
uint8_t matrix_get_row(uint8_t row) | |||||
#else | |||||
uint16_t matrix_get_row(uint8_t row) | |||||
#endif | |||||
matrix_row_t matrix_get_row(uint8_t row) | |||||
{ | { | ||||
return matrix[row]; | return matrix[row]; | ||||
} | } | ||||
#endif | #endif | ||||
inline | inline | ||||
static uint8_t read_col(void) | |||||
static matrix_row_t read_col(void) | |||||
{ | { | ||||
return PINB; | |||||
return ~PINB; | |||||
} | } | ||||
inline | inline |
#define MANUFACTURER t.m.k. | #define MANUFACTURER t.m.k. | ||||
#define PRODUCT Phantom | #define PRODUCT Phantom | ||||
/* message strings */ | /* message strings */ | ||||
#define DESCRIPTION t.m.k. keyboard firmware for Phantom | #define DESCRIPTION t.m.k. keyboard firmware for Phantom | ||||
/* matrix size */ | /* matrix size */ | ||||
#define MATRIX_ROWS 6 | #define MATRIX_ROWS 6 | ||||
#define MATRIX_COLS 17 | #define MATRIX_COLS 17 | ||||
/* Set 0 if need no debouncing */ | /* Set 0 if need no debouncing */ | ||||
#define DEBOUNCE 7 | #define DEBOUNCE 7 | ||||
/* legacy keymap support */ | |||||
#define USE_LEGACY_KEYMAP | |||||
/* key combination for command */ | /* key combination for command */ | ||||
#define IS_COMMAND() ( \ | #define IS_COMMAND() ( \ | ||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | ||||
) | ) | ||||
/* Boot Section Size in *BYTEs* | |||||
* Teensy halfKay 512 | |||||
* Teensy++ halfKay 1024 | |||||
* Atmel DFU loader 4096 | |||||
* LUFA bootloader 4096 | |||||
* USBaspLoader 2048 | |||||
*/ | |||||
#define BOOTLOADER_SIZE 4096 | |||||
// TODO: configurable | // TODO: configurable | ||||
#define DEBUG_LED 0 | #define DEBUG_LED 0 | ||||
#define DEBUG_LED_CONFIG | #define DEBUG_LED_CONFIG |
// bit array of key state(1:on, 0:off) | // bit array of key state(1:on, 0:off) | ||||
static matrix_row_t *matrix; | static matrix_row_t *matrix; | ||||
static matrix_row_t *matrix_debounced; | static matrix_row_t *matrix_debounced; | ||||
static matrix_row_t _matrix0[MATRIX_ROWS]; | |||||
static matrix_row_t _matrix1[MATRIX_ROWS]; | |||||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||||
#define _DDRA (uint8_t *const)&DDRA | #define _DDRA (uint8_t *const)&DDRA | ||||
setup_leds(); | setup_leds(); | ||||
// initialize matrix state: all keys off | // initialize matrix state: all keys off | ||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||||
matrix = _matrix0; | |||||
matrix_debounced = _matrix1; | |||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||||
matrix0[i] = 0; | |||||
matrix1[i] = 0; | |||||
} | |||||
matrix = matrix0; | |||||
matrix_debounced = matrix1; | |||||
} | } | ||||
uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||
{ | { | ||||
if (!debouncing) { | |||||
matrix_row_t *tmp = matrix_debounced; | |||||
matrix_debounced = matrix; | |||||
matrix = tmp; | |||||
} | |||||
for (uint8_t col = 0; col < MATRIX_COLS; col++) { // 0-16 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { // 0-16 | ||||
pull_column(col); // output hi on theline | pull_column(col); // output hi on theline | ||||
_delay_us(3); // without this wait it won't read stable value. | _delay_us(3); // without this wait it won't read stable value. | ||||
} | } | ||||
if (debouncing) { | if (debouncing) { | ||||
debouncing--; | |||||
if (--debouncing) { | |||||
_delay_ms(1); | |||||
} else { | |||||
matrix_row_t *tmp = matrix_debounced; | |||||
matrix_debounced = matrix; | |||||
matrix = tmp; | |||||
} | |||||
} | } | ||||
return 1; | return 1; | ||||
return true; | return true; | ||||
} | } | ||||
inline | |||||
bool matrix_has_ghost(void) | |||||
{ | |||||
return false; | |||||
} | |||||
inline | inline | ||||
bool matrix_is_on(uint8_t row, uint8_t col) | bool matrix_is_on(uint8_t row, uint8_t col) | ||||
{ | { |