This routine is interrupt driven, and will detect either a short or long button press. It's return value is bit encoded and as such it is possible that both a long and short press can be detected. They are valid, since the press is debounced.
The code is not optimized, but written for...