diff --git a/debounce.c b/debounce.c new file mode 100644 index 0000000..deb269c --- /dev/null +++ b/debounce.c @@ -0,0 +1,43 @@ +#include +#include "debounce.h" +#include "ptimer.h" + +void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN, + uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait, + void (*push_proc)(void), void (*rep_proc)(void) ) { + + enum {idle, debounce, go_rep, wait_rep, rep}; + + if(!rep_time) rep_time=20; + if(!rep_wait) rep_wait=150; + + uint8_t key_press = !(*KPIN & key_mask); + + if( key_press && !*key_state ) { + *key_state = debounce; + timers[TIM_DEBOUNCE] = 15; + } else + if( *key_state ) { + + if( key_press && debounce==*key_state && !timers[TIM_DEBOUNCE] ) { + *key_state = 2; + timers[TIM_DEBOUNCE]=5; + } else + if( !key_press && *key_state>1 && *key_state<4 ) { + if(push_proc) push_proc(); /* KEY_UP */ + *key_state=idle; + } else + if( key_press && go_rep==*key_state && !timers[TIM_DEBOUNCE] ) { + *key_state = wait_rep; + timers[TIM_DEBOUNCE]=rep_wait; + } else + if( key_press && wait_rep==*key_state && !timers[TIM_DEBOUNCE] ) { + *key_state = rep; + } else + if( key_press && rep==*key_state && !timers[TIM_DEBOUNCE] ) { + timers[TIM_DEBOUNCE] = rep_time; + if(rep_proc) rep_proc(); /* KEY_REP */ + } + } + if( *key_state>=3 && !key_press ) *key_state = idle; +} \ No newline at end of file diff --git a/debounce.h b/debounce.h new file mode 100644 index 0000000..25402b2 --- /dev/null +++ b/debounce.h @@ -0,0 +1,36 @@ +#ifndef __DEBOUNCE_H__ +#define __DEBOUNCE_H__ + + +/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy *************** + * AUTOR: Mirosław Kardaś + * ZALETY: + * - nie wprowadza najmniejszego spowalnienia + * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku) + * - można przydzielić róne akcje dla trybu REPEAT i pojedynczego kliknięcia + * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL) + * + * Wymagania: + * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz) + * + * Parametry wejściowe: + * + * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt) - do przechowywania stanu klawisza + * *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB + * key_mask - maska klawisza np: (1< +#include "keyboard.h" +#include "debounce.h" +#include "rtc.h" +#include "led.h" + +uint8_t k_inc_hour, k_inc_minute, k_inc_second; + +void inc_hour(void) +{ + led_hour = (led_hour + 1) % 24; + rtc_set_time(HOUR, led_hour); +} + +void inc_minute(void) +{ + led_minute = (led_minute + 1) % 60; + rtc_set_time(MINUTE, led_minute); +} + +void inc_second(void) +{ + led_second = (led_second + 1) % 60; + rtc_set_time(SECOND, led_second); +} + +void keyboard_init(void) +{ + KEYBOARD_DIR &= ~(KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND); + PORTB |= KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND; +} + +void keyboard_handle_input(void) +{ + SuperDebounce(&k_inc_hour, &KEYBOARD_PIN, KEY_INC_HOUR, 20, 500, &inc_hour, &inc_hour); + SuperDebounce(&k_inc_minute, &KEYBOARD_PIN, KEY_INC_MINUTE, 20, 500, &inc_minute, &inc_minute); + SuperDebounce(&k_inc_second, &KEYBOARD_PIN, KEY_INC_SECOND, 20, 500, &inc_second, &inc_second); +} \ No newline at end of file diff --git a/keyboard.h b/keyboard.h new file mode 100644 index 0000000..ffb139e --- /dev/null +++ b/keyboard.h @@ -0,0 +1,14 @@ +#ifndef __KEYBOARD_H__ +#define __KEYBOARD_H__ + +#define KEYBOARD_DIR DDRB +#define KEYBOARD_PIN PINB +#define KEYBOARD_PORT PORTB +#define KEY_INC_HOUR (1< #include +#include "keyboard.h" #include "ptimer.h" #include "i2c.h" #include "rtc.h" #include "led.h" #define I2C_BITRATE 100000UL // 100kHz -#define RTC_I2C_ADDR 0xA2 - int main() { + keyboard_init(); ptimer_init(); i2c_init(I2C_BITRATE); rtc_int0_init(); @@ -20,17 +20,17 @@ int main() led_hour = 0; led_minute = 0; - led_second = 0; + led_second = 0; while(1) { - + keyboard_handle_input(); } } ISR(INT0_vect) { - struct time curr_time = rtc_read_time(RTC_I2C_ADDR); + struct time curr_time = rtc_read_time(); led_hour = curr_time.hour; led_minute = curr_time.minute; led_second = curr_time.second; diff --git a/ptimer.h b/ptimer.h index d22e284..338a64e 100644 --- a/ptimer.h +++ b/ptimer.h @@ -1,7 +1,8 @@ #ifndef __PTIMER_H__ #define __PTIMER_H__ -#define TIMERS_COUNT 0 +#define TIMERS_COUNT 1 +#define TIM_DEBOUNCE 0 extern volatile uint16_t timers[TIMERS_COUNT];