You should start with an input that has an internal pullup. The button should ground the input. The program should look for a transition from 1 to 0. Once it "sees" the transition it should wait for some tens of milliseconds and sample the input again. If it is still low then it is a valid push. Conversely if the 0 to 1 transition is detected then you should wait some tens of milliseconds and sample the input again to see if it has returned to the high state. There are many variations on the basic debounce algorithm but the idea is the same.
The next challenge is to figure out how to count two hours worth of timer ticks. For a counter of this length you want the slowest clock you can get. I'll consult the data sheet and get back to you with specific recommendations.
Edit:
It looks like you can use GP3 as an input with a pullup. You can use GP0 or GP1 as your output. If you want, you can make them complementary. Pins GP2, GP4, and GP5 are uncommitted at the moment. The supply voltage needs to be between 3.0 and 5.5 Volts.
Use the internal 4MHz. oscillator to save parts and select the MCLR connected to Vdd option. there are no interrupts and only two stack locations. In addition we need to keep the program less than 256 words so we dont have tor worry about PC bit 8 being cleared when there is a call or a goto.
The reset address is 0x1FF which picks up the oscillator calibration value with a movlw instruction and rolls over to address 0x000.
Let us run Timer0 from the internal oscillator, assign the prescaler to Timer0, and select the maximum prescaler value.
Code:
Oscillator Frequency f = 4 MHz.
Timer0 Input f/4 = 1 MHz.
Maximum Prescaler is divide by 256
Timer0 Input = 3.90625 kHz., Period = 256 microseconds
Timer0 Overflows every 65.536 milliseconds
Now two hours is 7200 seconds and so
This means we will need a seventeen bit counter to time out two hours