ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
914588 Топик полностью
VLLV (07.04.2019 11:30, просмотров: 80) ответил Yurasvs на Вот.
Так и делаю иногда в реальной клавиатуре, но не для 256 отсчетов же.  void KbdService(void) // into timer interrupt 1 ms { if (prescaler<4) { prescaler++; return;} prescaler=0; switch (interrupt_counter) // to reduce time of function { case 0: interrupt_counter=1; //refresh statuses kbd_status3=kbd_status2; kbd_status2=kbd_status1; kbd_status1=kbd_status0; kbd_status0=Kbd; if (kbd_status0) pressed_keys|=0x80; interrupt_counter=interrupt_counter; break; case 1: interrupt_counter=2; //check pressed key every tic pressed_keys=kbd_status0&kbd_status1&kbd_status2; if (pressed_keys&(~kbd_status3)) if (bSound==SoundAlwaysOn) Beep(5,1); found_events|=pressed_keys&(~kbd_status3); // found edge if ((pressed_keys==kUp+kDn)&& // now this two keys ((~kbd_status3)&(kUp+kDn)))//and before it wasn't so {found_events|=kUpDn; // set new bit found_events&=~(kUp+kDn); break; } //reset usual bits if ((pressed_keys==kUp+kSt)&& // now this two keys ((~kbd_status3)&(kUp+kSt)))//and before it wasn't so {found_events|=kUpSt; // set new bit found_events&=~(kUp+kSt); break; }//reset usual bits if ((pressed_keys==kDn+kSt)&& // now this two keys ((~kbd_status3)&(kDn+kSt)))//and before it wasn't so {found_events|=kDnSt; // set new bit found_events&=~(kDn+kSt); break; } //reset usual bits break; case 2: interrupt_counter=3; //check if key the same as before if ((pressed_keys&kUp)||(pressed_keys&kDn)) //key for repeat { if (pressed_keys==old_pressed_keys) // same key? { if (pressed_counter) // yes, time over? { pressed_counter--; //No } else { pressed_counter=NextDelay; //Yes found_events=pressed_keys; //reset if (same_key_counter>15) { speed=30; } else { same_key_counter++; speed=5; } } } else // other key { pressed_counter=StartDelay; speed=1; same_key_counter=0; } } else { speed=1; same_key_counter=0; } old_pressed_keys=pressed_keys; break; case 3: interrupt_counter++; break; default: interrupt_counter=0; } }