123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
-
- #define TIMER_COUNT 250
-
- #define KEY_COUNT 4
-
- #define TIMER_SCROLL 20
-
- enum {KN_DOWN =0, KN_UP =1, KN_PRESS=2 };
-
- typedef byte(KeyFunc)(void);
-
- typedef struct key_struct__
- {
- byte state;
- byte mask;
- byte pins;
- byte count;
- KeyFunc * exec_down;
- KeyFunc * exec_up;
- KeyFunc * exec_pres;
- }key_struct;
- static key_struct key_mass [KEY_COUNT] = {
-
- {KN_UP, PIN_KEY_MINUS, 0xFF,0x00, kn_empty, kn_minus_up ,kn_minus_up }
- ,{KN_UP, PIN_KEY_PLUS, 0xFF,0x00, kn_empty, kn_plus_up ,kn_plus_up }
- ,{KN_UP, PIN_KEY_SELECT, 0xFF,0x00, kn_empty, kn_select_up ,kn_empty }
- ,{KN_UP, PIN_KEY_ENTER, 0xFF,0x00, kn_empty, kn_empty ,kn_enter_press }
- };
- ISR(TIMER1_COMPA_vect)
- {
- #define Sta key->state
- #define Pin key->pins
- #define Cnt key->count
- #define Msk key->mask
- #define Down key->exec_down
- #define Up key->exec_up
- #define Pres key->exec_pres
- key_struct * key = key_mass;
- for(byte i=0; i< KEY_COUNT ; i++)
- {
- Pin *=2;
- if(KEY_PIN & Msk) Pin |= 0x01;
- if(Sta == KN_UP)
- {
- if(!Pin)
- {
- Down();
- Sta = KN_DOWN;
- Cnt = 0x00;
- }
- }
- else
- {
- if(Pin==0xFF)
- {
- if(Sta == KN_DOWN) Up();
- Sta = KN_UP;
- }
- else
- {
- if(Cnt <= TIMER_COUNT) ++Cnt;
- if(Cnt == TIMER_COUNT)
- {
- if(Pres()) Cnt = TIMER_COUNT - TIMER_SCROLL;
- else Sta = KN_PRESS;
- }
- }
- }
- key++;
- }
- }
|