Debounce key releases (needs testing)
This commit is contained in:
parent
ae52109b13
commit
e85611736c
@ -1,3 +1,5 @@
|
|||||||
|
#include <mcs51/8052.h>
|
||||||
|
|
||||||
#include <arch/delay.h>
|
#include <arch/delay.h>
|
||||||
#include <board/kbc.h>
|
#include <board/kbc.h>
|
||||||
#include <board/kbscan.h>
|
#include <board/kbscan.h>
|
||||||
@ -18,6 +20,9 @@ void kbscan_init(void) {
|
|||||||
KSOLGOEN = 0;
|
KSOLGOEN = 0;
|
||||||
KSOHGCTRL = 0xFF;
|
KSOHGCTRL = 0xFF;
|
||||||
KSOHGOEN = 0;
|
KSOHGOEN = 0;
|
||||||
|
|
||||||
|
// Make sure timer 2 is stopped
|
||||||
|
T2CON = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kbscan_event(void) {
|
void kbscan_event(void) {
|
||||||
@ -25,6 +30,14 @@ void kbscan_event(void) {
|
|||||||
uint8_t layer = kbscan_layer;
|
uint8_t layer = kbscan_layer;
|
||||||
static uint8_t kbscan_last[KM_OUT] = { 0 };
|
static uint8_t kbscan_last[KM_OUT] = { 0 };
|
||||||
|
|
||||||
|
// If timer 2 is finished
|
||||||
|
if (TF2) {
|
||||||
|
// Stop timer 2 running
|
||||||
|
TR2 = 0;
|
||||||
|
// Clear timer 2 finished flag
|
||||||
|
TF2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < KM_OUT; i++) {
|
for (i = 0; i < KM_OUT; i++) {
|
||||||
// Set current line as output
|
// Set current line as output
|
||||||
@ -47,6 +60,26 @@ void kbscan_event(void) {
|
|||||||
bool new_b = new & (1 << j);
|
bool new_b = new & (1 << j);
|
||||||
bool last_b = last & (1 << j);
|
bool last_b = last & (1 << j);
|
||||||
if (new_b != last_b) {
|
if (new_b != last_b) {
|
||||||
|
// If timer 2 is running
|
||||||
|
if (TR2) {
|
||||||
|
// Debounce releases
|
||||||
|
if (!new_b) {
|
||||||
|
// Restore bit, so that this release can be handled later
|
||||||
|
new |= (1 << j);
|
||||||
|
// Skip processing of release
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Begin debouncing on press
|
||||||
|
if (new_b) {
|
||||||
|
// Run timer 2 for 20 ms
|
||||||
|
// 65536-(20000 * 69 + 89)/90 = 0xC419
|
||||||
|
TH2 = 0xC4;
|
||||||
|
TL2 = 0x19;
|
||||||
|
TR2 = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t key = keymap(i, j, kbscan_layer);
|
uint16_t key = keymap(i, j, kbscan_layer);
|
||||||
DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b);
|
DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b);
|
||||||
switch (key & KT_MASK) {
|
switch (key & KT_MASK) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user