I prefer polling, especially if there is any chance of bounce or an indeterminate position (optical at 50%). I've looked at your code and can't see any reason for the double increment, as you say, it makes no sense. If you work out why it's happening please report back as I'm very curious.
Mike.
Mike.