А можно и попроще, в прерывании каждые 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;
 
А нужды в автоповторе пока не встречал, а возможные варианты интерфейса с ним отсекались еще на этапе проработки, как неудобные.