А можно и попроще, в прерывании каждые N мс: if (Flags.Press){// было нажатие
if((GETBITP(1,K4)==0))RelCnt=KEY_DEFRELCNT;else if(--RelCnt==0)Flags.Press=0;
}else{// не было нажатия
if((GETBITP(1,K4)==0)){ // первое нажатие
if(GETBITP(2,K2)==0) KeyCode=KEY_TARA; else KeyCode=KEY_RESET;
RelCnt=KEY_DEFRELCNT;
Flags.Press=1;
Flags.KeyPressed=1;
}
}
Если клава матричная - чуть другой кусок, а на выходе тоже. Если нужно долгое нажатие, можно уже с периодичностью в многие сотни мс
if(Flags.Press){
if(++LongPressCnt==8){
LongPressCnt=0;
KeyCode|=0x80;
Flags.KeyPressed=1;
}
}else LongPressCnt=0;
А нужды в автоповторе пока не встречал, а возможные варианты интерфейса с ним отсекались еще на этапе проработки, как неудобные.