4 #include <avr/interrupt.h>
\r
8 // debounced and inverted key state, bit = 1: key pressed
\r
9 volatile uint8_t key_io_state;
\r
11 volatile uint8_t key_io_press;
\r
12 // key long press and repeat
\r
13 volatile uint8_t key_io_rpt;
\r
15 void key_io_init(void)
\r
17 KEY_IO_KEYSA_DDR &= ~(
\r
18 (1<<KEY_IO_KEYA1_BIT) | (1<<KEY_IO_KEYA2_BIT) |
\r
19 (1<<KEY_IO_KEYA3_BIT) | (1<<KEY_IO_KEYA4_BIT) );
\r
20 KEY_IO_KEYSB_DDR &= ~(1<<KEY_IO_KEYB1_BIT);
\r
21 // external pull-ups avail. for all keys -> no init here
\r
22 key_io_state = key_io_state_hardware();
\r
25 uint8_t key_io_get_press( uint8_t key_mask )
\r
32 key_mask &= key_io_press; // read key(s)
\r
33 key_io_press ^= key_mask; // clear key(s)
\r
40 uint8_t key_io_get_rpt( uint8_t key_mask )
\r
47 key_mask &= key_io_rpt; // read key(s)
\r
48 key_io_rpt ^= key_mask; // clear key(s)
\r
55 uint8_t key_io_get_was_short( uint8_t key_mask )
\r
60 // read key state and key press atomic !
\r
63 ret = key_io_get_press( ~key_io_state & key_mask );
\r
71 uint8_t key_io_get_longpress( uint8_t key_mask )
\r
73 return key_io_get_press( key_io_get_rpt( key_mask ));
\r