diff options
author | root <root@new-selene.erebei.org> | 2015-12-01 02:10:53 +0000 |
---|---|---|
committer | root <root@new-selene.erebei.org> | 2015-12-01 02:10:53 +0000 |
commit | b55240eb43a92c552003b8b324a385e041f84f12 (patch) | |
tree | ab932136ecfaa42e1e417e0253aebcc5b5f178aa /app/keypad.c | |
parent | 061430973e82995368d27ff9081391f9475da3c7 (diff) | |
download | candlestick-b55240eb43a92c552003b8b324a385e041f84f12.tar.gz candlestick-b55240eb43a92c552003b8b324a385e041f84f12.tar.bz2 candlestick-b55240eb43a92c552003b8b324a385e041f84f12.zip |
fish
Diffstat (limited to 'app/keypad.c')
-rw-r--r-- | app/keypad.c | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/app/keypad.c b/app/keypad.c deleted file mode 100644 index d4a82db..0000000 --- a/app/keypad.c +++ /dev/null @@ -1,155 +0,0 @@ -#include "project.h" - -#define GPIO_CLOCK GPIOA -#define GPIO_DATA GPIOB -#define CLOCK GPIO5 -#define DATA GPIO11 - -#define KEYPAD_DELAY do { delay_us(1); } while (0) - - -#define SCAN_INTERVAL 73 -#define DEBOUNCE_INTERVAL 1 -#define DEBOUNCE_COUNT 3 - -static uint32_t next_scan; - - -uint16_t -keypad_raw_read (void) -{ - uint16_t ret = 0; - uint16_t c; - -/*Reset the state machine in the keypad */ - - gpio_set (GPIO_DATA, DATA); - KEYPAD_DELAY; - gpio_clear (GPIO_DATA, DATA); - KEYPAD_DELAY; - gpio_set (GPIO_DATA, DATA); - KEYPAD_DELAY; - - gpio_clear (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - - for (c = 0x8000; c; c >>= 1) - { - gpio_set (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - if (!(gpio_get (GPIO_DATA, DATA) & DATA)) - ret |= c; - gpio_clear (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - } - - gpio_set (GPIO_CLOCK, CLOCK); - - return ret; -} - -uint16_t -keypad_read (void) -{ - int c; - const uint8_t lut[] = "cdef89ab45670123"; - uint8_t ret = 0; - - - -/*Reset the state machine in the keypad */ - - gpio_set (GPIO_DATA, DATA); - KEYPAD_DELAY; - gpio_clear (GPIO_DATA, DATA); - KEYPAD_DELAY; - gpio_set (GPIO_DATA, DATA); - KEYPAD_DELAY; - - gpio_clear (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - - for (c = 0; c < 16; ++c) - { - gpio_set (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - if (!(gpio_get (GPIO_DATA, DATA) & DATA)) - ret = lut[c]; - gpio_clear (GPIO_CLOCK, CLOCK); - KEYPAD_DELAY; - } - - gpio_set (GPIO_CLOCK, CLOCK); - - return ret; -} - - -static void -keypad_scan (void) -{ - static uint8_t last_v; - static uint8_t key_down; - static int same; - uint8_t v; - - v = keypad_read (); - - next_scan = DEBOUNCE_INTERVAL; - - if (v!=last_v) { - last_v=v; - same=0; - return; - } else { - if (same<DEBOUNCE_COUNT) { - same++; - return; - } - } - - if (!v && !key_down) { - next_scan = SCAN_INTERVAL; - return; - } - - if (key_down==v) { - return; - } else if (key_down!=v) { - if (key_down) - key_event (key_down, 0); - key_down=v; - if (key_down) - key_event (key_down, 1); - } -} - - - - -void -keypad_tick (void) -{ - - if (!next_scan) - keypad_scan (); - else - next_scan--; - -} - - - - -void -keypad_init (void) -{ - - gpio_set_mode (GPIO_CLOCK, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, CLOCK); - gpio_set_mode (GPIO_DATA, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, DATA); - - - -} |